---
openapi: 3.1.0
info:
  description: |-
    You're looking at the current **stable** documentation of the OpenProject APIv3. If you're interested in the current
    development version, please go to [github.com/opf](https://github.com/opf/openproject/tree/dev/docs/api/apiv3).

    ## Introduction

    The documentation for the APIv3 is written according to the [OpenAPI 3.1 Specification](https://swagger.io/specification/).
    You can either view the static version of this documentation on the [website](https://www.openproject.org/docs/api/introduction/)
    or the interactive version, rendered with [OpenAPI Explorer](https://github.com/Rhosys/openapi-explorer/blob/main/README.md),
    in your OpenProject installation under `/api/docs`.
    In the latter you can try out the various API endpoints directly interacting with our OpenProject data.
    Moreover you can access the specification source itself under `/api/v3/spec.json` and `/api/v3/spec.yml`
    (e.g. [here](https://community.openproject.org/api/v3/spec.yml)).

    The APIv3 is a hypermedia REST API, a shorthand for "Hypermedia As The Engine Of Application State" (HATEOAS).
    This means that each endpoint of this API will have links to other resources or actions defined in the resulting body.

    These related resources and actions for any given resource will be context sensitive. For example, only actions that the
    authenticated user can take are being rendered. This can be used to dynamically identify actions that the user might take for any
    given response.

    As an example, if you fetch a work package through the [Work Package endpoint](https://www.openproject.org/docs/api/endpoints/work-packages/), the `update` link will only
    be present when the user you authenticated has been granted a permission to update the work package in the assigned project.

    ## HAL+JSON

    HAL is a simple format that gives a consistent and easy way to hyperlink between resources in your API.
    Read more in the following specification: [https://tools.ietf.org/html/draft-kelly-json-hal-08](https://tools.ietf.org/html/draft-kelly-json-hal-08)

    **OpenProject API implementation of HAL+JSON format** enriches JSON and introduces a few meta properties:

    - `_type` - specifies the type of the resource (e.g.: WorkPackage, Project)
    - `_links` - contains all related resource and action links available for the resource
    - `_embedded` - contains all embedded objects

    HAL does not guarantee that embedded resources are embedded in their full representation, they might as well be
    partially represented (e.g. some properties can be left out).
    However in this API you have the guarantee that whenever a resource is **embedded**, it is embedded in its **full representation**.

    ## API response structure

    All API responses contain a single HAL+JSON object, even collections of objects are technically represented by
    a single HAL+JSON object that itself contains its members. More details on collections can be found
    in the [Collections Section](https://www.openproject.org/docs/api/collections/).

    ## Authentication

    The API supports the following authentication schemes: OAuth2, session based authentication, and basic auth.

    Depending on the settings of the OpenProject instance many resources can be accessed without being authenticated.
    In case the instance requires authentication on all requests the client will receive an **HTTP 401** status code
    in response to any request.

    Otherwise unauthenticated clients have all the permissions of the anonymous user.

    ### Session-based Authentication

    This means you have to login to OpenProject via the Web-Interface to be authenticated in the API.
    This method is well-suited for clients acting within the browser, like the Angular-Client built into OpenProject.

    In this case, you always need to pass the HTTP header `X-Requested-With "XMLHttpRequest"` for authentication.

    ### API Key through Basic Auth

    Users can authenticate towards the API v3 using basic auth with the user name `apikey` (NOT your login) and the API key as the password.
    Users can find their API key on their account page.

    Example:

    ```shell
    API_KEY=2519132cdf62dcf5a66fd96394672079f9e9cad1
    curl -u apikey:$API_KEY https://community.openproject.org/api/v3/users/42
    ```

    ### OAuth2.0 authentication

    OpenProject allows authentication and authorization with OAuth2 with *Authorization code flow*, as well as *Client credentials* operation modes.

    To get started, you first need to register an application in the OpenProject OAuth administration section of your installation.
    This will save an entry for your application with a client unique identifier (`client_id`) and an accompanying secret key (`client_secret`).

    You can then use one the following guides to perform the supported OAuth 2.0 flows:

    - [Authorization code flow](https://oauth.net/2/grant-types/authorization-code)

    - [Authorization code flow with PKCE](https://doorkeeper.gitbook.io/guides/ruby-on-rails/pkce-flow), recommended for clients unable to keep the client_secret confidential

    - [Client credentials](https://oauth.net/2/grant-types/client-credentials/) - Requires an application to be bound to an impersonating user for non-public access

    ### OIDC provider generated JWT as a Bearer token

    There is a possibility to use JSON Web Tokens (JWT) generated by an OIDC provider configured in OpenProject as a bearer token to do authenticated requests against the API.
    The following requirements must be met:

    - OIDC provider must be configured in OpenProject with **jwks_uri**
    - JWT must be signed using RSA algorithm
    - JWT **iss** claim must be equal to OIDC provider **issuer**
    - JWT **aud** claim must contain the OpenProject **client ID** used at the OIDC provider
    - JWT **scope** claim must include a valid scope to access the desired API (e.g. `api_v3` for APIv3)
    - JWT must be actual (neither expired or too early to be used)
    - JWT must be passed in Authorization header like: `Authorization: Bearer {jwt}`
    - User from **sub** claim must be logged in OpenProject before otherwise it will be not authenticated

    In more general terms, OpenProject should be compliant to [RFC 9068](https://www.rfc-editor.org/rfc/rfc9068) when validating access tokens.

    ### Why not username and password?

    The simplest way to do basic auth would be to use a user's username and password naturally.
    However, OpenProject already has supported API keys in the past for the API v2, though not through basic auth.

    Using **username and password** directly would have some advantages:

    * It is intuitive for the user who then just has to provide those just as they would when logging into OpenProject.

    * No extra logic for token management necessary.

    On the other hand using **API keys** has some advantages too, which is why we went for that:

    * If compromised while saved on an insecure client the user only has to regenerate the API key instead of changing their password, too.

    * They are naturally long and random which makes them invulnerable to dictionary attacks and harder to crack in general.

    Most importantly users may not actually have a password to begin with. Specifically when they have registered
    through an OpenID Connect provider.

    ## Cross-Origin Resource Sharing (CORS)

    By default, the OpenProject API is _not_ responding with any CORS headers.
    If you want to allow cross-domain AJAX calls against your OpenProject instance, you need to enable CORS headers being returned.

    Please see [our API settings documentation](https://www.openproject.org/docs/system-admin-guide/api-and-webhooks/) on
    how to selectively enable CORS.

    ## Allowed HTTP methods

    - `GET` - Get a single resource or collection of resources

    - `POST` - Create a new resource or perform

    - `PATCH` - Update a resource

    - `DELETE` - Delete a resource

    ## Compression

    Responses are compressed if requested by the client. Currently [gzip](https://www.gzip.org/) and [deflate](https://tools.ietf.org/html/rfc1951)
    are supported. The client signals the desired compression by setting the [`Accept-Encoding` header](https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3).
    If no `Accept-Encoding` header is send, `Accept-Encoding: identity` is assumed which will result in the API responding uncompressed.
  title: OpenProject API V3 (Stable)
  version: '3'
servers:
- description: This server
  url: https://plm-ppp.thape.com.cn/
paths:
  "/api/v3":
    get:
      summary: View root
      operationId: view_root
      description: Returns the root resource, containing basic information about the
        server instance and a collection of useful links.
      tags:
      - Root
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/RootModel"
  "/api/v3/actions":
    get:
      parameters:
      - description: |-
          JSON specifying filter conditions.
          Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint.
          Currently supported filters are:

          + id: Returns only the action having the id or all actions except those having the id(s).
        example: '[{ "id": { "operator": "=", "values": ["memberships/create"] }"
          }]'
        in: query
        name: filters
        required: false
        schema:
          type: string
      - description: |-
          JSON specifying sort criteria.
          Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported sorts are:

          + *No sort supported yet*
        example: '[["id", "asc"]]'
        in: query
        name: sortBy
        required: false
        schema:
          default: '[["id", "asc"]]'
          type: string
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      elements:
                      - _links:
                          self:
                            href: "/api/v3/actions/work_packages/create"
                            title: Add work package
                        _type: Action
                        description: Creating a work package within a project including
                          the uploading of attachments. Some attributes might not
                          be selected, e.g version which requires a second permission
                        id: work_packages/create
                        modules:
                        - work_packages
                        name: Add work package
                      - _links:
                          self:
                            href: "/api/v3/actions/work_packages/assign_versions"
                            title: Assigning version
                        _type: Action
                        description: Assigning a work package to a version when creating/updating
                          a work package. Only principals having this permission can
                          assign a value to the version property of the work package
                          resource.
                        id: work_packages/assign_versions
                        modules:
                        - work_packages
                        - versions
                        name: Assign version
                    _links:
                      self:
                        href: "/api/v3/actions"
                    _type: Collection
                    count: 2
                    total: 2
              schema:
                "$ref": "#/components/schemas/List_actionsModel"
          description: OK
          headers: {}
      tags:
      - Actions & Capabilities
      description: |-
        Returns a collection of actions. The client can choose to filter the actions similar to how work packages are filtered.
        In addition to the provided filters, the server will reduce the result set to only contain actions, for which the requesting client
        has sufficient permissions.
      operationId: List_actions
      summary: List actions
  "/api/v3/actions/{id}":
    get:
      parameters:
      - description: action id which is the name of the action
        example: work_packages/create
        in: path
        name: id
        required: true
        schema:
          type: string
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _links:
                      self:
                        href: "/api/v3/actions/work_packages/create"
                        title: Add work package
                    _type: Action
                    description: Creating a work package within a project including
                      the uploading of attachments. Some attributes might not be selected,
                      e.g version which requires a second permission
                    id: work_packages/create
                    modules:
                    - work_packages
                    name: Add work package
              schema:
                "$ref": "#/components/schemas/View_actionModel"
          description: OK
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
          description: Returned if the action does not exist.
          headers: {}
      tags:
      - Actions & Capabilities
      description: Returns an individual action.
      operationId: View_action
      summary: View action
  "/api/v3/activities/{id}":
    get:
      summary: Get an activity
      operationId: get_activity
      tags:
      - Activities
      description: Returns the requested activity resource identified by its unique
        id.
      parameters:
      - name: id
        description: Activity id
        in: path
        required: true
        schema:
          type: integer
        example: '1'
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ActivityModel"
              examples:
                response:
                  "$ref": "#/components/examples/ActivityResponse"
    patch:
      summary: Update activity
      operationId: update_activity
      tags:
      - Activities
      description: Updates an activity's comment and, on success, returns the updated
        activity.
      parameters:
      - name: id
        description: Activity id
        in: path
        required: true
        schema:
          type: integer
        example: '1'
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/ActivityCommentWriteModel"
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ActivityModel"
              examples:
                response:
                  "$ref": "#/components/examples/ActivityResponse"
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** edit journals
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not allowed to edit the comment of this journal
                      entry.
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
        '422':
          description: Returned if the client tries to modify a read-only property.
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:PropertyIsReadOnly
                    message: The ID of an activity can't be changed.
  "/api/v3/activities/{id}/attachments":
    get:
      summary: List attachments by activity
      operationId: list_activity_attachments
      tags:
      - Activities
      - Attachments
      description: List all attachments of a single activity.
      parameters:
      - name: id
        description: ID of the activity whose attachments will be listed
        in: path
        required: true
        schema:
          type: integer
        example: '1'
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/Attachments_Model"
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
          description: "Returned if the activity does not exist or the client does
            not have sufficient permissions\nto see it.\n\n**Required permission:**
            \n- `view_work_packages`\n- for internal comments: `view_internal_comments`\n\n*Note:
            A client without sufficient permissions shall not be able to test for
            the existence of an activity.\nThat's why a 404 is returned here, even
            if a 403 might be more appropriate.*"
    post:
      summary: Add attachment to activity
      operationId: create_activity_attachment
      tags:
      - Activities
      - Attachments
      description: Adds an attachment to the specified activity.
      parameters:
      - name: id
        description: ID of the activity to receive the attachment
        in: path
        required: true
        schema:
          type: integer
        example: '1'
      requestBody:
        content:
          multipart/form-data:
            schema:
              "$ref": "#/components/schemas/FileUploadForm"
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/AttachmentModel"
        '400':
          description: |-
            Returned if the client sends a not understandable request. Reasons include:

            * Omitting one of the required parts (metadata and file)

            * sending unparsable JSON in the metadata part
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:InvalidRequestBody
                    message: The request could not be parsed as JSON.
        '403':
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** view_work_packages or view_internal_comments (for internal comments)

            *Note that you will only receive this error, if you are at least allowed to see the activity*
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not allowed to add attachments to this activity.
        '404':
          description: |-
            Returned if the activity does not exist or the client does not have sufficient permissions
            to see it.

            **Required permission:** view_work_packages or view_internal_comments (for internal comments)

            *Note: A client without sufficient permissions shall not be able to test for the existence of an activity.
            That's why a 404 is returned here, even if a 403 might be more appropriate.*
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
        '422':
          description: |-
            Returned if the client tries to send an invalid attachment.
            Reasons are:

            * Omitting the file name (`fileName` property of metadata part)

            * Sending a file that is too large
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation
                    message: File is too large (maximum size is 5242880 Bytes).
  "/api/v3/activities/{id}/emoji_reactions":
    get:
      summary: List emoji reactions by activity
      operationId: list_activity_emoji_reactions
      tags:
      - Activities
      - EmojiReactions
      description: List all emoji reactions of a single activity.
      parameters:
      - name: id
        description: ID of the activity whose emoji reactions will be listed
        in: path
        required: true
        schema:
          type: integer
        example: '1'
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/EmojiReactions_Model"
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
          description: |-
            Returned if the activity does not exist or the client does not have sufficient permissions
            to see it.

            **Required permission:**
            - `view_work_packages`
            - for internal comments: `view_internal_comments`

            *Note: A client without sufficient permissions shall not be able to test for the existence of an activity.
            That's why a 404 is returned here, even if a 403 might be more appropriate.*
    patch:
      summary: Toggle emoji reaction for an activity
      operationId: toggle_activity_emoji_reaction
      tags:
      - Activities
      - EmojiReactions
      description: |-
        Toggle an emoji reaction for a given activity. If the user has already reacted with the given emoji,
        the reaction will be removed. Otherwise, a new reaction will be created.

        **Note:** The response contains the complete collection of all emoji reactions for this activity.

        **Required permission:**
        - `add_work_package_comments`
        - for internal comments: `add_internal_comments`
      parameters:
      - name: id
        description: ID of the activity to toggle emoji reaction for
        in: path
        required: true
        schema:
          type: integer
        example: '1'
      requestBody:
        required: true
        content:
          application/hal+json:
            schema:
              type: object
              required:
              - reaction
              properties:
                reaction:
                  type: string
                  description: The emoji reaction identifier
                  example: thumbs_up
                  enum:
                  - thumbs_up
                  - thumbs_down
                  - grinning_face_with_smiling_eyes
                  - confused_face
                  - heart
                  - party_popper
                  - rocket
                  - eyes
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/EmojiReactionModel"
        '400':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:BadRequest
                    message: 'Bad request: reaction does not have a valid value'
          description: Returned if the request is invalid. For example, if the reaction
            is not valid.
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
          description: Returned if the client does not have sufficient permissions
            to toggle the emoji reaction for the activity.
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
          description: |-
            Returned if the activity does not exist or the client does not have sufficient permissions
            to see it.
  "/api/v3/attachments":
    post:
      responses:
        '200':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/AttachmentModel"
          description: OK
        '400':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:InvalidRequestBody
                message: The request could not be parsed as JSON.
          description: |-
            Returned if the client sends a not understandable request. Reasons include:

            * Omitting one of the required parts (metadata and file)

            * sending unparsable JSON in the metadata part
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not allowed to delete this attachment.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** At least one permission in any project: edit work package, add work package, edit messages, edit wiki pages (plugins might extend this list)
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
        '422':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation
                message: File is too large (maximum size is 5242880 Bytes).
          description: |-
            Returned if the client tries to send an invalid attachment.
            Reasons are:

            * Omitting the file name (`fileName` property of metadata part)

            * Sending a file that is too large
      tags:
      - Attachments
      description: |-
        Clients can create attachments without a container first and attach them later on.
        This is useful if the container does not exist at the time the attachment is uploaded.
        After the upload, the client can then claim such containerless attachments for any resource eligible (e.g. WorkPackage) on subsequent requests.
        The upload and the claiming *must* be done for the same user account. Attachments uploaded by another user cannot be claimed and
        once claimed for a resource, they cannot be claimed by another.

        The upload request must be of type `multipart/form-data` with exactly two parts.

        The first part *must* be called `metadata`. Its content type is expected to be `application/json`,
        the body *must* be a single JSON object, containing at least the `fileName` and optionally the attachments `description`.

        The second part *must* be called `file`, its content type *should* match the mime type of the file.
        The body *must* be the raw content of the file.
        Note that a `filename` *must* be indicated in the `Content-Disposition` of this part, although it will be ignored.
        Instead the `fileName` inside the JSON of the metadata part will be used.
      operationId: create_attachment
      summary: Create Attachment
  "/api/v3/attachments/{id}":
    delete:
      parameters:
      - description: Attachment id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '204':
          description: |-
            Returned if the attachment was deleted successfully.

            Note that the response body is empty as of now. In future versions of the API a body
            *might* be returned along with an appropriate HTTP status.
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not allowed to delete this attachment.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** edit permission for the container of the attachment or being the author for attachments without container

            *Note that you will only receive this error, if you are at least allowed to see the attachment.*
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The specified attachment does not exist.
          description: |-
            Returned if the attachment does not exist or the client does not have sufficient permissions
            to see it.

            **Required permission:** view permission for the container of the attachment or being the author for attachments without container

            *Note: A client without sufficient permissions shall not be able to test for the existence of an attachment.
            That's why a 404 is returned here, even if a 403 might be more appropriate.*
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
      tags:
      - Attachments
      description: Permanently deletes the specified attachment.
      operationId: delete_attachment
      summary: Delete attachment
    get:
      parameters:
      - description: Attachment id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/AttachmentModel"
          description: OK
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The specified attachment does not exist.
          description: |-
            Returned if the attachment does not exist or the client does not have sufficient permissions
            to see it.

            **Required permission:** view permission for the container of the attachment or being the author for attachments without container

            *Note: A client without sufficient permissions shall not be able to test for the existence of an attachment.
            That's why a 404 is returned here, even if a 403 might be more appropriate.*
      tags:
      - Attachments
      description: ''
      operationId: view_attachment
      summary: View attachment
  "/api/v3/budgets/{id}":
    get:
      parameters:
      - description: Budget id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _links:
                      self:
                        href: "/api/v3/budgets/1"
                        title: Q3 2015
                    _type: Budget
                    id: 1
                    subject: Q3 2015
              schema:
                "$ref": "#/components/schemas/BudgetModel"
          description: OK
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not allowed to see this budget.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** view work packages **or** view budgets (on the budgets project)
          headers: {}
      tags:
      - Budgets
      description: ''
      operationId: view_Budget
      summary: view Budget
  "/api/v3/capabilities":
    get:
      parameters:
      - description: |-
          JSON specifying filter conditions.
          Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint.

          + action: Get all capabilities of a certain action

          + principal: Get all capabilities of a principal

          + context: Get all capabilities within a context. Note that for a project context the client needs to provide `p{id}`, e.g. `p5` and for the global context a `g`
        example: '[{ "principal": { "operator": "=", "values": ["1"] }" }]'
        in: query
        name: filters
        required: false
        schema:
          type: string
      - description: |-
          JSON specifying sort criteria.
          Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported sorts are:

          + id: Sort by the capabilities id
        example: '[["id", "asc"]]'
        in: query
        name: sortBy
        required: false
        schema:
          default: '[["id", "asc"]]'
          type: string
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      elements:
                      - _links:
                          action:
                            href: "/api/v3/actions/work_packages/create"
                            title: Add work package
                          context:
                            href: "/api/v3/projects/123"
                            title: A project
                          principal:
                            href: "/api/v3/users/567"
                            title: Some user
                          self:
                            href: "/api/v3/capabilities/work_packages/create/p123-567"
                        _type: Capability
                        id: work_packages/create/p123-567
                      - _links:
                          action:
                            href: "/api/v3/actions/work_packages/assignee"
                          context:
                            href: "/api/v3/projects/123"
                            title: A project
                          principal:
                            href: "/api/v3/users/567"
                            title: Some user
                          self:
                            href: "/api/v3/capabilities/work_packages/assignee/p123-567"
                        _type: Capability
                        id: work_packages/assignee/p123-567
                      - _links:
                          action:
                            href: "/api/v3/actions/memberships/create"
                          context:
                            href: "/api/v3/projects/345"
                            title: A project
                          principal:
                            href: "/api/v3/users/821"
                            title: Some user
                          self:
                            href: "/api/v3/capabilities/memberships/create/p345-821"
                            title: Create members
                        _type: Capability
                        id: memberships/create/p345-821
                      - _links:
                          context:
                            href: "/api/v3/capabilities/context/global"
                            title: Global
                          principal:
                            href: "/api/v3/users/567"
                            title: Some user
                          self:
                            href: "/api/v3/capabilities/users/delete/g-567"
                            title: Delete user
                        _type: Capability
                        id: users/delete/g-567
                    _links:
                      changeSize:
                        href: "/api/v3/capabilities?pageSize={size}"
                        templated: true
                      jumpTo:
                        href: "/api/v3/capabilities?offset={offset}"
                        templated: true
                      self:
                        href: "/api/v3/capabilities"
                    _type: Collection
                    count: 4
                    total: 4
              schema:
                "$ref": "#/components/schemas/List_capabilitiesModel"
          description: OK
          headers: {}
      tags:
      - Actions & Capabilities
      description: Returns a collection of actions assigned to a principal in a context.
        The client can choose to filter the actions similar to how work packages are
        filtered. In addition to the provided filters, the server will reduce the
        result set to only contain actions, for which the requesting client has sufficient
        permissions
      operationId: List_capabilities
      summary: List capabilities
  "/api/v3/capabilities/context/global":
    get:
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _links:
                      self:
                        href: "/api/v3/capabilities/context/global"
                    _type: CapabilityContext::Global
                    id: global
              schema:
                "$ref": "#/components/schemas/View_global_contextModel"
          description: OK
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
          description: Returned if the action does not exist.
          headers: {}
      tags:
      - Actions & Capabilities
      description: Returns the global capability context. This context is necessary
        to consistently link to a context even if the context is not a project.
      operationId: View_global_context
      summary: View global context
  "/api/v3/capabilities/{id}":
    get:
      parameters:
      - description: capability id
        example: work_packages/create/p123-567
        in: path
        name: id
        required: true
        schema:
          type: string
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _links:
                      action:
                        href: "/api/v3/actions/work_packages/create"
                        title: Add work package
                      context:
                        href: "/api/v3/projects/123"
                        title: A project
                      principal:
                        href: "/api/v3/users/567"
                        title: Some user
                      self:
                        href: "/api/v3/capabilities/work_packages/create/p123-567"
                    _type: Capability
                    id: work_packages/create/p123-567
              schema:
                "$ref": "#/components/schemas/View_capabilitiesModel"
          description: OK
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
          description: Returned if the capability does not exist.
          headers: {}
      tags:
      - Actions & Capabilities
      description: ''
      operationId: View_capabilities
      summary: View capabilities
  "/api/v3/categories/{id}":
    get:
      parameters:
      - description: Category id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _links:
                      defaultAssignee:
                        href: "/api/v3/users/42"
                        title: John Sheppard
                      project:
                        href: "/api/v3/projects/11"
                        title: Example project
                      self:
                        href: "/api/v3/categories/10"
                        title: Category with assignee
                    _type: Category
                    id: 10
                    name: Foo
              schema:
                "$ref": "#/components/schemas/CategoryModel"
          description: OK
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The specified category does not exist.
          description: |-
            Returned if the category does not exist or the client does not have sufficient permissions
            to see it.

            **Required permission:** view project (defining the category)

            *Note: A client without sufficient permissions shall not be able to test for the existence of
            a category. That's why a 404 is returned here, even if a 403 might be more appropriate.*
          headers: {}
      tags:
      - Categories
      description: ''
      operationId: View_Category
      summary: View Category
  "/api/v3/configuration":
    get:
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _type: Configuration
                    _links:
                      self:
                        href: "/api/v3/configuration"
                      userPreferences:
                        href: "/api/v3/my_preferences"
                    maximumAttachmentFileSize: 5242880
                    hostName: example.com:8080
                    perPageOptions:
                    - 1
                    - 10
                    - 100
                    durationFormat: hours_only
                    activeFeatureFlags:
                    - aFeatureFlag
                    - anotherFeatureFlag
              schema:
                "$ref": "#/components/schemas/ConfigurationModel"
          description: OK
          headers: {}
      tags:
      - Configuration
      description: ''
      operationId: View_configuration
      summary: View configuration
  "/api/v3/custom_actions/{id}":
    get:
      summary: Get a custom action
      tags:
      - Custom actions
      description: Retrieves a custom action by id.
      operationId: get_custom_action
      parameters:
      - name: id
        description: The id of the custom action to fetch
        in: path
        required: true
        schema:
          type: integer
        example: 42
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/CustomActionModel"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** edit work packages in any project
        '404':
          description: Returned if the custom action does not exist.
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The requested resource could not be found.
  "/api/v3/custom_actions/{id}/execute":
    post:
      parameters:
      - description: The id of the custom action to execute
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: OK
          headers: {}
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** edit work packages - Additional permissions might be required based on the custom action.
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
          description: Returned if the custom action does not exist.
          headers: {}
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '409':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:UpdateConflict
                    message: Couldn't update the resource because of conflicting modifications.
          description: Returned if the client provided an outdated lockVersion or
            no lockVersion at all.
          headers: {}
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
        '422':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _embedded:
                      details:
                        attribute: lag
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation
                    message: Lag must be a number greater than or equal to 0
          description: Returned if the custom action was not executed successfully
            e.g. when a constraint on a work package property was violated.
          headers: {}
      tags:
      - Custom actions
      description: |-
        A POST to this end point executes the custom action on the work package provided in the payload. The altered work package will be returned. In order to avoid executing
         the custom action unbeknown to a change that has already taken place, the client has to provide the work package's current lockVersion.
      operationId: Execute_custom_action
      requestBody:
        content:
          application/json:
            schema:
              example:
                _links:
                  workPackage:
                    href: "/api/v3/work_packages/42"
                lockVersion: '3'
              properties:
                _links:
                  properties:
                    workPackage:
                      properties:
                        href:
                          type: string
                      type: object
                  type: object
                lockVersion:
                  type: string
              type: object
      summary: Execute custom action
  "/api/v3/custom_fields/{id}/items":
    get:
      summary: Get the custom field hierarchy items
      operationId: get_custom_field_items
      description: |-
        Retrieves the hierarchy of custom fields.

        The hierarchy is a tree structure of hierarchy items. It is represented as a flat list of items, where each item
        has a reference to its parent and children. The list is ordered in a depth-first manner. The first item is the
        requested parent. If parent was unset, the root item is returned as first element.

        Passing the `depth` query parameter allows to limit the depth of the hierarchy. If the depth is unset, the full
        hierarchy tree is returned. If the depth is set to `0`, only the requested parent is returned. Any other positive
        integer will return the number of children levels specified by this value.

        This endpoint only returns, if the custom field is of type `hierarchy`.
      parameters:
      - name: id
        description: The custom field's unique identifier
        in: path
        example: '42'
        required: true
        schema:
          type: integer
      - name: parent
        description: The identifier of the parent hierarchy item
        in: query
        example: '1337'
        required: false
        schema:
          type: integer
      - name: depth
        description: The level of hierarchy depth
        in: query
        example: '1'
        required: false
        schema:
          type: integer
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/HierarchyItemCollectionModel"
              examples:
                simple response:
                  "$ref": "#/components/examples/HierarchyItemCollectionResponse"
                filtered response:
                  "$ref": "#/components/examples/HierarchyItemCollectionFilteredResponse"
        '403':
          description: Returned if the user is not logged in.
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
        '404':
          description: Returned if the custom field does not exist.
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
        '422':
          description: Returned if the custom field is not of type hierarchy.
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:UnprocessableContent
                    message: The requested custom field resource is of wrong type.
  "/api/v3/custom_field_items/{id}":
    get:
      summary: Get a custom field hierarchy item
      operationId: get_custom_field_item
      description: Retrieves a single custom field item specified by its unique identifier.
      parameters:
      - name: id
        description: The custom field item's unique identifier
        in: path
        example: '42'
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/HierarchyItemReadModel"
              examples:
                simple response:
                  "$ref": "#/components/examples/HierarchyItemResponse"
        '403':
          description: Returned if the user is not logged in.
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
        '404':
          description: Returned if the custom field item does not exist or the user
            is not logged in.
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
  "/api/v3/custom_field_items/{id}/branch":
    get:
      summary: Get a custom field hierarchy item's branch
      operationId: get_custom_field_item_branch
      description: |-
        Retrieves the branch of a single custom field item specified by its unique identifier.

        A branch is list of all ancestors, starting with the root item and finishing with the item itself.
      parameters:
      - name: id
        description: The custom field item's unique identifier
        in: path
        example: '42'
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/HierarchyItemCollectionModel"
              examples:
                simple response:
                  "$ref": "#/components/examples/HierarchyItemCollectionResponse"
        '403':
          description: Returned if the user is not logged in.
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
        '404':
          description: Returned if the custom field does not exist.
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
        '422':
          description: Returned if the custom field is not of type hierarchy.
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:UnprocessableContent
                    message: The requested custom field resource is of wrong type.
  "/api/v3/custom_options/{id}":
    get:
      parameters:
      - description: The custom option's identifier
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _links:
                      self:
                        href: "/api/v3/custom_options/1"
                    _type: CustomOption
                    value: Foo
              schema:
                "$ref": "#/components/schemas/CustomOptionModel"
          description: OK
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
          description: |-
            Returned if the custom option does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view work package in any project the custom option's custom field is active in.
          headers: {}
      tags:
      - Custom Options
      description: ''
      operationId: View_Custom_Option
      summary: View Custom Option
  "/api/v3/days/non_working":
    get:
      summary: Lists all non working days
      operationId: list_non_working_days
      tags:
      - Work Schedule
      description: |-
        Lists all one-time non working days, such as holidays.
        It does not lists the non working weekdays, such as each Saturday, Sunday.
        For listing the weekends, the `/api/v3/days` endpoint should be used.

        All days from current year are returned by default.
      parameters:
      - name: filters
        in: query
        description: |-
          JSON specifying filter conditions.

          Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/)
          endpoint. Currently supported filters are:

          + date: the inclusive date interval to scope days to look up. When
            unspecified, default is from the beginning to the end of current year.

            Example: `{ "date": { "operator": "<>d", "values": ["2022-05-02","2022-05-26"] } }`
            would return days between May 5 and May 26 2022, inclusive.
        example: '[{ "date": { "operator": "<>d", "values": ["2022-05-02","2022-05-26"]
          } }]'
        required: false
        schema:
          type: string
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/NonWorkingDayCollectionModel"
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
    post:
      summary: Creates a non-working day (NOT IMPLEMENTED)
      operationId: create_non_working_day
      tags:
      - Work Schedule
      description: |-
        **(NOT IMPLEMENTED)**
        Marks a day as being a non-working day.

        Note: creating a non-working day will not affect the start and finish dates
        of work packages but will affect their duration.
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/NonWorkingDayModel"
            example:
              _type: NonWorkingDay
              date: '2022-12-25'
              name: Christmas
      responses:
        '201':
          description: Non-working day created.
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/NonWorkingDayModel"
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          description: Returned if the client does not have sufficient permissions.
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:InvalidQuery
                message: You are not authorized to access this resource.
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
  "/api/v3/days/non_working/{date}":
    get:
      summary: View a non-working day
      operationId: view_non_working_day
      tags:
      - Work Schedule
      description: Returns the non-working day information for a given date.
      parameters:
      - name: date
        in: path
        required: true
        description: The date of the non-working day to view in ISO 8601 format.
        schema:
          type: string
          format: date
        example: '2022-05-06'
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/NonWorkingDayModel"
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '404':
          description: Returned if the given date is not a non-working day.
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The requested resource could not be found.
    patch:
      summary: Update a non-working day attributes (NOT IMPLEMENTED)
      operationId: update_non_working_day
      tags:
      - Work Schedule
      description: |-
        **(NOT IMPLEMENTED)**
        Update the non-working day information for a given date.
      parameters:
      - name: date
        in: path
        required: true
        description: The date of the non-working day to view in ISO 8601 format.
        schema:
          type: string
          format: date
        example: '2022-05-06'
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/NonWorkingDayModel"
            example:
              _type: NonWorkingDay
              date: '2022-05-01'
              name: Labour day
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/NonWorkingDayModel"
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '404':
          description: Returned if the given date is not a non-working day.
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The requested resource could not be found.
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
    delete:
      summary: Removes a non-working day (NOT IMPLEMENTED)
      operationId: delete_non_working_day
      tags:
      - Work Schedule
      description: |-
        **(NOT IMPLEMENTED)**
        Removes the non-working day at the given date.

        Note: deleting a non-working day will not affect the start and finish dates
        of work packages but will affect their duration.
      parameters:
      - name: date
        in: path
        required: true
        description: The date of the non-working day to view in ISO 8601 format.
        schema:
          type: string
          format: date
        example: '2022-05-06'
      responses:
        '204':
          description: |-
            No Content.

            The operation succeeded.
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '404':
          description: Returned if the given date is not a non-working day.
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The requested resource could not be found.
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
  "/api/v3/days/week":
    get:
      summary: Lists week days
      operationId: list_week_days
      tags:
      - Work Schedule
      description: Lists week days with work schedule information.
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/WeekDayCollectionModel"
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
    patch:
      summary: Update week days (NOT IMPLEMENTED)
      operationId: update_week_days
      tags:
      - Work Schedule
      description: |-
        **(NOT IMPLEMENTED)**
        Update multiple week days with work schedule information.
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/WeekDayCollectionWriteModel"
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/WeekDayCollectionModel"
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '404':
          description: Returned if a week day resource can not be found.
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:InvalidQuery
                message: The requested resource could not be found.
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
  "/api/v3/days/week/{day}":
    get:
      summary: View a week day
      operationId: view_week_day
      tags:
      - Work Schedule
      description: View a week day and its attributes.
      parameters:
      - name: day
        in: path
        required: true
        description: The week day from 1 to 7. 1 is Monday. 7 is Sunday.
        schema:
          type: integer
          minimum: 1
          maximum: 7
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/WeekDayModel"
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '404':
          description: Returned if the day is out of the 1-7 range.
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The requested resource could not be found.
    patch:
      summary: Update a week day attributes (NOT IMPLEMENTED)
      operationId: update_week_day
      description: |-
        **(NOT IMPLEMENTED)**
        Makes a week day a working or non-working day.

        Note: changing a week day working attribute will not affect the start and
        finish dates of work packages but will affect their duration attribute.
      tags:
      - Work Schedule
      parameters:
      - name: day
        in: path
        required: true
        description: The week day from 1 to 7. 1 is Monday. 7 is Sunday.
        schema:
          type: integer
          minimum: 1
          maximum: 7
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/WeekDayWriteModel"
            example:
              _type: WeekDay
              working: false
      responses:
        '200':
          description: |-
            Update succeeded.

            Response will include the week day with updated attributes.
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/WeekDayModel"
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          description: Returned if the client does not have sufficient permissions.
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:InvalidQuery
                message: You are not authorized to access this resource.
        '404':
          description: Returned if the day is out of the 1-7 range.
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:InvalidQuery
                message: The requested resource could not be found.
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
  "/api/v3/days":
    get:
      summary: Lists days
      operationId: list_days
      tags:
      - Work Schedule
      description: |-
        Lists days information for a given date interval.

        All days from the beginning of current month to the end of following month
        are returned by default.
      parameters:
      - name: filters
        in: query
        description: |-
          JSON specifying filter conditions.

          Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/)
          endpoint. Currently supported filters are:

          + date: the inclusive date interval to scope days to look up. When
            unspecified, default is from the beginning of current month to the end
            of following month.

            Example: `{ "date": { "operator": "<>d", "values": ["2022-05-02","2022-05-26"] } }`
            would return days between May 5 and May 26 2022, inclusive.

          + working: when `true`, returns only the working days. When `false`,
            returns only the non-working days (weekend days and non-working days).
            When unspecified, returns both working and non-working days.

            Example: `{ "working": { "operator": "=", "values": ["t"] } }`
            would exclude non-working days from the response.
        example: '[{ "date": { "operator": "<>d", "values": ["2022-05-02","2022-05-26"]
          } }, { "working": { "operator": "=", "values": ["f"] } }]'
        required: false
        schema:
          type: string
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/DayCollectionModel"
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
  "/api/v3/days/{date}":
    get:
      summary: View day
      operationId: view_day
      tags:
      - Work Schedule
      description: View the day information for a given date.
      parameters:
      - name: date
        in: path
        required: true
        description: The date of the non-working day to view in ISO 8601 format.
        schema:
          type: string
          format: date
        example: '2022-05-06'
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/DayModel"
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
  "/api/v3/documents":
    get:
      parameters:
      - description: Page number inside the requested collection.
        example: '25'
        in: query
        name: offset
        required: false
        schema:
          default: 1
          type: integer
      - description: Number of elements to display per page.
        example: '25'
        in: query
        name: pageSize
        required: false
        schema:
          type: integer
      - description: |-
          JSON specifying sort criteria.
          Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported sorts are:

          + id: Sort by primary key

          + created_at: Sort by document creation datetime
        example: '[["created_at", "asc"]]'
        in: query
        name: sortBy
        required: false
        schema:
          type: string
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      elements:
                      - _links:
                          addAttachment:
                            href: "/api/v3/documents/1/attachments"
                            method: post
                          attachments:
                            href: "/api/v3/documents/1/attachments"
                          project:
                            href: "/api/v3/projects/19"
                            title: Some project
                          self:
                            href: "/api/v3/documents/1"
                            title: Some document
                        _type: Document
                        createdAt: '2018-12-10T20:53:39.184Z'
                        description:
                          format: markdown
                          html: "<p>Videlicet deserunt aequitas cognatus. Concedo
                            quia est quia pariatur vorago vallum. Calco autem atavus
                            accusamus conscendo cornu ulterius. Tam patria ago consectetur
                            ventito sustineo nihil caecus. Supra officiis eos velociter
                            somniculosus tonsor qui. Suffragium aduro arguo angustus
                            cogito quia tolero vulnus. Supplanto sortitus cresco apud
                            vestrum qui.</p>"
                          raw: Videlicet deserunt aequitas cognatus. Concedo quia
                            est quia pariatur vorago vallum. Calco autem atavus accusamus
                            conscendo cornu ulterius. Tam patria ago consectetur ventito
                            sustineo nihil caecus. Supra officiis eos velociter somniculosus
                            tonsor qui. Suffragium aduro arguo angustus cogito quia
                            tolero vulnus. Supplanto sortitus cresco apud vestrum
                            qui.
                        id: 1
                        title: Some other document
                      - _links:
                          addAttachment:
                            href: "/api/v3/documents/2/attachments"
                            method: post
                          attachments:
                            href: "/api/v3/documents/2/attachments"
                          project:
                            href: "/api/v3/projects/29"
                            title: Some other project
                          self:
                            href: "/api/v3/documents/2"
                            title: Some other document
                        _type: Document
                        createdAt: '2018-12-10T20:55:54.049Z'
                        description:
                          format: markdown
                          html: "<p>Videlicet deserunt aequitas cognatus. Concedo
                            quia est quia pariatur vorago vallum. Calco autem atavus
                            accusamus conscendo cornu ulterius. Tam patria ago consectetur
                            ventito sustineo nihil caecus. Supra officiis eos velociter
                            somniculosus tonsor qui. Suffragium aduro arguo angustus
                            cogito quia tolero vulnus. Supplanto sortitus cresco apud
                            vestrum qui.</p>"
                          raw: Videlicet deserunt aequitas cognatus. Concedo quia
                            est quia pariatur vorago vallum. Calco autem atavus accusamus
                            conscendo cornu ulterius. Tam patria ago consectetur ventito
                            sustineo nihil caecus. Supra officiis eos velociter somniculosus
                            tonsor qui. Suffragium aduro arguo angustus cogito quia
                            tolero vulnus. Supplanto sortitus cresco apud vestrum
                            qui.
                        id: 2
                        title: Some other document
                    _links:
                      changeSize:
                        href: "/api/v3/documents?offset=1&pageSize=%7Bsize%7D"
                        templated: true
                      jumpTo:
                        href: "/api/v3/documents?offset=%7Boffset%7D&pageSize=30"
                        templated: true
                      self:
                        href: "/api/v3/documents?offset=1&pageSize=30"
                    _type: Collection
                    count: 2
                    offset: 1
                    pageSize: 30
                    total: 2
              schema:
                "$ref": "#/components/schemas/DocumentsModel"
          description: OK
          headers: {}
        '400':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:InvalidQuery
                    message:
                    - Filters Invalid filter does not exist.
          description: Returned if the client sends invalid request parameters e.g.
            filters
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to view this resource.
          description: Returned if the client is not logged in and login is required.
          headers: {}
      tags:
      - Documents
      description: The documents returned depend on the provided parameters and also
        on the requesting user's permissions.
      operationId: List_Documents
      summary: List Documents
  "/api/v3/documents/{id}":
    get:
      parameters:
      - description: Document id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      attachments:
                        _embedded...:
                          elements: []
                        _links:
                          self:
                            href: "/api/v3/documents/1/attachments"
                        _type: Collection
                        count: 2
                        total: 2
                      project:
                        _type: Project...
                    _links:
                      addAttachment:
                        href: "/api/v3/documents/1/attachments"
                        method: post
                      attachments:
                        href: "/api/v3/documents/1/attachments"
                      project:
                        href: "/api/v3/projects/19"
                        title: Some project
                      self:
                        href: "/api/v3/documents/1"
                        title: Some document
                    _type: Document
                    createdAt: '2018-12-10T20:53:39.698Z'
                    description:
                      format: markdown
                      html: "<p>Videlicet deserunt aequitas cognatus. Concedo quia
                        est quia pariatur vorago vallum. Calco autem atavus accusamus
                        conscendo cornu ulterius. Tam patria ago consectetur ventito
                        sustineo nihil caecus. Supra officiis eos velociter somniculosus
                        tonsor qui. Suffragium aduro arguo angustus cogito quia tolero
                        vulnus. Supplanto sortitus cresco apud vestrum qui.</p>"
                      raw: Videlicet deserunt aequitas cognatus. Concedo quia est
                        quia pariatur vorago vallum. Calco autem atavus accusamus
                        conscendo cornu ulterius. Tam patria ago consectetur ventito
                        sustineo nihil caecus. Supra officiis eos velociter somniculosus
                        tonsor qui. Suffragium aduro arguo angustus cogito quia tolero
                        vulnus. Supplanto sortitus cresco apud vestrum qui.
                    id: 1
                    title: Some other document
              schema:
                "$ref": "#/components/schemas/DocumentModel"
          description: OK
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
          description: |-
            Returned if the document does not exist or if the user does not have permission to view it.

            **Required permission** `view documents` in the project the document belongs to
          headers: {}
      tags:
      - Documents
      description: ''
      operationId: View_document
      summary: View document
  "/api/v3/example/form":
    post:
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      payload:
                        _links:
                          status:
                            href: "/api/v3/statuses/1"
                        _type: Example
                        lockVersion: 5
                        subject: An example title
                      schema:
                        _links:
                          self:
                            href: "/api/v3/example/schema"
                        _type: Schema
                        lockVersion:
                          type: Integer
                          writable: false
                        status:
                          _embedded:
                            allowedValues:
                            - _links:
                                self:
                                  href: "/api/v3/statuses/1"
                              _type: Status
                              createdAt: '2014-05-21T08:51:20.396Z'
                              defaultDoneRatio: 0
                              id: 1
                              isClosed: false
                              isDefault: true
                              name: New
                              position: 1
                              updatedAt: '2014-05-21T09:12:00.647Z'
                            - _links:
                                self:
                                  href: "/api/v3/statuses/2"
                              _type: Status
                              createdAt: '2014-05-21T08:51:20.396Z'
                              defaultDoneRatio: 100
                              id: 2
                              isClosed: true
                              isDefault: false
                              name: Closed
                              position: 2
                              updatedAt: '2014-05-21T09:12:00.647Z'
                          _links:
                            allowedValues:
                            - href: "/api/v3/statuses/1"
                              title: New
                            - href: "/api/v3/statuses/2"
                              title: Closed
                          type: Status
                        subject:
                          maxLength: 255
                          minLength: 1
                          type: String
                      validationErrors:
                        subject:
                          _type: Error
                          errorIdentifier: urn:openproject-org:api:v3:errors:BadExampleError
                          message: For the purpose of this example we need a validation
                            error. The remainder of the response pretends there were
                            no errors.
                    _links:
                      commit:
                        href: "/api/v3/example"
                        method: PATCH
                      previewMarkup:
                        href: "/api/v3/render/markdown"
                        method: POST
                      self:
                        href: "/api/v3/example/form"
                      validate:
                        href: "/api/v3/example/form"
                        method: POST
                    _type: Form
              schema:
                "$ref": "#/components/schemas/Example_FormModel"
          description: OK
          headers: {}
        '400':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:InvalidRequestBody
                    message: The request body was neither empty, nor did it contain
                      a single JSON object.
          description: |-
            Occurs when the client did not send a valid JSON object in the request body and the request body
            was not empty.

            Note that this error only occurs when the content is not at all a single JSON object.
            It **does not occur** for requests containing undefined properties or invalid property values.
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not allowed to edit example resources.
          description: Returned if the client does not have sufficient permissions
            to modify the associated resource.
          headers: {}
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '409':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:UpdateConflict
                    message: The resource you are about to edit was changed in the
                      meantime.
          description: Returned if underlying resource was changed since the client
            requested the form. This is determined using the `lockVersion` property.
          headers: {}
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
      tags:
      - Forms
      description: This is an example of how a form might look like. Note that this
        endpoint does not exist in the actual implementation.
      operationId: show_or_validate_form
      requestBody:
        content:
          application/json:
            schema:
              example:
                _type: Example
                lockVersion: 5
                subject: An example title
              properties:
                _type:
                  type: string
                lockVersion:
                  type: number
                subject:
                  type: string
              type: object
      summary: show or validate form
  "/api/v3/example/schema":
    get:
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _dependencies: []
                    _links:
                      self:
                        href: "/api/v3/example/schema"
                    _type: Schema
                    lockVersion:
                      name: Resource Version
                      type: Integer
                      writable: false
                    status:
                      _embedded:
                        allowedValues:
                        - _links:
                            self:
                              href: "/api/v3/statuses/1"
                          _type: Status
                          createdAt: '2014-05-21T08:51:20.396Z'
                          defaultDoneRatio: 0
                          id: 1
                          isClosed: false
                          isDefault: true
                          name: New
                          position: 1
                          updatedAt: '2014-05-21T09:12:00.441Z'
                        - _links:
                            self:
                              href: "/api/v3/statuses/2"
                          _type: Status
                          createdAt: '2014-05-21T08:51:20.396Z'
                          defaultDoneRatio: 100
                          id: 2
                          isClosed: true
                          isDefault: false
                          name: Closed
                          position: 2
                          updatedAt: '2014-05-21T09:12:00.441Z'
                      _links:
                        allowedValues:
                        - href: "/api/v3/statuses/1"
                          title: New
                        - href: "/api/v3/statuses/2"
                          title: Closed
                      location: _links
                      name: Status
                      type: Status
                    subject:
                      maxLength: 255
                      minLength: 1
                      name: Subject
                      type: String
              schema:
                "$ref": "#/components/schemas/Example_SchemaModel"
          description: OK
          headers: {}
      tags:
      - Schemas
      description: This is an example of how a schema might look like. Note that this
        endpoint does not exist in the actual implementation.
      operationId: view_the_schema
      summary: view the schema
  "/api/v3/examples":
    get:
      parameters:
      - description: |-
          The column to group by.
          Note: Aggregation is as of now only supported by the work package collection.
          You can pass any column name as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint.
        example: status
        in: query
        name: groupBy
        required: false
        schema:
          type: string
      - description: ''
        example: true
        in: query
        name: showSums
        required: false
        schema:
          default: false
          type: boolean
      responses:
        '200':
          description: OK
          headers: {}
      tags:
      - Collections
      description: ''
      operationId: view_aggregated_result
      summary: view aggregated result
  "/api/v3/file_links/{id}":
    get:
      summary: Gets a file link.
      operationId: view_file_link
      tags:
      - File links
      description: Gets a single file link resource of a work package.
      parameters:
      - name: id
        description: File link id
        in: path
        required: true
        schema:
          type: integer
        example: 42
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/FileLinkReadModel"
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The requested resource could not be found.
          description: |-
            Returned if the work package does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view work package, view file links
    delete:
      summary: Removes a file link.
      operationId: delete_file_link
      tags:
      - File links
      description: |-
        Removes a file link on a work package.

        The request contains only the file link identifier as a path parameter. No request body is needed.
      parameters:
      - name: id
        description: File link id
        in: path
        required: true
        schema:
          type: integer
        example: 42
      responses:
        '200':
          description: OK
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** manage file links

            *Note that you will only receive this error, if you are at least allowed to see the corresponding work package.*
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The requested resource could not be found.
          description: |-
            Returned if the work package or the file link does not exist or the client does not have sufficient permissions
            to see it.

            **Required permission:** view work package, view file links
  "/api/v3/file_links/{id}/open":
    get:
      summary: Creates an opening uri of the linked file.
      operationId: open_file_link
      tags:
      - File links
      description: |-
        Creates a uri to open the origin file linked by the given file link. This uri depends on the storage type and
        is always located on the origin storage itself.
      parameters:
      - name: id
        description: File link id
        in: path
        required: true
        schema:
          type: integer
        example: 42
      - name: location
        description: Boolean flag indicating, if the file should be opened directly
          or rather the directory location.
        in: query
        required: false
        schema:
          type: boolean
        example: true
      responses:
        '303':
          headers:
            Location:
              schema:
                type: string
                format: uri
          description: |-
            Returned if the request was successful. In the `Location` header is the uri where the client can open the origin
            file on the storage.
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The requested resource could not be found.
          description: |-
            Returned if the work package does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view work package, view file links
  "/api/v3/file_links/{id}/download":
    get:
      summary: Creates a download uri of the linked file.
      operationId: download_file_link
      tags:
      - File links
      description: |-
        Creates a uri to download the origin file linked by the given file link. This uri depends on the storage type and
        is always located on the origin storage itself.
      parameters:
      - name: id
        description: File link id
        in: path
        required: true
        schema:
          type: integer
        example: 42
      responses:
        '303':
          headers:
            Location:
              schema:
                type: string
                format: uri
          description: |-
            Returned if the request was successful. In the `Location` header is the uri where the client can download the
            origin file from the storage.
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The requested resource could not be found.
          description: |-
            Returned if the work package does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view work package, view file links
  "/api/v3/grids":
    get:
      summary: List grids
      tags:
      - Grids
      description: |-
        Lists all grids matching the provided filters and being part of the selected query page. The grids returned will
        also depend on the permissions of the requesting user.
      operationId: list_grids
      parameters:
      - name: offset
        schema:
          type: integer
          default: 1
        description: Page number inside the requested collection.
        in: query
        required: false
        example: '25'
      - name: pageSize
        schema:
          type: integer
          default: 30
        description: Number of elements to display per page.
        in: query
        required: false
        example: '25'
      - name: filters
        schema:
          type: string
        description: |-
          JSON specifying filter conditions. Accepts the same format as returned by
          the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported filters
          are:

          - page: Filter grid by work package
        in: query
        required: false
        example: '[{ "page": { "operator": "=", "values": ["/my/page"] } }]'
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/GridCollectionModel"
              examples:
                Simple grid collection:
                  "$ref": "#/components/examples/GridSimpleCollectionResponse"
        '400':
          "$ref": "#/components/responses/InvalidQuery"
        '403':
          description: Returned if the client is not logged in and login is required.
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not authorized to view this resource.
    post:
      summary: Create a grid
      operationId: create_grid
      tags:
      - Grids
      description: |-
        Creates a new grid applying the attributes provided in the body. The constraints applied to the grid depend on the
        page the grid is placed in which is why the create form end point should be used to be guided when wanting to
        create a grid.
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/GridWriteModel"
            examples:
              Simple grid creation:
                "$ref": "#/components/examples/GridSimplePatchModel"
      responses:
        '201':
          description: Created
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/GridReadModel"
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** Depends on the page the grid is defined for.
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
        '422':
          description: |-
            Returned if:

            * a constraint for a property was violated (`PropertyConstraintViolation`)
  "/api/v3/grids/form":
    post:
      responses:
        '200':
          description: OK
          headers: {}
      tags:
      - Grids
      description: ''
      operationId: Grid_Create_Form
      summary: Grid Create Form
  "/api/v3/grids/{id}":
    get:
      summary: Get a grid
      operationId: get_grid
      tags:
      - Grids
      description: Fetches a single grid identified by its id.
      parameters:
      - name: id
        in: path
        description: Grid id
        required: true
        schema:
          type: integer
        example: '42'
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/GridReadModel"
              examples:
                Simple grid:
                  "$ref": "#/components/examples/GridSimpleResponse"
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The requested resource could not be found.
          description: |-
            Returned if the Grid does not exist or if the user does not have permission to view it.

            **Required permission** depends on the page the grid is defined for
    patch:
      summary: Update a grid
      operationId: update_grid
      tags:
      - Grids
      description: |-
        Updates the given grid by applying the attributes provided in the body. The constraints applied to the grid depend
        on the page the grid is placed in which is why the create form end point should be used to be guided when wanting
        to update a grid.
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/GridWriteModel"
            examples:
              Simple grid patch:
                "$ref": "#/components/examples/GridSimplePatchModel"
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/GridReadModel"
              examples:
                Simple grid:
                  "$ref": "#/components/examples/GridSimpleResponse"
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** The permission depends on the page the grid is placed in.
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
        '422':
          description: |-
            Returned if:

            * a constraint for a property was violated (`PropertyConstraintViolation`)
  "/api/v3/grids/{id}/form":
    post:
      parameters:
      - description: ID of the grid being modified
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              schema:
                type: object
              examples:
                response:
                  value:
                    _embedded:
                      payload:
                        columnCount: 5
                        rowCount: 6
                        widgets:
                        - _type: GridWidget
                          endColumn: 3
                          endRow: 8
                          identifier: time_entries_current_user
                          startColumn: 1
                          startRow: 1
                        - _type: GridWidget
                          endColumn: 5
                          endRow: 8
                          identifier: news
                          startColumn: 4
                          startRow: 3
                        - _type: GridWidget
                          endColumn: 6
                          endRow: 3
                          identifier: documents
                          startColumn: 3
                          startRow: 1
                      schema:
                        _links: {}
                        _type: Schema
                        columnCount:
                          hasDefault: false
                          name: Number of columns
                          required: true
                          type: Integer
                          writable: true
                        createdAt:
                          hasDefault: false
                          name: Created on
                          required: true
                          type: DateTime
                          writable: false
                        id:
                          hasDefault: false
                          name: ID
                          required: true
                          type: Integer
                          writable: false
                        rowCount:
                          hasDefault: false
                          name: Number of rows
                          required: true
                          type: Integer
                          writable: true
                        scope:
                          _links: {}
                          hasDefault: false
                          name: Page
                          required: true
                          type: Href
                          writable: false
                        updatedAt:
                          hasDefault: false
                          name: Updated on
                          required: true
                          type: DateTime
                          writable: false
                        widgets:
                          _links: {}
                          hasDefault: false
                          name: Widgets
                          required: true
                          type: "[]GridWidget"
                          writable: true
                      validationErrors:
                        widgets:
                          _embedded:
                            errors:
                            - _embedded:
                                details:
                                  attribute: widgets
                              _type: Error
                              errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation
                              message: Widgets is outside of the grid.
                            - _embedded:
                                details:
                                  attribute: widgets
                              _type: Error
                              errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation
                              message: Widgets is outside of the grid.
                          _type: Error
                          errorIdentifier: urn:openproject-org:api:v3:errors:MultipleErrors
                          message: Multiple field constraints have been violated.
                    _links:
                      self:
                        href: "/api/v3/grids/2/form"
                        method: post
                      validate:
                        href: "/api/v3/grids/2/form"
                        method: post
                    _type: Form
          description: OK
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** depends on the page the grid is defined for.

            *Note that you will only receive this error, if you are at least allowed to see the corresponding grid.*
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
          description: |-
            Returned if the grid does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view work package
          headers: {}
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
      tags:
      - Grids
      description: ''
      operationId: Grid_Update_Form
      summary: Grid Update Form
  "/api/v3/groups":
    get:
      summary: List groups
      operationId: list_groups
      tags:
      - Groups
      description: |-
        Returns a collection of groups. The client can choose to filter the
        groups similar to how work packages are filtered. In addition to the provided
        filters, the server will reduce the result set to only contain groups, for which
        the requesting client has sufficient permissions (*view_members*, *manage_members*).
      parameters:
      - name: sortBy
        description: |-
          JSON specifying sort criteria.
          Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported sorts are:

          + id: Sort by primary key

          + created_at: Sort by group creation datetime

          + updated_at: Sort by the time the group was updated last
        in: query
        required: false
        example: '[["id", "asc"]]'
        schema:
          default: '[["id", "asc"]]'
          type: string
      - name: select
        description: Comma separated list of properties to include.
        in: query
        required: false
        example: total,elements/name,elements/self,self
        schema:
          type: string
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/GroupCollectionModel"
        '403':
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** View members or manage members in any project
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not authorized to access this resource.
    post:
      summary: Create group
      operationId: create_group
      tags:
      - Groups
      description: Creates a new group applying the attributes provided in the body.
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/GroupWriteModel"
      responses:
        '201':
          description: Created
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/GroupModel"
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** Administrator
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not authorized to access this resource.
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
        '422':
          description: |-
            Returned if:

            * a constraint for a property was violated (`PropertyConstraintViolation`)
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _embedded:
                  details:
                    attribute: name
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation
                message: Name can't be blank.
  "/api/v3/groups/{id}":
    delete:
      summary: Delete group
      operationId: delete_group
      tags:
      - Groups
      description: Deletes the group.
      parameters:
      - name: id
        description: Group id
        example: 1
        in: path
        required: true
        schema:
          type: integer
      responses:
        '202':
          description: |-
            Returned if the group was marked for deletion.

            Note that the response body is empty as of now. In future versions of the API a body
            *might* be returned, indicating the progress of deletion.
        '403':
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** Administrator
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not authorized to access this resource.
        '404':
          description: |-
            Returned if the group does not exist or the client does not have sufficient permissions
            to see it.

            **Required permission:** Administrator

            *Note: A client without sufficient permissions shall not be able to test for the existence of
            a version. That's why a 404 is returned here, even if a 403 might be more appropriate.*
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
    get:
      summary: Get group
      operationId: get_group
      tags:
      - Groups
      description: Fetches a group resource.
      parameters:
      - name: id
        description: Group id
        example: 1
        in: path
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/GroupModel"
              examples:
                group response:
                  "$ref": "#/components/examples/GroupResponse"
        '404':
          description: |-
            Returned if the group does not exist or if the API user does not have permission to view them.

            **Required permission** If the user has the *manage members* permission in at least one project the user will be able to query all groups. If not, the user
            will be able to query all groups which are members in projects, he has the *view members* permission in.
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The requested resource could not be found.
    patch:
      summary: Update group
      operationId: update_group
      tags:
      - Groups
      description: |-
        Updates the given group by applying the attributes provided in the body.

        Please note that the `members` array provided will override the existing set of members (similar to a PUT). A
        client thus has to provide the complete list of members the group is to have after the PATCH even if only one
        member is to be added.
      parameters:
      - name: id
        description: Group id
        example: 1
        in: path
        required: true
        schema:
          type: integer
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/GroupWriteModel"
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/GroupModel"
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** Administrator
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not authorized to access this resource.
        '404':
          description: |-
            Returned if the group does not exist or the client does not have sufficient permissions
            to see it.

            **Required permission** If the user has the *manage members* permission in at least one project the user will be able to query all groups. If not, the user
            will be able to query all groups which are members in projects, he has the *view members* permission in.

            *Note: A client without sufficient permissions shall not be able to test for the existence of
            a version. That's why a 404 is returned here, even if a 403 might be more appropriate.*
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The requested resource could not be found.
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
        '422':
          description: |-
            Returned if:

            * a constraint for a property was violated (`PropertyConstraintViolation`)
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _embedded:
                  details:
                    attribute: members
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation
                message: Member is already taken.
  "/api/v3/help_texts":
    get:
      summary: List help texts
      operationId: list_help_texts
      tags:
      - Help texts
      description: List the complete collection of help texts.
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/HelpTextCollectionModel"
  "/api/v3/help_texts/{id}":
    get:
      summary: Get help text
      operationId: get_help_text
      tags:
      - Help texts
      description: Fetches the help text from the given id.
      parameters:
      - name: id
        description: Help text id
        example: 1
        in: path
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/HelpTextModel"
        '404':
          description: Returned if the help text does not exist.
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The requested resource could not be found.
  "/api/v3/meetings/{id}":
    get:
      parameters:
      - description: Meeting identifier
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      project:
                        _type: Project...
                        id: 12
                      author:
                        _type: User...
                        id: 2
                    _links:
                      addAttachment:
                        href: "/api/v3/meetings/72/attachments"
                        method: post
                      attachments:
                        href: "/api/v3/meetings/72/attachments"
                      project:
                        href: "/api/v3/projects/12"
                        title: some project
                      author:
                        href: "/api/v3/users/2"
                        title: Peggie Feeney
                      self:
                        href: "/api/v3/meetings/72"
                    _type: Meeting
                    id: 72
                    lockVersion: 5
                    title: A meeting
                    startTime: '2014-05-21T08:00:00.000Z'
                    duration: 120
                    createdAt: '2014-05-21T08:51:20.396Z'
                    updatedAt: '2014-05-21T09:14:02.776Z'
              schema:
                "$ref": "#/components/schemas/MeetingModel"
          description: OK
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
          description: |-
            Returned if the meeting does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view meetings in the page's project
          headers: {}
      tags:
      - Meetings
      description: Retrieve an individual meeting as identified by the id parameter
      operationId: View_Meeting
      summary: View Meeting Page
  "/api/v3/meetings/{id}/attachments":
    get:
      parameters:
      - description: ID of the meeting whose attachments will be listed
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      elements:
                      - _links:
                          author:
                            href: "/api/v3/users/1"
                            title: OpenProject Admin
                          container:
                            href: "/api/v3/meetings/72"
                            title: meeting
                          delete:
                            href: "/api/v3/attachments/376"
                            method: delete
                          downloadLocation:
                            href: "/api/v3/attachments/376/content"
                          self:
                            href: "/api/v3/attachments/376"
                            title: 200.gif
                        _type: Attachment
                        contentType: image/gif
                        createdAt: '2018-06-01T07:24:19.896Z'
                        description:
                          format: plain
                          html: ''
                          raw: ''
                        digest:
                          algorithm: md5
                          hash: 7ac9c97ef73d47127f590788b84c0c1c
                        fileName: some.gif
                        fileSize: 3521772
                        id: 376
                    _links:
                      self:
                        href: "/api/v3/meetings/72/attachments"
                    _type: Collection
                    count: 1
                    total: 1
              schema:
                "$ref": "#/components/schemas/Attachments_Model"
          description: OK
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
          description: |-
            Returned if the meeting does not exist or the client does not have sufficient permissions
            to see it.

            **Required permission:** view meetings

            *Note: A client without sufficient permissions shall not be able to test for the existence of a meeting.
            That's why a 404 is returned here, even if a 403 might be more appropriate.*
          headers: {}
      tags:
      - Attachments
      description: ''
      operationId: List_attachments_by_meeting
      summary: List attachments by meeting
    post:
      parameters:
      - description: ID of the meeting to receive the attachment
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      author:
                        _links:
                          lock:
                            href: "/api/v3/users/1/lock"
                            method: post
                            title: Set lock on admin
                          self:
                            href: "/api/v3/users/1"
                            title: OpenProject Admin
                          showUser:
                            href: "/users/1"
                            type: text/html
                          updateImmediately:
                            href: "/api/v3/users/1"
                            method: patch
                            title: Update admin
                        _type: User
                        admin: true
                        avatar: ''
                        createdAt: '2015-03-20T12:56:52.343Z'
                        email:
                        firstName: OpenProject
                        id: 1
                        identityUrl:
                        lastName: Admin
                        login: admin
                        name: OpenProject Admin
                        status: active
                        updatedAt: '2018-05-29T13:57:44.662Z'
                      container:
                        _links:
                          addAttachment:
                            href: "/api/v3/meetings/72/attachments"
                            method: post
                          attachments:
                            href: "/api/v3/meetings/72/attachments"
                          project:
                            href: "/api/v3/projects/12"
                            title: Demo project
                          self:
                            href: "/api/v3/meetings/72"
                        _type: Meeting
                        id: 72
                        title: meeting
                    _links:
                      author:
                        href: "/api/v3/users/1"
                        title: OpenProject Admin
                      container:
                        href: "/api/v3/meetings/72"
                        title: meeting
                      delete:
                        href: "/api/v3/attachments/376"
                        method: delete
                      downloadLocation:
                        href: "/api/v3/attachments/376/content"
                      self:
                        href: "/api/v3/attachments/376"
                        title: 200.gif
                    _type: Attachment
                    contentType: image/gif
                    createdAt: '2018-06-01T07:24:19.896Z'
                    description:
                      format: plain
                      html: ''
                      raw: ''
                    digest:
                      algorithm: md5
                      hash: 7ac9c97ef73d47127f590788b84c0c1c
                    fileName: some.gif
                    fileSize: 3521772
                    id: 376
          description: OK
          headers: {}
        '400':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:InvalidRequestBody
                    message: The request could not be parsed as JSON.
          description: |-
            Returned if the client sends a not understandable request. Reasons include:

            * Omitting one of the required parts (metadata and file)

            * sending unparsable JSON in the metadata part
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not allowed to delete this attachment.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** edit meetings

            *Note that you will only receive this error, if you are at least allowed to see the meeting*
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
          description: |-
            Returned if the meeting does not exist or the client does not have sufficient permissions
            to see it.

            **Required permission:** view meetings

            *Note: A client without sufficient permissions shall not be able to test for the existence of a meeting
            That's why a 404 is returned here, even if a 403 might be more appropriate.*
          headers: {}
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
        '422':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation
                    message: File is too large (maximum size is 5242880 Bytes).
          description: |-
            Returned if the client tries to send an invalid attachment.
            Reasons are:

            * Omitting the file name (`fileName` property of metadata part)

            * Sending a file that is too large
          headers: {}
      tags:
      - Attachments
      description: Adds an attachment with the meeting as its container.
      operationId: Add_attachment_to_meeting
      summary: Add attachment to meeting
  "/api/v3/memberships":
    get:
      summary: List memberships
      operationId: list_memberships
      tags:
      - Memberships
      description: |-
        Returns a collection of memberships. The client can choose to filter
        the memberships similar to how work packages are filtered. In addition to the
        provided filters, the server will reduce the result set to only contain memberships,
        for which the requesting client has sufficient permissions (*view_members*, *manage_members*).
      parameters:
      - name: filters
        in: query
        required: false
        schema:
          type: string
        description: |-
          JSON specifying filter conditions.
          Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/)
          endpoint. Currently supported filters are:

          + any_name_attribute: filters memberships based on the name of the principal. All possible name variants
            (and also email and login) are searched.
          + blocked: reduces the result set to all memberships that are temporarily blocked or that are not blocked
            temporarily.
          + group: filters memberships based on the name of a group. The group however is not the principal used for
            filtering. Rather, the memberships of the group are used as the filter values.
          + name: filters memberships based on the name of the principal. Note that only the name is used which depends
            on a setting in the OpenProject instance.
          + principal: filters memberships based on the id of the principal.
          + project: filters memberships based on the id of the project.
          + role: filters memberships based on the id of any role assigned to the membership.
          + status: filters memberships based on the status of the principal.
          + created_at: filters memberships based on the time the membership was created.
          + updated_at: filters memberships based on the time the membership was updated last.
        examples:
          name-filter:
            summary: Filtering on the name of the principal
            value: '[{ "name": { "operator": "=", "values": ["A User"] }" }]'
          global-memberships:
            summary: Get memberships for global roles
            value: '[{ "project": { "operator": "!*", "values": null }" }]'
      - name: sortBy
        in: query
        required: false
        schema:
          default: '[["id", "asc"]]'
          type: string
        description: |-
          JSON specifying sort criteria.
          Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/)
          endpoint. Currently supported sorts are:

          + id: Sort by primary key
          + name: Sort by the name of the principal. Note that this depends on the setting for how the name is to be
            displayed at least for users.
          + email: Sort by the email address of the principal. Groups and principal users, which do not have an email,
            are sorted last.
          + status: Sort by the status of the principal. Groups and principal users, which do not have a status, are
            sorted together with the active users.
          + created_at: Sort by membership creation datetime
          + updated_at: Sort by the time the membership was updated last
        example: '[["id", "asc"]]'
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/MembershipCollectionModel"
              examples:
                simple membership collection:
                  "$ref": "#/components/examples/MembershipSimpleCollectionResponse"
        '400':
          "$ref": "#/components/responses/InvalidQuery"
        '403':
          description: Returned if the client is not logged in and login is required.
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not authorized to view this resource.
    post:
      summary: Create a membership
      operationId: create_membership
      tags:
      - Memberships
      description: |-
        Creates a new membership applying the attributes provided in the body.

        You can use the form and schema to retrieve the valid attribute values and by that be guided towards successful
        creation.

        By providing a `notificationMessage` within the `_meta` block of the payload, the client can include a customized
        message to the user of the newly created membership. In case of a group, the message will be sent to every user
        belonging to the group.

        By including `{ "sendNotifications": false }` within the `_meta` block of the payload, no notifications is send
        out at all.
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/MembershipWriteModel"
            examples:
              global role:
                "$ref": "#/components/examples/MembershipCreateRequestGlobalRole"
              no notification:
                "$ref": "#/components/examples/MembershipCreateRequestNoNotification"
              custom message:
                "$ref": "#/components/examples/MembershipCreateRequestCustomMessage"
      responses:
        '201':
          description: Created
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/MembershipReadModel"
              examples:
                simple membership:
                  "$ref": "#/components/examples/MembershipSimpleResponse"
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** Manage members
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
        '422':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _embedded:
                  details:
                    attribute: project
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation
                message: Project can't be blank.
          description: |-
            Returned if:

            - a constraint for a property was violated (`PropertyConstraintViolation`)
  "/api/v3/memberships/available_projects":
    get:
      summary: Available projects for memberships
      operationId: get_memberships_available_projects
      tags:
      - Memberships
      description: |-
        Gets a list of projects in which a membership can be created in. The list contains all projects in which the user
        issuing the request has the manage members permissions.
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ProjectCollectionModel"
              examples:
                simple project collection:
                  "$ref": "#/components/examples/ProjectCollection"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** manage members
  "/api/v3/memberships/form":
    post:
      summary: Form create membership
      operationId: form_create_membership
      tags:
      - Memberships
      description: |-
        Requests and validates the creation form for memberships. The request payload, if sent, is validated. The form
        endpoint itself does not create a membership.
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/MembershipWriteModel"
            examples:
              global role:
                "$ref": "#/components/examples/MembershipCreateRequestGlobalRole"
              no notification:
                "$ref": "#/components/examples/MembershipCreateRequestNoNotification"
              custom message:
                "$ref": "#/components/examples/MembershipCreateRequestCustomMessage"
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/MembershipFormModel"
              examples:
                form:
                  "$ref": "#/components/examples/MembershipFormResponse"
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** manage memberships in any project
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
  "/api/v3/memberships/schema":
    get:
      summary: Schema membership
      operationId: get_membership_schema
      tags:
      - Memberships
      description: Retrieves the schema for the membership resource object.
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/MembershipSchemaModel"
              examples:
                schema:
                  "$ref": "#/components/examples/MembershipSchemaResponse"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions to see the schema.

            **Required permission:** manage members or view memberships on any project
  "/api/v3/memberships/{id}":
    delete:
      summary: Delete membership
      operationId: delete_membership
      tags:
      - Memberships
      description: Deletes the membership.
      parameters:
      - name: id
        description: Membership id
        in: path
        required: true
        example: 1
        schema:
          type: integer
      responses:
        '204':
          description: Returned if the membership was successfully deleted
        '403':
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** manage members
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not authorized to access this resource.
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The requested resource could not be found.
          description: |-
            Returned if the membership does not exist or the client does not have sufficient permissions
            to see it.

            **Required permission:** view members

            *Note: A client without sufficient permissions shall not be able to test for the existence of
            a version. That's why a 404 is returned here, even if a 403 might be more appropriate.*
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
    get:
      summary: Get a membership
      operationId: get_membership
      description: Retrieves a membership resource identified by the given id.
      tags:
      - Memberships
      parameters:
      - name: id
        description: Membership id
        in: path
        required: true
        example: 1
        schema:
          type: integer
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/MembershipReadModel"
              examples:
                simple membership:
                  "$ref": "#/components/examples/MembershipSimpleResponse"
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The requested resource could not be found.
          description: |-
            Returned if the membership does not exist or the client does not have sufficient permissions
            to see it.

            **Required permission:** view members **or** manage members

            *Note: A client without sufficient permissions shall not be able to test for the existence of
            a membership. That's why a 404 is returned here, even if a 403 might be more appropriate.*
    patch:
      summary: Update membership
      operationId: update_membership
      description: |-
        Updates the given membership by applying the attributes provided in the body.

        By providing a `notificationMessage` within the `_meta` block of the payload, the client can include a customized message to the user
        of the updated membership. In case of a group, the message will be sent to every user belonging to the group.

        By including `{ "sendNotifications": false }` within the `_meta` block of the payload, no notifications is send out at all.
      tags:
      - Memberships
      parameters:
      - name: id
        description: Membership id
        in: path
        required: true
        example: 1
        schema:
          type: integer
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/MembershipWriteModel"
            examples:
              add roles:
                "$ref": "#/components/examples/MembershipUpdateAdditionalRoles"
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/MembershipReadModel"
              examples:
                simple membership:
                  "$ref": "#/components/examples/MembershipSimpleResponse"
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** Manage members in the membership's project.
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The requested resource could not be found.
          description: |-
            Returned if the membership does not exist or the client does not have sufficient permissions
            to see it.

            **Required permission:** view member

            *Note: A client without sufficient permissions shall not be able to test for the existence of
            a version. That's why a 404 is returned here, even if a 403 might be more appropriate.*
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
        '422':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _embedded:
                  details:
                    attribute: roles
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation
                message: Roles has an unassignable role.
          description: |-
            Returned if:

            * a constraint for a property was violated (`PropertyConstraintViolation`)
  "/api/v3/memberships/{id}/form":
    post:
      summary: Form update membership
      operationId: form_update_membership
      tags:
      - Memberships
      description: |-
        Requests and validates the update form for a membership identified by the given id. The request payload, if sent,
        is validated. The form endpoint itself does not change the membership.
      parameters:
      - name: id
        description: Membership id
        in: path
        required: true
        example: 1
        schema:
          type: integer
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/MembershipWriteModel"
            examples:
              no notification:
                "$ref": "#/components/examples/MembershipCreateRequestNoNotification"
              custom message:
                "$ref": "#/components/examples/MembershipCreateRequestCustomMessage"
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/MembershipReadModel"
              examples:
                simple membership:
                  "$ref": "#/components/examples/MembershipSimpleResponse"
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** manage versions in the version's project
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
  "/api/v3/my_preferences":
    get:
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _links:
                      self:
                        href: "/api/v3/my_preferences"
                      user:
                        href: "/api/v3/users/1"
                        title: John Sheppard
                      updateImmediately:
                        href: "/api/v3/users/3/preferences"
                        method: patch
                    _type: UserPreferences
                    commentSortDescending: true
                    disableKeyboardShortcuts: false
                    timeZone: Europe/Berlin
                    warnOnLeavingUnsaved: true
                    notifications:
                      watched: false
                      involved: true
                      mentioned: false
                      shared: true
                      newsAdded: false,
                      newsCommented: false
                      documentAdded: false
                      forumMessages: false
                      wikiPageAdded: false
                      wikiPageUpdated: false
                      membershipAdded: false
                      membershipUpdated: false
                      workPackageCommented: false
                      workPackageProcessed: false
                      workPackagePrioritized: false
                      workPackageScheduled: false
                      _links:
                        project:
                          href:
              schema:
                "$ref": "#/components/schemas/UserPreferencesModel"
          description: OK
          headers: {}
        '401':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:Unauthenticated
                    message: You need to be authenticated to access this resource.
          description: Returned if no user is currently authenticated
          headers: {}
      tags:
      - UserPreferences
      description: ''
      operationId: Show_my_preferences
      summary: Show my preferences
    patch:
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _links:
                      self:
                        href: "/api/v3/my_preferences"
                      user:
                        href: "/api/v3/users/1"
                        title: John Sheppard
                      updateImmediately:
                        href: "/api/v3/users/3/preferences"
                        method: patch
                    _type: UserPreferences
                    commentSortDescending: true
                    disableKeyboardShortcuts: false
                    timeZone: Europe/Berlin
                    warnOnLeavingUnsaved: true
                    notifications:
                      watched: false
                      involved: true
                      mentioned: false
                      shared: true
                      newsAdded: false,
                      newsCommented: false
                      documentAdded: false
                      forumMessages: false
                      wikiPageAdded: false
                      wikiPageUpdated: false
                      membershipAdded: false
                      membershipUpdated: false
                      workPackageCommented: false
                      workPackageProcessed: false
                      workPackagePrioritized: false
                      workPackageScheduled: false
                      _links:
                        project:
                          href:
              schema:
                "$ref": "#/components/schemas/UserPreferencesModel"
          description: OK
          headers: {}
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '401':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:Unauthenticated
                    message: You need to be authenticated to access this resource.
          description: Returned if no user is currently authenticated
          headers: {}
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
        '422':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation
                    message: Time zone is not set to one of the allowed values.
          description: |-
            Returned if the update contains invalid properties.
            Reasons are:

            * Specifying an invalid type

            * Using an unknown time zone
          headers: {}
      tags:
      - UserPreferences
      description: When calling this endpoint the client provides a single object,
        containing the properties that it wants to change, in the body.
      operationId: Update_UserPreferences
      requestBody:
        content:
          application/json:
            schema:
              example:
                autoHidePopups: true
                timeZone: Europe/Paris
              properties:
                autoHidePopups:
                  type: boolean
                timeZone:
                  type: string
              type: object
      summary: Update my preferences
  "/api/v3/news":
    get:
      parameters:
      - description: Page number inside the requested collection.
        example: '25'
        in: query
        name: offset
        required: false
        schema:
          default: 1
          type: integer
      - description: Number of elements to display per page.
        example: '25'
        in: query
        name: pageSize
        required: false
        schema:
          type: integer
      - description: |-
          JSON specifying sort criteria.
          Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported sorts are:

          + id: Sort by primary key

          + created_at: Sort by news creation datetime
        example: '[["created_at", "asc"]]'
        in: query
        name: sortBy
        required: false
        schema:
          type: string
      - description: |-
          JSON specifying filter conditions.
          Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported filters are:

          + project_id: Filter news by project
        example: '[{ "project_id": { "operator": "=", "values": ["1", "2"] } }]'
        in: query
        name: filters
        required: false
        schema:
          type: string
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      elements:
                      - _links:
                          author:
                            href: "/api/v3/users/2"
                            title: Peggie Feeney
                          project:
                            href: "/api/v3/projects/1"
                            title: Seeded Project
                          self:
                            href: "/api/v3/news/1"
                            title: asperiores possimus nam doloribus ab
                        _type: News
                        createdAt: '2015-03-20T12:57:01.209Z'
                        description:
                          format: markdown
                          html: "<p>Videlicet deserunt aequitas cognatus. Concedo
                            quia est quia pariatur vorago vallum. Calco autem atavus
                            accusamus conscendo cornu ulterius. Tam patria ago consectetur
                            ventito sustineo nihil caecus. Supra officiis eos velociter
                            somniculosus tonsor qui. Suffragium aduro arguo angustus
                            cogito quia tolero vulnus. Supplanto sortitus cresco apud
                            vestrum qui.</p>"
                          raw: Videlicet deserunt aequitas cognatus. Concedo quia
                            est quia pariatur vorago vallum. Calco autem atavus accusamus
                            conscendo cornu ulterius. Tam patria ago consectetur ventito
                            sustineo nihil caecus. Supra officiis eos velociter somniculosus
                            tonsor qui. Suffragium aduro arguo angustus cogito quia
                            tolero vulnus. Supplanto sortitus cresco apud vestrum
                            qui.
                        id: 1
                        summary: Celebrer spiculum colo viscus claustrum atque. Id
                          nulla culpa sumptus. Comparo crapula depopulo demonstro.
                        title: asperiores possimus nam doloribus ab
                      - _links:
                          author:
                            href: "/api/v3/users/2"
                            title: Peggie Feeney
                          project:
                            href: "/api/v3/projects/1"
                            title: Seeded Project
                          self:
                            href: "/api/v3/news/2"
                            title: terminatio tutamen. Officia adeptio sp
                        _type: News
                        createdAt: '2015-03-20T12:57:01.262Z'
                        description:
                          format: markdown
                          html: "<p>Amicitia alius cattus voluntarius. Virgo viduo
                            terminatio tutamen. Officia adeptio spectaculum atavus
                            nisi cum concido bis. Harum caecus auxilium sol theatrum
                            eaque consequatur. Omnis aeger suus adipisci cicuta. Cur
                            delicate alias curto cursim atqui talio fugiat.</p>"
                          raw: Amicitia alius cattus voluntarius. Virgo viduo terminatio
                            tutamen. Officia adeptio spectaculum atavus nisi cum concido
                            bis. Harum caecus auxilium sol theatrum eaque consequatur.
                            Omnis aeger suus adipisci cicuta. Cur delicate alias curto
                            cursim atqui talio fugiat.
                        id: 2
                        summary: Consequatur sequi surculus creo tui aequitas.
                        title: terminatio tutamen. Officia adeptio sp
                    _links:
                      changeSize:
                        href: "/api/v3/news?offset=1&pageSize=%7Bsize%7D"
                        templated: true
                      jumpTo:
                        href: "/api/v3/news?offset=%7Boffset%7D&pageSize=2"
                        templated: true
                      nextByOffset:
                        href: "/api/v3/news?offset=2&pageSize=2"
                      self:
                        href: "/api/v3/news?offset=1&pageSize=2"
                    _type: Collection
                    count: 2
                    offset: 1
                    pageSize: 2
                    total: 78
              schema:
                "$ref": "#/components/schemas/List_of_NewsModel"
          description: OK
          headers: {}
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to view this resource.
          description: Returned if the client is not logged in and login is required.
          headers: {}
      tags:
      - News
      description: Lists news. The news returned depend on the provided parameters
        and also on the requesting user's permissions.
      operationId: List_News
      summary: List News
    post:
      summary: Create News
      operationId: create_news
      tags:
      - News
      description: |-
        Creates a news entry. Only administrators and users with "Manage news" permission in the given project are eligible.
        When calling this endpoint the client provides a single object, containing at least the properties and links that are required, in the body.
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/NewsCreateModel"
      responses:
        '201':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/NewsModel"
          description: Created
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not allowed to create new news.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** Administrator, Manage news permission in the project
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
        '422':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _embedded:
                  details:
                    attribute: title
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation
                message: Title can't be blank.
          description: |-
            Returned if:

            * the client tries to modify a read-only property (`PropertyIsReadOnly`)

            * a constraint for a property was violated (`PropertyConstraintViolation`)
  "/api/v3/news/{id}":
    get:
      parameters:
      - description: news id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      author:
                        _type: User...
                      project:
                        _type: Project...
                    _links:
                      author:
                        href: "/api/v3/users/2"
                        title: Peggie Feeney
                      project:
                        href: "/api/v3/projects/1"
                        title: A project
                      self:
                        href: "/api/v3/news/1"
                        title: asperiores possimus nam doloribus ab
                    _type: News
                    createdAt: '2015-03-20T12:57:01.601Z'
                    description:
                      format: markdown
                      html: "<p>Videlicet deserunt aequitas cognatus. Concedo quia
                        est quia pariatur vorago vallum. Calco autem atavus accusamus
                        conscendo cornu ulterius. Tam patria ago consectetur ventito
                        sustineo nihil caecus. Supra officiis eos velociter somniculosus
                        tonsor qui. Suffragium aduro arguo angustus cogito quia tolero
                        vulnus. Supplanto sortitus cresco apud vestrum qui.</p>"
                      raw: Videlicet deserunt aequitas cognatus. Concedo quia est
                        quia pariatur vorago vallum. Calco autem atavus accusamus
                        conscendo cornu ulterius. Tam patria ago consectetur ventito
                        sustineo nihil caecus. Supra officiis eos velociter somniculosus
                        tonsor qui. Suffragium aduro arguo angustus cogito quia tolero
                        vulnus. Supplanto sortitus cresco apud vestrum qui.
                    id: 1
                    summary: Celebrer spiculum colo viscus claustrum atque. Id nulla
                      culpa sumptus. Comparo crapula depopulo demonstro.
                    title: asperiores possimus nam doloribus ab
              schema:
                "$ref": "#/components/schemas/NewsModel"
          description: OK
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
          description: |-
            Returned if the news does not exist or if the user does not have permission to view it.

            **Required permission** being member of the project the news belongs to
          headers: {}
      tags:
      - News
      description: ''
      operationId: View_news
      summary: View news
    patch:
      summary: Update news
      operationId: update_news
      tags:
      - News
      description: |-
        Updates the news's writable attributes.
        When calling this endpoint the client provides a single object, containing the properties and links to be updated, in the body.
      parameters:
      - description: News id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/NewsCreateModel"
      responses:
        '200':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/NewsModel"
          description: OK
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not allowed to update this news.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** Administrators, Manage news permission
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The specified news does not exist or you do not have permission
                  to view it.
          description: |-
            Returned if the news entry does not exist or if the API user does not have the necessary permissions to update it.

            **Required permission:** Administrators, Manage news permission
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
        '422':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _embedded:
                  details:
                    attribute: title
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation
                message: Title can't be blank.
          description: |-
            Returned if:

            * the client tries to modify a read-only property (`PropertyIsReadOnly`)

            * a constraint for a property was violated (`PropertyConstraintViolation`)
    delete:
      summary: Delete news
      operationId: delete_news
      description: Permanently deletes the specified news entry.
      tags:
      - News
      parameters:
      - description: News id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '202':
          description: |-
            Returned if the news was deleted successfully.

            Note that the response body is empty as of now. In future versions of the API a body
            *might* be returned, indicating the progress of deletion.
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not allowed to delete this news entry
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** Administrators and Manage news permission
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The specified news does not exist.
          description: Returned if the news does not exist.
  "/api/v3/notifications":
    get:
      summary: Get notification collection
      operationId: list_notifications
      tags:
      - Notifications
      description: |-
        Returns the collection of available in-app notifications. The notifications returned depend on the provided
        parameters and also on the requesting user's permissions.

        Contrary to most collections, this one also links to and embeds schemas for the `details` properties of the notifications returned.
        This is an optimization. Clients will receive the information necessary to display the various types of details that a notification
        can carry.
      parameters:
      - name: offset
        description: Page number inside the requested collection.
        in: query
        example: 25
        required: false
        schema:
          default: 1
          type: integer
      - name: pageSize
        description: Number of elements to display per page.
        in: query
        example: 25
        required: false
        schema:
          default: 20
          type: integer
      - name: sortBy
        in: query
        description: |-
          JSON specifying sort criteria.
          Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported sorts are:

          + id: Sort by primary key

          + reason: Sort by notification reason

          + readIAN: Sort by read status
        example: '[["reason", "asc"]]'
        required: false
        schema:
          type: string
      - name: groupBy
        in: query
        description: |-
          string specifying group_by criteria.

          + reason: Group by notification reason

          + project: Sort by associated project
        example: reason
        required: false
        schema:
          type: string
      - name: filters
        in: query
        description: |-
          JSON specifying filter conditions.
          Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported filters are:

          + id: Filter by primary key

          + project: Filter by the project the notification was created in

          + readIAN: Filter by read status

          + reason: Filter by the reason, e.g. 'mentioned' or 'assigned' the notification was created because of

          + resourceId: Filter by the id of the resource the notification was created for. Ideally used together with the `resourceType` filter.

          + resourceType: Filter by the type of the resource the notification was created for. Ideally used together with the `resourceId` filter.
        example: '[{ "readIAN": { "operator": "=", "values": ["t"] } }]'
        required: false
        schema:
          type: string
      responses:
        '200':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/NotificationCollectionModel"
              examples:
                Collection of notifications:
                  "$ref": "#/components/examples/NotificationCollection"
          description: OK
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not authorized to view this resource.
          description: Returned if the client is not logged in and login is required.
        '422':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:InvalidQuery
                message: Filters Invalid filter does not exist.
          description: Returned if the client sends invalid request parameters e.g.
            filters
  "/api/v3/notifications/read_ian":
    post:
      summary: Read all notifications
      operationId: read_notifications
      tags:
      - Notifications
      description: |-
        Marks the whole notification collection as read. The collection contains only elements the authenticated user can
        see, and can be further reduced with filters.
      parameters:
      - name: filters
        in: query
        description: |-
          JSON specifying filter conditions.
          Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/)
          endpoint. Currently supported filters are:

          + id: Filter by primary key

          + project: Filter by the project the notification was created in

          + reason: Filter by the reason, e.g. 'mentioned' or 'assigned' the notification was created because of

          + resourceId: Filter by the id of the resource the notification was created for. Ideally used together with the
            `resourceType` filter.

          + resourceType: Filter by the type of the resource the notification was created for. Ideally used together with
            the `resourceId` filter.
        example: '[{ "reason": { "operator": "=", "values": ["mentioned"] } }]'
        required: false
        schema:
          type: string
      responses:
        '204':
          description: OK
        '400':
          description: Returned if the request is not properly formatted.
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:InvalidQuery
                message:
                - Filters Invalid filter does not exist.
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
  "/api/v3/notifications/unread_ian":
    post:
      summary: Unread all notifications
      operationId: unread_notifications
      tags:
      - Notifications
      description: |-
        Marks the whole notification collection as unread. The collection contains only elements the authenticated user can
        see, and can be further reduced with filters.
      parameters:
      - name: filters
        in: query
        description: |-
          JSON specifying filter conditions.
          Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/)
          endpoint. Currently supported filters are:

          + id: Filter by primary key

          + project: Filter by the project the notification was created in

          + reason: Filter by the reason, e.g. 'mentioned' or 'assigned' the notification was created because of

          + resourceId: Filter by the id of the resource the notification was created for. Ideally used together with the
            `resourceType` filter.

          + resourceType: Filter by the type of the resource the notification was created for. Ideally used together with
            the `resourceId` filter.
        example: '[{ "reason": { "operator": "=", "values": ["mentioned"] } }]'
        required: false
        schema:
          type: string
      responses:
        '204':
          description: OK
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
  "/api/v3/notifications/{id}":
    get:
      summary: Get the notification
      operationId: view_notification
      tags:
      - Notifications
      description: Returns the notification identified by the notification id.
      parameters:
      - name: id
        in: path
        description: notification id
        example: '1'
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/NotificationModel"
              examples:
                Date alert notification:
                  "$ref": "#/components/examples/DateAlertNotification"
                Mentioned notification:
                  "$ref": "#/components/examples/MentionedNotification"
          description: OK
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The requested resource could not be found.
          description: |-
            Returned if the notification does not exist or if the user does not have permission to view it.

            **Required permission** being recipient of the notification
  "/api/v3/notifications/{notification_id}/details/{id}":
    get:
      summary: Get a notification detail
      operationId: view_notification_detail
      tags:
      - Notifications
      - Values::Property
      description: Returns an individual detail of a notification identified by the
        notification id and the id of the detail.
      parameters:
      - name: notification_id
        in: path
        description: notification id
        example: '1'
        required: true
        schema:
          type: integer
      - name: id
        in: path
        description: detail id
        example: '0'
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ValuesPropertyModel"
              examples:
                Start date notification detail:
                  "$ref": "#/components/examples/ValuesPropertyStartDate"
                Due date notification detail:
                  "$ref": "#/components/examples/ValuesPropertyDueDate"
                Date notification detail for milestone work package:
                  "$ref": "#/components/examples/ValuesPropertyDate"
          description: OK
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The requested resource could not be found.
          description: |-
            Returned if the notification or the detail of it does not exist or if the user does not have permission to view it.

            **Required permission** being recipient of the notification
  "/api/v3/notifications/{id}/read_ian":
    post:
      summary: Read notification
      operationId: read_notification
      tags:
      - Notifications
      description: Marks the given notification as read.
      parameters:
      - name: id
        in: path
        description: notification id
        example: '1'
        required: true
        schema:
          type: integer
      responses:
        '204':
          description: OK
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The requested resource could not be found.
          description: |-
            Returned if the notification does not exist or if the user does not have permission to view it.

            **Required permission** being recipient of the notification
  "/api/v3/notifications/{id}/unread_ian":
    post:
      summary: Unread notification
      operationId: unread_notification
      tags:
      - Notifications
      description: Marks the given notification as unread.
      parameters:
      - name: id
        in: path
        description: notification id
        example: '1'
        required: true
        schema:
          type: integer
      responses:
        '204':
          description: OK
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The requested resource could not be found.
          description: |-
            Returned if the notification does not exist or if the user does not have permission to view it.

            **Required permission** being recipient of the notification
  "/api/v3/oauth_applications/{id}":
    get:
      summary: Get the oauth application.
      operationId: get_oauth_application
      tags:
      - OAuth 2
      description: |-
        Retrieves the OAuth 2 provider application for the given identifier. The secret will not be part of the response,
        instead a `confidential` flag is indicating, whether there is a secret or not.
      parameters:
      - name: id
        description: OAuth application id
        in: path
        required: true
        schema:
          type: integer
        example: 1337
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/OAuthApplicationReadModel"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** admin
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The requested resource could not be found.
          description: Returned if the application does not exist.
  "/api/v3/oauth_client_credentials/{id}":
    get:
      summary: Get the oauth client credentials object.
      operationId: get_oauth_client_credentials
      tags:
      - OAuth 2
      description: |-
        Retrieves the OAuth 2 client credentials for the given identifier. The secret will not be part of the response,
        instead a `confidential` flag is indicating, whether there is a secret or not.
      parameters:
      - name: id
        description: OAuth Client Credentials id
        in: path
        required: true
        schema:
          type: integer
        example: 1337
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/OAuthClientCredentialsReadModel"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** admin
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The requested resource could not be found.
          description: Returned if the object does not exist.
  "/api/v3/placeholder_users":
    get:
      summary: List placehoder users
      operationId: list_placeholder_users
      tags:
      - Principals
      description: |-
        List all placeholder users. This can only be accessed if the requesting user has the global permission
        `manage_placeholder_user` or `manage_members` in any project.
      parameters:
      - name: filters
        description: |-
          JSON specifying filter conditions.
          Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint.
          Currently supported filters are:

          - name: filters placeholder users by the name.
          - group: filters placeholder by the group it is contained in.
          - status: filters placeholder by the status it has.
        in: query
        required: false
        schema:
          type: string
        example: '[{ "name": { "operator": "~", "values": ["Darth"] } }]'
      - name: select
        description: Comma separated list of properties to include.
        in: query
        required: false
        schema:
          type: string
        example: total,elements/name,elements/self,self
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/PrincipalCollectionModel"
        '400':
          description: Returned if the client sends invalid request parameters e.g.
            filters
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:InvalidQuery
                message: Filters Invalid filter does not exist.
    post:
      summary: Create placeholder user
      operationId: create_placeholder_user
      tags:
      - Principals
      description: |-
        Creates a new placeholder user. Only administrators and users with `manage_placeholder_user` global permission are
        allowed to do so. When calling this endpoint the client provides a single object, containing at least the
        properties and links that are required, in the body.
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/PlaceholderUserCreateModel"
      responses:
        '201':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/PlaceholderUserModel"
          description: Created
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not allowed to create new placeholder users.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** Administrator
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
        '422':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _embedded:
                  details:
                    attribute: name
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation
                message: Name has already been taken.
          description: |-
            Returned if:

            * a constraint for a property was violated (`PropertyConstraintViolation`)
  "/api/v3/placeholder_users/{id}":
    delete:
      summary: Delete placeholder user
      operationId: delete_placeholder_user
      description: Set the specified placeholder user to deleted status.
      tags:
      - Principals
      parameters:
      - description: Placeholder user id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '202':
          description: |-
            Returned if the group was marked for deletion.

            Note that the response body is empty as of now. In future versions of the API a body
            *might* be returned, indicating the progress of deletion.
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not allowed to delete the account of this user.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** `manage_placeholder_users`
        '404':
          description: Returned if the placeholder user does not exist.
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The specified placeholder user does not exist.
    get:
      summary: View placeholder user
      operationId: view_placeholder_user
      description: Return the placeholder user resource.
      tags:
      - Principals
      parameters:
      - description: The placeholder user id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: string
      responses:
        '200':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/PlaceholderUserModel"
              examples:
                placeholder user response:
                  "$ref": "#/components/examples/PlaceholderUserResponse"
          description: OK
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The specified placeholder user does not exist or you do not
                  have permission to view them.
          description: |-
            Returned if the user does not exist or if the API user does not have permission to view them.

            **Required permission**: `manage_placeholder_users`
    patch:
      summary: Update placeholder user
      operationId: update_placeholder_user
      tags:
      - Principals
      description: |-
        Updates the placeholder user's writable attributes.
        When calling this endpoint the client provides a single object, containing at least the properties and links
        that are required, in the body.
      parameters:
      - description: Placeholder user id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/PlaceholderUserCreateModel"
      responses:
        '200':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/PlaceholderUserModel"
          description: OK
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not allowed to update the account of this user.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission**: `manage_placeholder_users`
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The specified placeholder user does not exist.
          description: Returned if the placeholder user does not exist.
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
        '422':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _embedded:
                  details:
                    attribute: name
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation
                message: Name has already been taken.
          description: |-
            Returned if:

            - the client tries to modify a read-only property (`PropertyIsReadOnly`)
            - a constraint for a property was violated (`PropertyConstraintViolation`)
  "/api/v3/posts/{id}":
    get:
      parameters:
      - description: Post's identifier
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      project:
                        _type: Project...
                    _links:
                      addAttachment:
                        href: "/api/v3/posts/1/attachments"
                        method: post
                      attachments:
                        href: "/api/v3/posts/1/attachments"
                      project:
                        href: "/api/v3/projects/1"
                        title: A project with a title
                      self:
                        href: "/api/v3/posts/1"
                    _type: Post
                    id: 1
                    subject: A post with a subject
              schema:
                "$ref": "#/components/schemas/PostModel"
          description: OK
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
          description: |-
            Returned if the post does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view messages in the post's project
          headers: {}
      tags:
      - Posts
      description: Retrieve an individual post as identified by the id parameter
      operationId: View_Post
      summary: View Post
  "/api/v3/posts/{id}/attachments":
    get:
      parameters:
      - description: ID of the post whose attachments will be listed
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      elements:
                      - _links:
                          author:
                            href: "/api/v3/users/1"
                            title: OpenProject Admin
                          container:
                            href: "/api/v3/posts/72"
                            title: wiki
                          delete:
                            href: "/api/v3/attachments/376"
                            method: delete
                          downloadLocation:
                            href: "/api/v3/attachments/376/content"
                          self:
                            href: "/api/v3/attachments/376"
                            title: 200.gif
                        _type: Attachment
                        contentType: image/gif
                        createdAt: '2018-06-01T07:24:19.706Z'
                        description:
                          format: plain
                          html: ''
                          raw: ''
                        digest:
                          algorithm: md5
                          hash: 7ac9c97ef73d47127f590788b84c0c1c
                        fileName: some.gif
                        fileSize: 3521772
                        id: 376
                    _links:
                      self:
                        href: "/api/v3/posts/72/attachments"
                    _type: Collection
                    count: 1
                    total: 1
              schema:
                "$ref": "#/components/schemas/Attachments_Model"
          description: OK
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
          description: |-
            Returned if the post does not exist or the client does not have sufficient permissions
            to see it.

            **Required permission:** view messages

            *Note: A client without sufficient permissions shall not be able to test for the existence of a post.
            That's why a 404 is returned here, even if a 403 might be more appropriate.*
          headers: {}
      tags:
      - Attachments
      description: ''
      operationId: List_attachments_by_post
      summary: List attachments by post
    post:
      parameters:
      - description: ID of the post to receive the attachment
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      author:
                        _links:
                          lock:
                            href: "/api/v3/users/1/lock"
                            method: post
                            title: Set lock on admin
                          self:
                            href: "/api/v3/users/1"
                            title: OpenProject Admin
                          showUser:
                            href: "/users/1"
                            type: text/html
                          updateImmediately:
                            href: "/api/v3/users/1"
                            method: patch
                            title: Update admin
                        _type: User
                        admin: true
                        avatar: ''
                        createdAt: '2015-03-20T12:56:52.850Z'
                        email:
                        firstName: OpenProject
                        id: 1
                        identityUrl:
                        lastName: Admin
                        login: admin
                        name: OpenProject Admin
                        status: active
                        updatedAt: '2018-05-29T13:57:44.604Z'
                      container:
                        _links:
                          addAttachment:
                            href: "/api/v3/posts/150/attachments"
                            method: post
                          attachments:
                            href: "/api/v3/posts/150/attachments"
                          project:
                            href: "/api/v3/projects/12"
                            title: Demo project
                          self:
                            href: "/api/v3/posts/150"
                        _type: Post
                        id: 150
                        subject: sfsdfsdfsdfsdf
                    _links:
                      author:
                        href: "/api/v3/users/1"
                        title: OpenProject Admin
                      container:
                        href: "/api/v3/posts/150"
                        title: sfsdfsdfsdfsdf
                      delete:
                        href: "/api/v3/attachments/377"
                        method: delete
                      downloadLocation:
                        href: "/api/v3/attachments/377/content"
                      self:
                        href: "/api/v3/attachments/377"
                        title: 200.gif
                    _type: Attachment
                    contentType: image/gif
                    createdAt: '2018-06-01T07:53:36.831Z'
                    description:
                      format: plain
                      html: ''
                      raw: ''
                    digest:
                      algorithm: md5
                      hash: 7ac9c97ef73d47127f590788b84c0c1c
                    fileName: some.gif
                    fileSize: 3521772
                    id: 377
          description: OK
          headers: {}
        '400':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:InvalidRequestBody
                    message: The request could not be parsed as JSON.
          description: |-
            Returned if the client sends a not understandable request. Reasons include:

            * Omitting one of the required parts (metadata and file)

            * sending unparsable JSON in the metadata part
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not allowed to delete this attachment.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** edit messages

            *Note that you will only receive this error, if you are at least allowed to see the wiki page*
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
          description: |-
            Returned if the post does not exist or the client does not have sufficient permissions
            to see it.

            **Required permission:** view messages

            *Note: A client without sufficient permissions shall not be able to test for the existence of a post.
            That's why a 404 is returned here, even if a 403 might be more appropriate.*
          headers: {}
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
        '422':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation
                    message: File is too large (maximum size is 5242880 Bytes).
          description: |-
            Returned if the client tries to send an invalid attachment.
            Reasons are:

            * Omitting the file name (`fileName` property of metadata part)

            * Sending a file that is too large
          headers: {}
      tags:
      - Attachments
      description: Adds an attachment with the post as its container.
      operationId: Add_attachment_to_post
      summary: Add attachment to post
  "/api/v3/principals":
    get:
      summary: List principals
      operationId: list_principals
      tags:
      - Principals
      description: |-
        List all principals. The client can choose to filter the principals similar to how work packages are filtered. In
        addition to the provided filters, the server will reduce the result set to only contain principals who are members
        in projects the client is allowed to see.
      parameters:
      - name: filters
        description: |-
          JSON specifying filter conditions.
          Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint.
          Currently supported filters are:

          - type: filters principals by their type (*User*, *Group*, *PlaceholderUser*).
          - member: filters principals by the projects they are members in.
          - name: filters principals by the user or group name.
          - any_name_attribute: filters principals by the user or group first- and last name, email or login.
          - status: filters principals by their status number (active = *1*, registered = *2*, locked = *3*, invited = *4*)
        in: query
        required: false
        schema:
          type: string
        example: '[{ "type": { "operator": "=", "values": ["User"] } }]'
      - name: select
        description: Comma separated list of properties to include.
        in: query
        required: false
        schema:
          type: string
        example: total,elements/name,elements/self,self
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/PrincipalCollectionModel"
        '400':
          description: Returned if the client sends invalid request parameters e.g.
            filters
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:InvalidQuery
                message: Filters Invalid filter does not exist.
  "/api/v3/priorities":
    get:
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                simple priority collection:
                  "$ref": "#/components/examples/PriorityCollection"
              schema:
                "$ref": "#/components/schemas/PriorityCollectionModel"
          description: OK
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not allowed to see the priorities.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** view work package (on any project)
          headers: {}
      tags:
      - Priorities
      description: ''
      operationId: List_all_Priorities
      summary: List all Priorities
  "/api/v3/priorities/{id}":
    get:
      parameters:
      - description: Priority id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _links:
                      self:
                        href: "/api/v3/priorities/1"
                        title: Low
                    _type: Priority
                    id: 1
                    isActive: true
                    isDefault: false
                    name: Low
                    position: 1
              schema:
                "$ref": "#/components/schemas/PriorityModel"
          description: OK
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not allowed to see this priority.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** view work package (on any project)
          headers: {}
      tags:
      - Priorities
      description: ''
      operationId: View_Priority
      summary: View Priority
  "/api/v3/project_phases/{id}":
    get:
      summary: Get a project phase
      operationId: get_project_phase
      tags:
      - Project Phases
      description: |-
        Gets a project phase resource. This resource contains an instance of a ProjectPhaseDefinition within a project which can
        then have project specific dates.
      parameters:
      - name: id
        description: Project phase id
        in: path
        required: true
        schema:
          type: integer
        example: 1337
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ProjectPhaseModel"
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The requested resource could not be found.
          description: |-
            Returned if the project phase does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view project phase
  "/api/v3/project_phase_definitions":
    get:
      summary: List project phase definitions
      operationId: list_project_phase_definitions
      tags:
      - Project Phase Definitions
      description: |-
        Returns a collection of all project phase definitions.
        The result set is always limited to only contain project phase definitions the client is allowed to see.
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ProjectPhaseDefinitionCollectionModel"
        '400':
          description: Returned if the client sends invalid request parameters e.g.
            filters
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:InvalidQuery
                message: Filters Invalid filter does not exist.
  "/api/v3/project_phase_definitions/{id}":
    get:
      summary: Get a project phase definition
      operationId: get_project_phase_definition
      tags:
      - Project Phase Definitions
      description: "Gets a project phase definition resource. This resource is part
        of the abstract definition of a project life\ncycle shaping the phases of
        a project. "
      parameters:
      - name: id
        description: Project phase definition id
        in: path
        required: true
        schema:
          type: integer
        example: 1337
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ProjectPhaseDefinitionModel"
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not authorized to access this resource.
          description: |-
            Returned if the user does not have permission to see project phases.

            **Required permission:** view project phase OR select project phase
  "/api/v3/project_storages":
    get:
      summary: Gets a list of project storages
      operationId: list_project_storages
      tags:
      - File Links
      description: Gets a collection of all project storages that meet the provided
        filters and the user has permission to see them.
      parameters:
      - name: filters
        in: query
        required: false
        schema:
          default: "[]"
          type: string
        description: |-
          JSON specifying filter conditions.
          Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/)
          endpoint. Currently supported filters are:

          - project_id
          - storage_id
          - storage_url
        example: '[{ "project_id": { "operator": "=", "values": ["42"] }}, { "storage_id":
          { "operator": "=", "values": ["1337"] }}]'
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ProjectStorageCollectionModel"
        '400':
          description: Returned if any given filter is invalid.
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:InvalidQuery
                message: The query parameter 'filters' is missing or malformed.
  "/api/v3/project_storages/{id}":
    get:
      summary: Gets a project storage
      operationId: get_project_storage
      tags:
      - File Links
      description: |-
        Gets a project storage resource. This resource contains all data that is applicable on the relation between a
        storage and a project.
      parameters:
      - name: id
        description: Project storage id
        in: path
        required: true
        schema:
          type: integer
        example: 1337
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ProjectStorageModel"
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The requested resource could not be found.
          description: |-
            Returned if the project storage does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view file links
  "/api/v3/project_storages/{id}/open":
    get:
      summary: Open the project storage
      operationId: open_project_storage
      tags:
      - File Links
      description: |-
        Gets a redirect to the location of the project storage's remote origin. If the project storage has a project
        folder, it is opened at this location. If not, the storage root is opened.
      parameters:
      - name: id
        description: Project storage id
        in: path
        required: true
        schema:
          type: integer
        example: 1337
      responses:
        '303':
          description: Redirect
          headers:
            Location:
              schema:
                type: string
                format: uri
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:Unauthenticated
                message: You are not authorized to access this resource.
          description: Returned if the authorization token of the current user grants
            no permission to access the remote storage.
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The requested resource could not be found.
          description: |-
            Returned if the project storage does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view file links
  "/api/v3/projects":
    get:
      summary: List projects
      operationId: list_projects
      tags:
      - Projects
      description: Returns a collection of projects. The collection can be filtered
        via query parameters similar to how work packages are filtered. In addition
        to the provided filter, the result set is always limited to only contain projects
        the client is allowed to see.
      parameters:
      - name: filters
        schema:
          type: string
        in: query
        required: false
        description: |-
          JSON specifying filter conditions.
          Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint.
          Currently supported filters are:

          + active: based on the active property of the project
          + ancestor: filters projects by their ancestor. A project is not considered to be its own ancestor.
          + available_project_attributes: filters projects based on the activated project project attributes.
          + created_at: based on the time the project was created
          + id: based on projects' id.
          + latest_activity_at: based on the time the last activity was registered on a project.
          + project_phase_any: based on the project phases active in a project.
          + name_and_identifier: based on both the name and the identifier.
          + parent_id: filters projects by their parent.
          + principal: based on members of the project.
          + storage_id: filters projects by linked storages
          + storage_url: filters projects by linked storages identified by the host url
          + type_id: based on the types active in a project.
          + user_action: based on the actions the current user has in the project.
          + visible: based on the visibility for the user (id) provided as the filter value. This filter is useful for admins to identify the projects visible to a user.

          There might also be additional filters based on the custom fields that have been configured.

          Each defined lifecycle step will also define a filter in this list endpoint. Given that the elements are not
          static but rather dynamically created on each OpenProject instance, a list cannot be provided. Those filters follow the schema:
          + project_start_gate_[id]: a filter on a project phase's start gate active in a project. The id is the id of the phase the gate belongs to.
          + project_finish_gate_[id]: a filter on a project phase's finish gate active in a project. The id is the id of the phase the gate belongs to.
          + project_phase_[id]: a filter on a project phase active in a project. The id is the id of the phase queried for.
        example: '[{ "ancestor": { "operator": "=", "values": ["1"] }" }]'
      - name: sortBy
        schema:
          type: string
        in: query
        required: false
        description: |-
          JSON specifying sort criteria.
          Currently supported orders are:

          + id
          + name
          + typeahead (sorting by hierarchy and name)
          + created_at
          + public
          + latest_activity_at
          + required_disk_space

          There might also be additional orders based on the custom fields that have been configured.
        example: '[["id", "asc"]]'
      - name: select
        schema:
          type: string
        in: query
        required: false
        description: Comma separated list of properties to include.
        example: total,elements/identifier,elements/name
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ProjectCollectionModel"
              examples:
                simple project collection:
                  "$ref": "#/components/examples/ProjectCollection"
        '400':
          description: Returned if the client sends invalid request parameters e.g.
            filters
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:InvalidQuery
                message: Filters Invalid filter does not exist.
    post:
      summary: Create project
      operationId: create_project
      tags:
      - Projects
      description: |-
        Creates a new project, applying the attributes provided in the body.

        You can use the form and schema to be retrieve the valid attribute values and by that be guided towards successful creation.
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/ProjectModel"
            examples:
              with custom fields:
                "$ref": "#/components/examples/ProjectBody"
      responses:
        '201':
          description: Created
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ProjectModel"
              examples:
                with custom fields:
                  "$ref": "#/components/examples/Project"
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** add project which is a global permission
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
        '422':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _embedded:
                  details:
                    attribute: name
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation
                message: Name can't be blank.
          description: |-
            Returned if:

            * a constraint for a property was violated (`PropertyConstraintViolation`)
  "/api/v3/projects/form":
    post:
      requestBody:
        content:
          application/json:
            schema:
              type: object
            examples:
              with custom fields:
                "$ref": "#/components/examples/ProjectBody"
              empty:
                description: Empty request to get the form initially in order to start
                  the guided creation of a project
                value: {}
      responses:
        '200':
          content:
            application/hal+json:
              schema:
                type: object
              examples:
                response:
                  value:
                    _embedded:
                      payload:
                        _links:
                          customField26:
                            href:
                            title:
                          customField31:
                            href:
                            title:
                          parent:
                            href:
                          status:
                            href:
                        active: true
                        customField30:
                        customField34:
                        customField35: Text custom field value
                        customField41:
                          format: markdown
                          html: ''
                          raw: ''
                        customField42:
                        description:
                          format: markdown
                          html: ''
                          raw:
                        identifier: new_project_identifier
                        name: New project name
                        public: false
                        statusExplanation:
                          format: markdown
                          html: "<p></p>"
                          raw:
                      schema:
                        _dependencies: []
                        _links: {}
                        _type: Schema
                        active:
                          hasDefault: true
                          name: Active
                          required: true
                          type: Boolean
                          writable: true
                        createdAt:
                          hasDefault: false
                          name: Created on
                          required: true
                          type: DateTime
                          writable: false
                        customField26:
                          _links:
                            allowedValues:
                              href: "/api/v3/principals?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22%21%22%2C%22values%22%3A%5B%220%22%2C%223%22%5D%7D%7D%2C%7B%22type%22%3A%7B%22operator%22%3A%22%3D%22%2C%22values%22%3A%5B%22User%22%5D%7D%7D%2C%7B%22member%22%3A%7B%22operator%22%3A%22%3D%22%2C%22values%22%3A%5B%22%22%5D%7D%7D%5D&pageSize=0"
                          hasDefault: false
                          location: _links
                          name: Project user
                          required: false
                          type: User
                          visibility: default
                          writable: true
                        customField30:
                          hasDefault: false
                          name: some project cf
                          required: false
                          type: Integer
                          visibility: default
                          writable: true
                        customField31:
                          _embedded:
                            allowedValues:
                            - _links:
                                self:
                                  href: "/api/v3/custom_options/513"
                                  title: abc
                              _type: CustomOption
                              id: 513
                              value: abc
                            - _links:
                                self:
                                  href: "/api/v3/custom_options/514"
                                  title: def
                              _type: CustomOption
                              id: 514
                              value: def
                            - _links:
                                self:
                                  href: "/api/v3/custom_options/515"
                                  title: ghi
                              _type: CustomOption
                              id: 515
                              value: ghi
                          _links:
                            allowedValues:
                            - href: "/api/v3/custom_options/513"
                              title: abc
                            - href: "/api/v3/custom_options/514"
                              title: def
                            - href: "/api/v3/custom_options/515"
                              title: ghi
                          hasDefault: false
                          location: _links
                          name: list project cf
                          required: false
                          type: CustomOption
                          visibility: default
                          writable: true
                        customField34:
                          hasDefault: false
                          name: Bool Project CF
                          required: false
                          type: Boolean
                          visibility: default
                          writable: true
                        customField35:
                          hasDefault: false
                          name: text project cf
                          required: true
                          type: String
                          visibility: default
                          writable: true
                        customField41:
                          hasDefault: false
                          name: Long text project cf
                          required: false
                          type: Formattable
                          visibility: default
                          writable: true
                        customField42:
                          hasDefault: false
                          name: Date project cf
                          required: false
                          type: Date
                          visibility: default
                          writable: true
                        description:
                          hasDefault: false
                          name: Description
                          required: false
                          type: Formattable
                          writable: true
                        id:
                          hasDefault: false
                          name: ID
                          required: true
                          type: Integer
                          writable: false
                        identifier:
                          hasDefault: false
                          maxLength: 100
                          minLength: 1
                          name: Identifier
                          required: true
                          type: String
                          writable: true
                        name:
                          hasDefault: false
                          maxLength: 255
                          minLength: 1
                          name: Name
                          required: true
                          type: String
                          writable: true
                        parent:
                          _links:
                            allowedValues:
                              href: "/api/v3/projects/available_parent_projects"
                          hasDefault: false
                          location: _links
                          name: Subproject of
                          required: false
                          type: Project
                          visibility: default
                          writable: true
                        public:
                          hasDefault: false
                          name: Public
                          required: true
                          type: Boolean
                          writable: true
                        status:
                          _links:
                            allowedValues:
                            - href: "/api/v3/project_statuses/on_track"
                              title: On track
                            - href: "/api/v3/project_statuses/at_risk"
                              title: At risk
                            - href: "/api/v3/project_statuses/off_track"
                              title: Off track
                            - href: "/api/v3/project_statuses/on_pause"
                              title: On pause
                          hasDefault: true
                          name: Status
                          required: false
                          type: ProjectStatus
                          writable: true
                        statusExplanation:
                          hasDefault: false
                          name: Status explanation
                          required: false
                          type: Formattable
                          writable: true
                        updatedAt:
                          hasDefault: false
                          name: Updated on
                          required: true
                          type: DateTime
                          writable: false
                      validationErrors:
                        identifier:
                          _embedded:
                            details:
                              attribute: identifier
                          _type: Error
                          errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation
                          message: Identifier has already been taken.
                    _links:
                      self:
                        href: "/api/v3/projects/form"
                        method: post
                      validate:
                        href: "/api/v3/projects/form"
                        method: post
                    _type: Form
          description: OK
          headers: {}
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** add project which is a global permission
          headers: {}
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
      tags:
      - Projects
      description: ''
      operationId: Project_create_form
      summary: Project create form
  "/api/v3/projects/schema":
    get:
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _dependencies: []
                    _links:
                      self:
                        href: "/api/v3/projects/schema"
                    _type: Schema
                    active:
                      hasDefault: true
                      name: Active
                      required: true
                      type: Boolean
                      writable: true
                    createdAt:
                      hasDefault: false
                      name: Created on
                      required: true
                      type: DateTime
                      writable: false
                    customField30:
                      hasDefault: false
                      name: Integer project custom field
                      required: false
                      type: Integer
                      visibility: default
                      writable: true
                    customField31:
                      _links: {}
                      hasDefault: false
                      location: _links
                      name: List project custom field
                      required: false
                      type: CustomOption
                      visibility: default
                      writable: true
                    customField32:
                      _links: {}
                      hasDefault: false
                      location: _links
                      name: Version project custom field
                      required: false
                      type: Version
                      visibility: default
                      writable: true
                    customField34:
                      hasDefault: false
                      name: Boolean project custom field
                      required: false
                      type: Boolean
                      visibility: default
                      writable: true
                    customField35:
                      hasDefault: false
                      name: Text project custom field
                      required: true
                      type: String
                      visibility: default
                      writable: true
                    description:
                      hasDefault: false
                      name: Description
                      required: false
                      type: Formattable
                      writable: true
                    id:
                      hasDefault: false
                      name: ID
                      required: true
                      type: Integer
                      writable: false
                    identifier:
                      hasDefault: false
                      maxLength: 100
                      minLength: 1
                      name: Identifier
                      required: true
                      type: String
                      writable: true
                    name:
                      hasDefault: false
                      maxLength: 255
                      minLength: 1
                      name: Name
                      required: true
                      type: String
                      writable: true
                    parent:
                      _links: {}
                      hasDefault: false
                      location: _links
                      name: Subproject of
                      required: false
                      type: Project
                      visibility: default
                      writable: true
                    public:
                      hasDefault: false
                      name: Public
                      required: true
                      type: Boolean
                      writable: true
                    status:
                      _links:
                        allowedValues:
                        - href: "/api/v3/project_statuses/on_track"
                          title: On track
                        - href: "/api/v3/project_statuses/at_risk"
                          title: At risk
                        - href: "/api/v3/project_statuses/off_track"
                          title: Off track
                        - href: "/api/v3/project_statuses/on_pause"
                          title: On pause
                      hasDefault: true
                      name: Status
                      required: false
                      type: ProjectStatus
                      writable: true
                    statusExplanation:
                      hasDefault: false
                      name: Status explanation
                      required: false
                      type: Formattable
                      writable: true
                    updatedAt:
                      hasDefault: false
                      name: Updated on
                      required: true
                      type: DateTime
                      writable: false
              schema:
                "$ref": "#/components/schemas/Projects_schemaModel"
          description: OK
          headers: {}
      tags:
      - Projects
      description: ''
      operationId: View_project_schema
      summary: View project schema
  "/api/v3/projects/{id}":
    delete:
      parameters:
      - description: Project id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '204':
          description: |-
            Returned if the project was successfully deleted. There is currently no end point to query for the actual deletion status.
            Such an end point _might_ be added in the future.
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** admin
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
          description: |-
            Returned if the project does not exist or the client does not have sufficient permissions
            to see it.

            **Required permission:** view project

            *Note: A client without sufficient permissions shall not be able to test for the existence of
            a version. That's why a 404 is returned here, even if a 403 might be more appropriate.*
          headers: {}
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
        '422':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _embedded:
                      details:
                        attribute: base
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation
                    message: Work packages in non descendant projects reference versions
                      of the project or its descendants.
          description: |-
            Returned if the project cannot be deleted. This can happen when there are still references to the project in other projects
            that need to be severed at first.
          headers: {}
      tags:
      - Projects
      description: |-
        Deletes the project permanently. As this is a lengthy process, the actual deletion is carried out asynchronously.
        So the project might exist well after the request has returned successfully. To prevent unwanted changes to
        the project scheduled for deletion, it is archived at once.
      operationId: Delete_Project
      summary: Delete Project
    get:
      parameters:
      - description: Project id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                with custom fields:
                  "$ref": "#/components/examples/Project"
              schema:
                "$ref": "#/components/schemas/ProjectModel"
          description: OK
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
          description: |-
            Returned if the project does not exist or the client does not have sufficient permissions
            to see it.

            **Required permission:** view project

            *Note: A client without sufficient permissions shall not be able to test for the existence of a project.
            That's why a 404 is returned here, even if a 403 might be more appropriate.*
          headers: {}
      tags:
      - Projects
      description: ''
      operationId: View_project
      summary: View project
    patch:
      parameters:
      - description: Project id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/ProjectModel"
            examples:
              with custom fields:
                "$ref": "#/components/examples/ProjectBody"
      responses:
        '200':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ProjectModel"
              examples:
                with custom fields:
                  "$ref": "#/components/examples/Project"
          description: OK
          headers: {}
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** edit project for the project to be altered
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
          description: |-
            Returned if the project does not exist or the client does not have sufficient permissions
            to see it.

            **Required permission:** view project

            *Note: A client without sufficient permissions shall not be able to test for the existence of
            a version. That's why a 404 is returned here, even if a 403 might be more appropriate.*
          headers: {}
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
        '422':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _embedded:
                      details:
                        attribute: name
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation
                    message: Name can't be blank.
          description: |-
            Returned if:

            * a constraint for a property was violated (`PropertyConstraintViolation`)
          headers: {}
      tags:
      - Projects
      description: Updates the given project by applying the attributes provided in
        the body.
      operationId: Update_Project
      summary: Update Project
  "/api/v3/projects/{id}/form":
    post:
      parameters:
      - description: Project id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      requestBody:
        content:
          application/json:
            schema:
              type: object
            examples:
              with custom fields:
                "$ref": "#/components/examples/ProjectBody"
              empty:
                description: Empty request to get the form initially in order to start
                  the guided update of a project
                value: {}
      responses:
        '200':
          description: OK
          headers: {}
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** edit projects in the project
          headers: {}
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
      tags:
      - Projects
      description: ''
      operationId: Project_update_form
      summary: Project update form
  "/api/v3/projects/{id}/copy":
    post:
      parameters:
      - description: Project id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '302':
          description: Returned if the request is successful. It will redirect to
            the job statuses API with the backend job that got created. You can query
            that endpoint to check the status of the copy, and eventually get the
            created project.
          headers: {}
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** copy projects in the source project
          headers: {}
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
        '422':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _embedded:
                      details:
                        attribute: name
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation
                    message: Name can't be blank.
          description: |-
            Returned if:

            * a constraint for a property was violated (`PropertyConstraintViolation`)
          headers: {}
      tags:
      - Projects
      description: ''
      operationId: Create_project_copy
      summary: Create project copy
  "/api/v3/projects/{id}/copy/form":
    post:
      parameters:
      - description: Project id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: OK
          headers: {}
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** copy projects in the source project
          headers: {}
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
      tags:
      - Projects
      description: ''
      operationId: Project_copy_form
      summary: Project copy form
  "/api/v3/project_statuses/{id}":
    get:
      parameters:
      - description: Project status id
        example: on_track
        in: path
        name: id
        required: true
        schema:
          type: string
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _links:
                      self:
                        href: "/api/v3/project_statuses/on_track"
                    _type: ProjectStatus
                    id: on_track
                    name: On track
              schema:
                "$ref": "#/components/schemas/View_project_statusModel"
          description: OK
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
          description: Returned if the project status does not exist.
          headers: {}
      tags:
      - Projects
      description: ''
      operationId: View_project_status
      summary: View project status
  "/api/v3/projects/available_parent_projects":
    get:
      parameters:
      - description: JSON specifying filter conditions.
        example: '[{ "ancestor": { "operator": "=", "values": [''1''] }" }]'
        in: query
        name: filters
        required: false
        schema:
          type: string
      - description: The id or identifier of the project the parent candidate is determined
          for
        example: '123'
        in: query
        name: of
        required: false
        schema:
          type: string
      - description: |-
          JSON specifying sort criteria.
          Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint and allows all the filters and sortBy supported by the project list end point.
        example: '[["id", "asc"]]'
        in: query
        name: sortBy
        required: false
        schema:
          type: string
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      elements:
                      - _links:
                          categories:
                            href: "/api/v3/projects/6/categories"
                          createWorkPackage:
                            href: "/api/v3/projects/6/work_packages/form"
                            method: post
                          createWorkPackageImmediate:
                            href: "/api/v3/projects/6/work_packages"
                            method: post
                          self:
                            href: "/api/v3/projects/6"
                            title: A project
                          status:
                            href: "/api/v3/project_statuses/on_track"
                            title: On track
                          versions:
                            href: "/api/v3/projects/6/versions"
                        _type: Project
                        active: true
                        createdAt: '2015-07-06T13:28:14+00:00'
                        description:
                          format: markdown
                          html: "<p>Lorem <strong>ipsum</strong> dolor sit amet</p>"
                          raw: Lorem **ipsum** dolor sit amet
                        id: 6
                        identifier: a_project
                        name: A project
                        public: false
                        statusExplanation:
                          format: markdown
                          html: "<p>Everything <strong>fine</strong></p>"
                          raw: Everything **fine**
                        type: Customer Project
                        updatedAt: '2015-10-01T09:55:02+00:00'
                      - _links:
                          categories:
                            href: "/api/v3/projects/14/categories"
                          createWorkPackage:
                            href: "/api/v3/projects/14/work_packages/form"
                            method: post
                          createWorkPackageImmediate:
                            href: "/api/v3/projects/14/work_packages"
                            method: post
                          self:
                            href: "/api/v3/projects/14"
                            title: Another project
                          status:
                            href: "/api/v3/project_statuses/on_track"
                            title: On track
                          versions:
                            href: "/api/v3/projects/14/versions"
                        _type: Project
                        active: true
                        createdAt: '2016-02-29T12:50:20+00:00'
                        description:
                          format: markdown
                          html: ''
                          raw: ''
                        id: 14
                        identifier: another_project
                        name: Another project
                        public: true
                        statusExplanation:
                          format: markdown
                          html: "<p>Everything super <strong>fine</strong></p>"
                          raw: Everything super **fine**
                        type:
                        updatedAt: '2016-02-29T12:50:20+00:00'
                    _links:
                      self:
                        href: "/api/v3/projects/available_parent_projects?of=123"
                    _type: Collection
                    count: 2
                    total: 2
              schema:
                "$ref": "#/components/schemas/List_available_parent_project_candidatesModel"
          description: OK
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** edit project in a project or the global add project permission
          headers: {}
      tags:
      - Projects
      description: |-
        Lists projects which can become parent to another project. Only sound candidates are returned.
        For instance a project cannot become parent of itself or its children.

        To specify the project for which a parent is queried for, the `of` parameter can be provided. If no `of`
        parameter is provided, a new project is assumed. Then, the check for the hierarchy is omitted as a new project cannot be
        part of a hierarchy yet.

        Candidates can be filtered. Most commonly one will want to filter by name or identifier.
        You can do this through the `filters` parameter which works just like the work package index.

        For instance to find all parent candidates with "rollout" in their name:

        ```
        ?filters=[{"name_and_identifier":{"operator":"~","values":["rollout"]}}]
        ```
      operationId: List_available_parent_project_candidates
      summary: List available parent project candidates
  "/api/v3/projects/{id}/budgets":
    get:
      parameters:
      - description: Project id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      elements:
                      - _links:
                          self:
                            href: "/api/v3/budgets/1"
                            title: Q3 2015
                        _type: Budget
                        id: 1
                        subject: Q3 2015
                      - _links:
                          self:
                            href: "/api/v3/budgets/2"
                            title: Q4 2015
                        _type: Budget
                        id: 2
                        subject: Q4 2015
                    _links:
                      self:
                        href: "/api/v3/projects/1/budgets"
                    _type: Collection
                    count: 2
                    total: 2
              schema:
                "$ref": "#/components/schemas/Budgets_by_ProjectModel"
          description: OK
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not allowed to see the budgets of this project.
          description: |-
            Returned if the client does not have sufficient permissions to see the budgets of the given
            project.

            **Required permission:** view work packages **or** view budgets

            *Note that you will only receive this error, if you are at least allowed to see the corresponding project.*
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The specified project does not exist.
          description: |-
            Returned if either:

            * the project does not exist

            * the client does not have sufficient permissions to see the project

            * the costs module is not enabled on the given project

            **Required permission:** view project

            *Note: A client without sufficient permissions shall not be able to test for the existence of a project.
            That's why a 404 is returned here, even if a 403 might be more appropriate.*
          headers: {}
      tags:
      - Budgets
      description: ''
      operationId: view_Budgets_of_a_Project
      summary: view Budgets of a Project
  "/api/v3/projects/{id}/queries/default":
    get:
      summary: View default query for project
      operationId: View_default_query_for_project
      tags:
      - Queries
      description: Same as [viewing an existing, persisted Query](https://www.openproject.org/docs/api/endpoints/queries/#list-queries)
        in its response, this resource returns an unpersisted query and by that allows
        to get the default query configuration. The client may also provide additional
        parameters which will modify the default query. The query will already be
        scoped for the project.
      parameters:
      - description: Id of the project the default query is requested for
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      - name: filters
        description: |-
          JSON specifying filter conditions.
          The filters provided as parameters are not applied to the query but are instead used to override the query's persisted filters.
          All filters also accepted by the work packages endpoint are accepted. If no filter is to be applied, the client should send an empty array (`[]`).
        example: '[{ "assignee": { "operator": "=", "values": ["1", "5"] }" }]'
        in: query
        required: false
        schema:
          default: '[{ "status_id": { "operator": "o", "values": null }}]'
          type: string
      - name: offset
        description: Page number inside the queries' result collection of work packages.
        example: '25'
        in: query
        required: false
        schema:
          default: 1
          type: integer
      - name: pageSize
        description: Number of elements to display per page for the queries' result
          collection of work packages.
        example: '25'
        in: query
        required: false
        schema:
          type: integer
      - name: sortBy
        description: JSON specifying sort criteria. The sort criteria is applied to
          the query's result collection of work packages overriding the query's persisted
          sort criteria.
        example: '[["status", "asc"]]'
        in: query
        required: false
        schema:
          default: '[["id", "asc"]]'
          type: string
      - name: groupBy
        description: The column to group by. The grouping criteria is applied to the
          to the query's result collection of work packages overriding the query's
          persisted group criteria.
        example: status
        in: query
        required: false
        schema:
          type: string
      - name: showSums
        description: Indicates whether properties should be summed up if they support
          it. The showSums parameter is applied to the to the query's result collection
          of work packages overriding the query's persisted sums property.
        example: true
        in: query
        required: false
        schema:
          default: false
          type: boolean
      - name: timestamps
        description: 'Indicates the timestamps to filter by when showing changed attributes
          on work packages. Values can be either ISO8601 dates, ISO8601 durations
          and the following relative date keywords: "oneDayAgo@HH:MM+HH:MM", "lastWorkingDay@HH:MM+HH:MM",
          "oneWeekAgo@HH:MM+HH:MM", "oneMonthAgo@HH:MM+HH:MM". The first "HH:MM" part
          represents the zero paded hours and minutes. The last "+HH:MM" part represents
          the timezone offset from UTC associated with the time. Values older than
          1 day are accepted only with valid Enterprise Token available.

          '
        example: 2023-01-01,P-1Y,PT0S,lastWorkingDay@12:00
        in: query
        required: false
        schema:
          default: PT0S
          type: string
      - name: timelineVisible
        description: Indicates whether the timeline should be shown.
        example: true
        in: query
        required: false
        schema:
          default: false
          type: boolean
      - name: showHierarchies
        description: Indicates whether the hierarchy mode should be enabled.
        example: true
        in: query
        required: false
        schema:
          default: true
          type: boolean
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      results:
                        _embedded:
                          elements:
                          - "<--- shortened for brevity --->"
                        _links:
                          changeSize:
                            href: "/api/v3/projects/42/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=%7Bsize%7D&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
                            templated: true
                          createWorkPackage:
                            href: "/api/v3/work_packages/form"
                            method: post
                          createWorkPackageImmediate:
                            href: "/api/v3/work_packages"
                            method: post
                          jumpTo:
                            href: "/api/v3/projects/42/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=%7Boffset%7D&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
                            templated: true
                          self:
                            href: "/api/v3/projects/42/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
                        _type: WorkPackageCollection
                        count: 30
                        offset: 1
                        pageSize: 2
                        total: 234
                    _links:
                      columns:
                      - href: "/api/v3/queries/columns/id"
                        title: ID
                      - href: "/api/v3/queries/columns/subject"
                        title: Subject
                      - href: "/api/v3/queries/columns/type"
                        title: Type
                      - href: "/api/v3/queries/columns/status"
                        title: Status
                      - href: "/api/v3/queries/columns/priority"
                        title: Priority
                      - href: "/api/v3/queries/columns/assignee"
                        title: Assignee
                      - href: "/api/v3/queries/columns/updated_at"
                        title: Updated on
                      groupBy:
                        href:
                        title:
                      project:
                        href: "/api/v3/projects/42"
                        title: Lorem ipsum project
                      results:
                        href: "/api/v3/projects/42/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
                      self:
                        href: "/api/v3/projects/42/queries/default"
                        title: Default
                      sortBy:
                      - href: "/api/v3/queries/sort_bys/parent-desc"
                        title: Parent (Descending)
                      user:
                        href: "/api/v3/users/1"
                        title: OpenProject Admin
                    _type: Query
                    filters:
                    - _links:
                        filter:
                          href: "/api/v3/queries/filters/status"
                          title: Status
                        operator:
                          href: "/api/v3/queries/operators/o"
                          title: open
                        schema:
                          href: "/api/v3/queries/filter_instance_schemas/status"
                        values: []
                      _type: StatusQueryFilter
                      name: Status
                    name: default
                    public: false
                    showHierarchies: true
                    starred: false
                    sums: false
                    timelineVisible: false
                    timelineZoomLevel: days
              schema:
                "$ref": "#/components/schemas/Default_Query_for_ProjectModel"
          description: OK
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions to see the default query.

            **Required permission:** view work packages in the project
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
          description: |-
            Returned if the client does not have sufficient permissions to see the project.

            **Required permission:** any permission in the project
          headers: {}
  "/api/v3/projects/{id}/queries/filter_instance_schemas":
    get:
      parameters:
      - description: Project id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      elements:
                      - _dependencies:
                        - _type: SchemaDependency
                          dependencies:
                            "/api/v3/queries/operators/!":
                              values:
                                _links: {}
                                hasDefault: false
                                name: Values
                                required: true
                                type: "[]User"
                                writable: true
                            "/api/v3/queries/operators/!*": {}
                            "/api/v3/queries/operators/*": {}
                            "/api/v3/queries/operators/=":
                              values:
                                _links: {}
                                hasDefault: false
                                name: Values
                                required: true
                                type: "[]User"
                                writable: true
                          'on': operator
                        _links:
                          filter:
                            href: "/api/v3/queries/filters/assignee"
                            title: Assignee
                          self:
                            href: "/api/v3/queries/filter_instance_schemas/assignee"
                        _type: QueryFilterInstanceSchema
                        filter:
                          _links: {}
                          hasDefault: false
                          name: Filter
                          required: true
                          type: QueryFilter
                          writable: true
                        name:
                          hasDefault: true
                          name: Name
                          required: true
                          type: String
                          writable: false
                      - _dependencies:
                        - _type: SchemaDependency
                          dependencies:
                            "/api/v3/queries/operators/!":
                              values:
                                _links: {}
                                hasDefault: false
                                name: Values
                                required: true
                                type: "[]User"
                                writable: true
                            "/api/v3/queries/operators/=":
                              values:
                                _links: {}
                                hasDefault: false
                                name: Values
                                required: true
                                type: "[]User"
                                writable: true
                          'on': operator
                        _links:
                          filter:
                            href: "/api/v3/queries/filters/author"
                            title: Author
                          self:
                            href: "/api/v3/queries/filter_instance_schemas/author"
                        _type: QueryFilterInstanceSchema
                        filter:
                          _links: {}
                          hasDefault: false
                          name: Filter
                          required: true
                          type: QueryFilter
                          writable: true
                        name:
                          hasDefault: true
                          name: Name
                          required: true
                          type: String
                          writable: false
                    _links:
                      self:
                        href: "/api/v3/projects/42/queries/filter_instance_schemas"
                    _type: Collection
                    count: 2
                    total: 2
              schema:
                "$ref": "#/components/schemas/Query_Filter_Instance_Schemas_For_ProjectModel"
          description: OK
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:Unauthenticated
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions to see it.

            **Required permission:** view work package in any project
          headers: {}
      tags:
      - Query Filter Instance Schema
      description: Returns the list of QueryFilterInstanceSchemas defined for a query
        of the specified project.
      operationId: List_Query_Filter_Instance_Schemas_for_Project
      summary: List Query Filter Instance Schemas for Project
  "/api/v3/projects/{id}/queries/schema":
    get:
      parameters:
      - description: Project id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                QuerySchema:
                  "$ref": "#/components/examples/QuerySchemaModel"
              schema:
                "$ref": "#/components/schemas/Schema_For_Project_QueriesModel"
          description: OK
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
          description: "**Required permission:** view work package in the project"
          headers: {}
      tags:
      - Queries
      description: Retrieve the schema for project queries.
      operationId: View_schema_for_project_queries
      summary: View schema for project queries
  "/api/v3/projects/{id}/work_packages":
    get:
      summary: Get work packages of project
      operationId: Get_Project_Work_Package_Collection
      tags:
      - Work Packages
      description: Returns the collection of work packages that are related to the
        given project.
      parameters:
      - description: Project id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      - description: Page number inside the requested collection.
        example: '25'
        in: query
        name: offset
        required: false
        schema:
          default: 1
          type: integer
      - description: Number of elements to display per page.
        example: '25'
        in: query
        name: pageSize
        required: false
        schema:
          type: integer
      - description: |-
          JSON specifying filter conditions.
          Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. If no filter is to be applied, the client should send an empty array (`[]`).
        example: '[{ "type_id": { "operator": "=", "values": [''1'', ''2''] }}]'
        in: query
        name: filters
        required: false
        schema:
          default: '[{ "status_id": { "operator": "o", "values": null }}]'
          type: string
      - description: |-
          JSON specifying sort criteria.
          Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint.
        example: '[["status", "asc"]]'
        in: query
        name: sortBy
        required: false
        schema:
          default: '[["id", "asc"]]'
          type: string
      - description: The column to group by.
        example: status
        in: query
        name: groupBy
        required: false
        schema:
          type: string
      - description: Indicates whether properties should be summed up if they support
          it.
        example: true
        in: query
        name: showSums
        required: false
        schema:
          default: false
          type: boolean
      - description: Comma separated list of properties to include.
        example: total,elements/subject,elements/id,self
        in: query
        name: select
        required: false
        schema:
          type: string
      responses:
        '200':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/Work_PackagesModel"
          description: OK
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not allowed to see the work packages of this project.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** view work packages

            *Note that you will only receive this error, if you are at least allowed to see the corresponding project.*
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The specified project does not exist.
          description: |-
            Returned if the project does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view project
    post:
      summary: Create work package in project
      operationId: Create_Project_Work_Package
      tags:
      - Work Packages
      description: |-
        When calling this endpoint the client provides a single object, containing at least the properties and links that
        are required, in the body. The required fields of a WorkPackage can be found in its schema, which is embedded in
        the respective form. Note that it is only allowed to provide properties or links supporting the write operation.
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/WorkPackageModel"
      parameters:
      - description: Project id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      - description: |-
          Indicates whether change notifications (e.g. via E-Mail) should be sent.
          Note that this controls notifications for all users interested in changes to the work package (e.g. watchers, author and assignee),
          not just the current user.
        example: false
        in: query
        name: notify
        required: false
        schema:
          default: true
          type: boolean
      responses:
        '200':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/WorkPackageModel"
          description: OK
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not allowed to add work packages to this project.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** add work packages

            *Note that you will only receive this error, if you are at least allowed to see the corresponding project.*
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The specified project does not exist.
          description: |-
            Returned if the project does not exist or the client does not have sufficient permissions
            to see it.

            **Required permissions:** view project

            *Note: A client without sufficient permissions shall not be able to test for the existence of a project.
            That's why a 404 is returned here, even if a 403 might be more appropriate.*
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
        '422':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _embedded:
                  details:
                    attribute: Subject
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation
                message: The subject might not be blank.
          description: |-
            Returned if:

            * the client tries to write a read-only property

            * a constraint for a property was violated

            * a property was provided in an unreadable format
  "/api/v3/projects/{id}/work_packages/form":
    post:
      summary: Form for creating Work Packages in a Project
      operationId: form_create_work_package_in_project
      tags:
      - Work Packages
      description: |-
        This endpoint allows you to validation a new work package creation body in a specific project. It works similarly
        to the `/api/v3/work_packages/form` endpoint, but already specifies the work package's project in the path, so that
        it does not have to be defined in the request body.
      parameters:
      - name: id
        description: ID of the project in which the work package will be created
        in: path
        required: true
        schema:
          type: integer
        example: '1'
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/WorkPackageWriteModel"
            examples:
              Minimal example:
                "$ref": "#/components/examples/WorkPackageCreateOnlySubject"
              Valid example:
                "$ref": "#/components/examples/WorkPackageCreateValid"
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/WorkPackageFormModel"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
  "/api/v3/projects/{id}/available_assignees":
    get:
      parameters:
      - description: Project id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      elements:
                      - _links:
                          delete:
                            href: "/api/v3/users/1"
                            method: DELETE
                            title: Delete j.sheppard
                          lock:
                            href: "/api/v3/users/1/lock"
                            method: POST
                            title: Set lock on j.sheppard
                          self:
                            href: "/api/v3/users/1"
                            title: John Sheppard - j.sheppard
                        _type: User
                        avatar: https://example.org/users/1/avatar
                        createdAt: '2014-05-21T08:51:20.396Z'
                        email: shep@mail.com
                        firstName: John
                        id: 1
                        lastName: Sheppard
                        login: j.sheppard
                        status: active
                        updatedAt: '2014-05-21T08:51:20.396Z'
                      - _links:
                          delete:
                            href: "/api/v3/users/2"
                            method: DELETE
                            title: Delete j.sheppard2
                          lock:
                            href: "/api/v3/users/2/lock"
                            method: POST
                            title: Set lock on j.sheppard2
                          self:
                            href: "/api/v3/users/2"
                            title: Jim Sheppard - j.sheppard2
                        _type: User
                        avatar: https://example.org/users/1/avatar
                        createdAt: '2014-05-21T08:51:20.396Z'
                        email: shep@mail.net
                        firstName: Jim
                        id: 2
                        lastName: Sheppard
                        login: j.sheppard2
                        status: active
                        updatedAt: '2014-05-21T08:51:20.396Z'
                    _links:
                      self:
                        href: "/api/v3/projects/42/available_assignees"
                    _type: Collection
                    count: 2
                    total: 2
              schema:
                "$ref": "#/components/schemas/Available_AssigneesModel"
          description: OK
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not allowed to see the assignable users for this
                      project.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** add work packages

            *Note that you will only receive this error, if you are at least allowed to see the corresponding project.*
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The specified project does not exist.
          description: |-
            Returned if the project does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view project
          headers: {}
      tags:
      - Work Packages
      description: Gets a list of users that can be assigned to work packages in the
        given project.
      operationId: Project_Available_assignees
      summary: Project Available assignees
  "/api/v3/projects/{id}/categories":
    get:
      parameters:
      - description: ID of the project whose categories will be listed
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      elements:
                      - _links:
                          defaultAssignee:
                            href: "/api/v3/users/42"
                            title: John Sheppard
                          project:
                            href: "/api/v3/projects/11"
                            title: Example project
                          self:
                            href: "/api/v3/categories/10"
                            title: Category with assignee
                        _type: Category
                        id: 10
                        name: Foo
                      - _links:
                          project:
                            href: "/api/v3/projects/11"
                          self:
                            href: "/api/v3/categories/11"
                        _type: Category
                        id: 11
                        name: Bar
                    _links:
                      self:
                        href: "/api/v3/projects/11/categories"
                    _type: Collection
                    count: 2
                    total: 2
              schema:
                "$ref": "#/components/schemas/Categories_by_ProjectModel"
          description: OK
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The specified project does not exist.
          description: |-
            Returned if the project does not exist or the client does not have sufficient permissions
            to see it.

            **Required permission:** view project

            *Note: A client without sufficient permissions shall not be able to test for the existence of a project.
            That's why a 404 is returned here, even if a 403 might be more appropriate.*
          headers: {}
      tags:
      - Categories
      description: ''
      operationId: List_categories_of_a_project
      summary: List categories of a project
  "/api/v3/projects/{id}/types":
    get:
      parameters:
      - description: ID of the project whose types will be listed
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      elements:
                      - _links:
                          self:
                            href: "/api/v3/types/1"
                        _type: Type
                        color: "#ff0000"
                        createdAt: '2014-05-21T08:51:20.396Z'
                        id: 1
                        isDefault: true
                        isMilestone: false
                        name: Bug
                        position: 1
                        updatedAt: '2014-05-21T08:51:20.396Z'
                      - _links:
                          self:
                            href: "/api/v3/types/2"
                        _type: Type
                        color: "#888"
                        createdAt: '2014-05-21T08:51:20.396Z'
                        id: 2
                        isDefault: false
                        isMilestone: false
                        name: Feature
                        position: 2
                        updatedAt: '2014-05-21T08:51:20.396Z'
                    _links:
                      self:
                        href: "/api/v3/projects/11/types"
                    _type: Collection
                    count: 2
                    total: 2
              schema:
                "$ref": "#/components/schemas/Types_by_ProjectModel"
          description: OK
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The specified project does not exist.
          description: |-
            Returned if the project does not exist or the client does not have sufficient permissions
            to see it.

            **Required permission:** view work packages **or** manage types (on given project)

            *Note: A client without sufficient permissions shall not be able to test for the existence of a project.
            That's why a 404 is returned here, even if a 403 might be more appropriate.*
          headers: {}
      tags:
      - Types
      description: This endpoint lists the types that are *available* in a given project.
      operationId: List_types_available_in_a_project
      summary: List types available in a project
  "/api/v3/projects/{id}/versions":
    get:
      parameters:
      - description: ID of the project whose versions will be listed
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      elements:
                      - _links:
                          availableInProjects:
                            href: "/api/v3/versions/11/projects"
                          definingProject:
                            href: "/api/v3/projects/11"
                          self:
                            href: "/api/v3/versions/11"
                        _type: Version
                        description:
                          format: plain
                          html: This version has a description
                          raw: This version has a description
                        endDate:
                        id: 11
                        name: v3.0 Alpha
                        startDate: '2014-11-20'
                        status: Open
                      - _links:
                          availableInProjects:
                            href: "/api/v3/versions/12/projects"
                          definingProject:
                            href: "/api/v3/projects/11"
                          self:
                            href: "/api/v3/versions/12"
                        _type: Version
                        description:
                          format: plain
                          html: ''
                          raw: ''
                        endDate:
                        id: 12
                        name: v2.0
                        startDate:
                        status: Closed
                      - _links:
                          availableInProjects:
                            href: "/api/v3/versions/10/projects"
                          definingProject:
                            href: "/api/v3/projects/11"
                          self:
                            href: "/api/v3/versions/10"
                        _type: Version
                        description:
                          format: plain
                          html: ''
                          raw: ''
                        endDate:
                        id: 10
                        name: v1.0
                        startDate:
                        status: Open
                    _links:
                      self:
                        href: "/api/v3/projects/11/versions"
                    _type: Collection
                    count: 3
                    total: 3
              schema:
                "$ref": "#/components/schemas/Versions_by_ProjectModel"
          description: OK
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The specified project does not exist.
          description: |-
            Returned if the project does not exist or the client does not have sufficient permissions
            to see it.

            **Required permission:** view work packages **or** manage versions (on given project)

            *Note: A client without sufficient permissions shall not be able to test for the existence of a project.
            That's why a 404 is returned here, even if a 403 might be more appropriate.*
          headers: {}
      tags:
      - Versions
      description: |-
        This endpoint lists the versions that are *available* in a given project.
        Note that due to sharing this might be more than the versions *defined* by that project.
      operationId: List_versions_available_in_a_project
      summary: List versions available in a project
  "/api/v3/queries":
    get:
      summary: List queries
      operationId: List_queries
      tags:
      - Queries
      description: Returns a collection of queries. The collection can be filtered
        via query parameters similar to how work packages are filtered. Please note
        however, that the filters are applied to the queries and not to the work packages
        the queries in turn might return.
      parameters:
      - description: |-
          JSON specifying filter conditions.
          Currently supported filters are:

          + project: filters queries by the project they are assigned to. If the project filter is passed with the `!*` (not any) operator, global queries are returned.

          + id: filters queries based on their id

          + updated_at: filters queries based on the last time they where updated
        example: '[{ "project_id": { "operator": "!*", "values": null }" }]'
        in: query
        name: filters
        required: false
        schema:
          type: string
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                Queries:
                  "$ref": "#/components/examples/QueriesModel"
              schema:
                "$ref": "#/components/schemas/QueriesModel"
          description: OK
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not allowed to see the queries.
          description: |-
            Returned if the client does not have sufficient permissions to see queries.

            **Required permission:** view work packages or manage public queries in any project
          headers: {}
    post:
      summary: Create query
      operationId: Create_query
      tags:
      - Queries
      description: |-
        When calling this endpoint the client provides a single object, containing at least the properties and links that are required, in the body.
        The required fields of a Query can be found in its schema, which is embedded in the respective form.
        Note that it is only allowed to provide properties or links supporting the write operation.
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/Query_Create_Form"
      responses:
        '201':
          content:
            application/hal+json:
              examples:
                Query:
                  "$ref": "#/components/examples/QueryModel"
              schema:
                "$ref": "#/components/schemas/QueryModel"
          description: Created
          headers: {}
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
        '422':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _embedded:
                      details:
                        attribute: project
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation
                    message: Project not found
          description: |-
            Returned if:

            * the client tries to modify a read-only property (`PropertyIsReadOnly`)

            * a constraint for a property was violated (`PropertyConstraintViolation`)

            * the client provides a link to an invalid resource (`ResourceTypeMismatch`),
              e.g. a user, project or operator not found
          headers: {}
  "/api/v3/queries/available_projects":
    get:
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      elements:
                      - _links:
                          categories:
                            href: "/api/v3/projects/6/categories"
                          createWorkPackage:
                            href: "/api/v3/projects/6/work_packages/form"
                            method: post
                          createWorkPackageImmediate:
                            href: "/api/v3/projects/6/work_packages"
                            method: post
                          self:
                            href: "/api/v3/projects/6"
                            title: A project
                          versions:
                            href: "/api/v3/projects/6/versions"
                        _type: Project
                        createdAt: '2015-07-06T13:28:14+00:00'
                        description: Eveniet molestias omnis quis aut qui eum adipisci.
                        id: 6
                        identifier: a_project
                        name: A project
                        type: Customer Project
                        updatedAt: '2015-10-01T09:55:02+00:00'
                      - _links:
                          categories:
                            href: "/api/v3/projects/14/categories"
                          createWorkPackage:
                            href: "/api/v3/projects/14/work_packages/form"
                            method: post
                          createWorkPackageImmediate:
                            href: "/api/v3/projects/14/work_packages"
                            method: post
                          self:
                            href: "/api/v3/projects/14"
                            title: Another project
                          versions:
                            href: "/api/v3/projects/14/versions"
                        _type: Project
                        createdAt: '2016-02-29T12:50:20+00:00'
                        description: ''
                        id: 14
                        identifier: another_project
                        name: Another project
                        type:
                        updatedAt: '2016-02-29T12:50:20+00:00'
                    _links:
                      self:
                        href: "/api/v3/queries/available_projects"
                    _type: Collection
                    count: 2
                    total: 2
              schema:
                "$ref": "#/components/schemas/Available_projects_for_queryModel"
          description: OK
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** view work packages
          headers: {}
      tags:
      - Queries
      description: Gets a list of projects that are available as projects a query
        can be assigned to.
      operationId: Available_projects_for_query
      summary: Available projects for query
  "/api/v3/queries/columns/{id}":
    get:
      parameters:
      - description: QueryColumn id
        example: priority
        in: path
        name: id
        required: true
        schema:
          type: string
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _links:
                      self:
                        href: "/api/v3/queries/columns/priority"
                        title: Priority
                    _type: QueryColumn::Property
                    id: priority
                    name: Priority
              schema:
                "$ref": "#/components/schemas/Query_ColumnModel"
          description: OK
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:Unauthenticated
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions to see it.

            **Required permission:** view work package in any project
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The specified query does not exist.
          description: Returned if the QueryColumn does not exist.
          headers: {}
      tags:
      - Query Columns
      description: Retrieve an individual QueryColumn as identified by the `id` parameter.
      operationId: View_Query_Column
      summary: View Query Column
  "/api/v3/queries/default":
    get:
      summary: View default query
      operationId: View_default_query
      tags:
      - Queries
      description: Same as [viewing an existing, persisted Query](https://www.openproject.org/docs/api/endpoints/queries/#list-queries)
        in its response, this resource returns an unpersisted query and by that allows
        to get the default query configuration. The client may also provide additional
        parameters which will modify the default query.
      parameters:
      - name: filters
        description: |-
          JSON specifying filter conditions.
          The filters provided as parameters are not applied to the query but are instead used to override the query's persisted filters.
          All filters also accepted by the work packages endpoint are accepted. If no filter is to be applied, the client should send an empty array (`[]`).
        example: '[{ "assignee": { "operator": "=", "values": ["1", "5"] }" }]'
        in: query
        required: false
        schema:
          default: '[{ "status_id": { "operator": "o", "values": null }}]'
          type: string
      - name: offset
        description: Page number inside the queries' result collection of work packages.
        example: '25'
        in: query
        required: false
        schema:
          default: 1
          type: integer
      - name: pageSize
        description: Number of elements to display per page for the queries' result
          collection of work packages.
        example: '25'
        in: query
        required: false
        schema:
          type: integer
      - name: sortBy
        description: JSON specifying sort criteria. The sort criteria is applied to
          the query's result collection of work packages overriding the query's persisted
          sort criteria.
        example: '[["status", "asc"]]'
        in: query
        required: false
        schema:
          default: '[["id", "asc"]]'
          type: string
      - name: groupBy
        description: The column to group by. The grouping criteria is applied to the
          to the query's result collection of work packages overriding the query's
          persisted group criteria.
        example: status
        in: query
        required: false
        schema:
          type: string
      - name: showSums
        description: Indicates whether properties should be summed up if they support
          it. The showSums parameter is applied to the to the query's result collection
          of work packages overriding the query's persisted sums property.
        example: true
        in: query
        required: false
        schema:
          default: false
          type: boolean
      - name: timestamps
        description: 'Indicates the timestamps to filter by when showing changed attributes
          on work packages. Values can be either ISO8601 dates, ISO8601 durations
          and the following relative date keywords: "oneDayAgo@HH:MM+HH:MM", "lastWorkingDay@HH:MM+HH:MM",
          "oneWeekAgo@HH:MM+HH:MM", "oneMonthAgo@HH:MM+HH:MM". The first "HH:MM" part
          represents the zero paded hours and minutes. The last "+HH:MM" part represents
          the timezone offset from UTC associated with the time, the offset can be
          positive or negative e.g."oneDayAgo@01:00+01:00", "oneDayAgo@01:00-01:00".
          Values older than 1 day are accepted only with valid Enterprise Token available.

          '
        example: 2023-01-01,P-1Y,PT0S,lastWorkingDay@12:00
        in: query
        required: false
        schema:
          default: PT0S
          type: string
      - name: timelineVisible
        description: Indicates whether the timeline should be shown.
        example: true
        in: query
        required: false
        schema:
          default: false
          type: boolean
      - name: timelineZoomLevel
        description: Indicates in what zoom level the timeline should be shown. Valid
          values are  `days`, `weeks`, `months`, `quarters`, and `years`.
        example: days
        in: query
        required: false
        schema:
          default: days
          type: string
      - name: showHierarchies
        description: Indicates whether the hierarchy mode should be enabled.
        example: true
        in: query
        required: false
        schema:
          default: true
          type: boolean
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      results:
                        _embedded:
                          elements:
                          - "<--- shortened for brevity --->"
                        _links:
                          changeSize:
                            href: "/api/v3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=%7Bsize%7D&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
                            templated: true
                          createWorkPackage:
                            href: "/api/v3/work_packages/form"
                            method: post
                          createWorkPackageImmediate:
                            href: "/api/v3/work_packages"
                            method: post
                          jumpTo:
                            href: "/api/v3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=%7Boffset%7D&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
                            templated: true
                          self:
                            href: "/api/v3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
                        _type: WorkPackageCollection
                        count: 30
                        offset: 1
                        pageSize: 2
                        total: 234
                    _links:
                      columns:
                      - href: "/api/v3/queries/columns/id"
                        title: ID
                      - href: "/api/v3/queries/columns/subject"
                        title: Subject
                      - href: "/api/v3/queries/columns/type"
                        title: Type
                      - href: "/api/v3/queries/columns/status"
                        title: Status
                      - href: "/api/v3/queries/columns/priority"
                        title: Priority
                      - href: "/api/v3/queries/columns/assignee"
                        title: Assignee
                      - href: "/api/v3/queries/columns/updated_at"
                        title: Updated on
                      groupBy:
                        href:
                        title:
                      highlightedAttributes: []
                      project:
                        href:
                      results:
                        href: "/api/v3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
                      self:
                        href: "/api/v3/queries/default"
                        title: Default
                      sortBy:
                      - href: "/api/v3/queries/sort_bys/parent-desc"
                        title: Parent (Descending)
                      user:
                        href: "/api/v3/users/1"
                        title: OpenProject Admin
                    _type: Query
                    filters:
                    - _links:
                        filter:
                          href: "/api/v3/queries/filters/status"
                          title: Status
                        operator:
                          href: "/api/v3/queries/operators/o"
                          title: open
                        schema:
                          href: "/api/v3/queries/filter_instance_schemas/status"
                        values: []
                      _type: StatusQueryFilter
                      name: Status
                    highlightingMode: inline
                    name: default
                    public: false
                    showHierarchies: true
                    starred: false
                    sums: false
                    timelineLabels: {}
                    timelineVisible: false
                    timelineZoomLevel: days
              schema:
                "$ref": "#/components/schemas/Default_QueryModel"
          description: OK
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions to see the default query.

            **Required permission:** view work packages in any project
          headers: {}
  "/api/v3/queries/filter_instance_schemas":
    get:
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      elements:
                      - _dependencies:
                        - _type: SchemaDependency
                          dependencies:
                            "/api/v3/queries/operators/!":
                              values:
                                _links: {}
                                hasDefault: false
                                name: Values
                                required: true
                                type: "[]User"
                                writable: true
                            "/api/v3/queries/operators/!*": {}
                            "/api/v3/queries/operators/*": {}
                            "/api/v3/queries/operators/=":
                              values:
                                _links: {}
                                hasDefault: false
                                name: Values
                                required: true
                                type: "[]User"
                                writable: true
                          'on': operator
                        _links:
                          filter:
                            href: "/api/v3/queries/filters/assignee"
                            title: Assignee
                          self:
                            href: "/api/v3/queries/filter_instance_schemas/assignee"
                        _type: QueryFilterInstanceSchema
                        filter:
                          _links: {}
                          hasDefault: false
                          name: Filter
                          required: true
                          type: QueryFilter
                          writable: true
                        name:
                          hasDefault: true
                          name: Name
                          required: true
                          type: String
                          writable: false
                      - _dependencies:
                        - _type: SchemaDependency
                          dependencies:
                            "/api/v3/queries/operators/!":
                              values:
                                _links: {}
                                hasDefault: false
                                name: Values
                                required: true
                                type: "[]User"
                                writable: true
                            "/api/v3/queries/operators/=":
                              values:
                                _links: {}
                                hasDefault: false
                                name: Values
                                required: true
                                type: "[]User"
                                writable: true
                          'on': operator
                        _links:
                          filter:
                            href: "/api/v3/queries/filters/author"
                            title: Author
                          self:
                            href: "/api/v3/queries/filter_instance_schemas/author"
                        _type: QueryFilterInstanceSchema
                        filter:
                          _links: {}
                          hasDefault: false
                          name: Filter
                          required: true
                          type: QueryFilter
                          writable: true
                        name:
                          hasDefault: true
                          name: Name
                          required: true
                          type: String
                          writable: false
                    _links:
                      self:
                        href: "/api/v3/queries/filter_instance_schemas"
                    _type: Collection
                    count: 2
                    total: 2
              schema:
                "$ref": "#/components/schemas/Query_Filter_Instance_SchemasModel"
          description: OK
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:Unauthenticated
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions to see it.

            **Required permission:** view work package in any project
          headers: {}
      tags:
      - Query Filter Instance Schema
      description: Returns the list of QueryFilterInstanceSchemas defined for a global
        query. That is a query not assigned to a project.
      operationId: List_Query_Filter_Instance_Schemas
      summary: List Query Filter Instance Schemas
  "/api/v3/queries/filter_instance_schemas/{id}":
    get:
      parameters:
      - description: QueryFilterInstanceSchema identifier. The identifier is the filter
          identifier.
        example: author
        in: path
        name: id
        required: true
        schema:
          type: string
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _dependencies:
                    - _type: SchemaDependency
                      dependencies:
                        "/api/v3/queries/operators/!":
                          values:
                            _links: {}
                            hasDefault: false
                            name: Values
                            required: true
                            type: "[]User"
                            writable: true
                        "/api/v3/queries/operators/=":
                          values:
                            _links: {}
                            hasDefault: false
                            name: Values
                            required: true
                            type: "[]User"
                            writable: true
                      'on': operator
                    _links:
                      filter:
                        href: "/api/v3/queries/filters/author"
                        title: Author
                      self:
                        href: "/api/v3/queries/filter_instance_schemas/author"
                    _type: QueryFilterInstanceSchema
                    filter:
                      _links: {}
                      hasDefault: false
                      name: Filter
                      required: true
                      type: QueryFilter
                      writable: true
                    name:
                      hasDefault: true
                      name: Name
                      required: true
                      type: String
                      writable: false
              schema:
                "$ref": "#/components/schemas/Query_Filter_Instance_SchemaModel"
          description: OK
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:Unauthenticated
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions to see it.

            **Required permission:** view work package in any project
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The specified query does not exist.
          description: Returned if the QueryFilterInstanceSchema does not exist.
          headers: {}
      tags:
      - Query Filter Instance Schema
      description: Retrieve an individual QueryFilterInstanceSchema as identified
        by the id parameter.
      operationId: View_Query_Filter_Instance_Schema
      summary: View Query Filter Instance Schema
  "/api/v3/queries/filters/{id}":
    get:
      parameters:
      - description: QueryFilter identifier
        example: status
        in: path
        name: id
        required: true
        schema:
          type: string
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _links:
                      self:
                        href: "/api/v3/queries/filters/status"
                        title: Status
                    _type: QueryFilter
                    id: status
              schema:
                "$ref": "#/components/schemas/Query_FilterModel"
          description: OK
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:Unauthenticated
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions to see it.

            **Required permission:** view work package in any project
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The specified query does not exist.
          description: Returned if the QueryFilter does not exist.
          headers: {}
      tags:
      - Query Filters
      description: Retrieve an individual QueryFilter as identified by the id parameter.
      operationId: View_Query_Filter
      summary: View Query Filter
  "/api/v3/queries/form":
    post:
      summary: Query Create Form
      operationId: Query_Create_Form
      tags:
      - Queries
      description: ''
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/Query_Create_Form"
      responses:
        '200':
          description: OK
          headers: {}
  "/api/v3/queries/operators/{id}":
    get:
      parameters:
      - description: QueryOperator id
        example: "!"
        in: path
        name: id
        required: true
        schema:
          type: string
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _links:
                      self:
                        href: "/api/v3/queries/operators/!"
                        title: is not
                    _type: QueryOperator
                    id: "!"
                    name: is not
              schema:
                "$ref": "#/components/schemas/Query_OperatorModel"
          description: OK
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:Unauthenticated
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions to see it.

            **Required permission:** view work package in any project
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The specified query does not exist.
          description: Returned if the QueryOperator does not exist.
          headers: {}
      tags:
      - Query Operators
      description: Retrieve an individual QueryOperator as identified by the `id`
        parameter.
      operationId: View_Query_Operator
      summary: View Query Operator
  "/api/v3/queries/schema":
    get:
      summary: View schema for global queries
      operationId: View_schema_for_global_queries
      tags:
      - Queries
      description: Retrieve the schema for global queries, those, that are not assigned
        to a project.
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                QuerySchema:
                  "$ref": "#/components/examples/QuerySchemaModel"
              schema:
                "$ref": "#/components/schemas/Schema_For_Global_QueriesModel"
          description: OK
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
          description: "**Required permission:** view work package in any project"
          headers: {}
  "/api/v3/queries/sort_bys/{id}":
    get:
      parameters:
      - description: QuerySortBy identifier. The identifier is a combination of the
          column identifier and the direction.
        example: status-asc
        in: path
        name: id
        required: true
        schema:
          type: string
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _links:
                      column:
                        href: "/api/v3/queries/columns/status"
                        title: Status
                      direction:
                        href: urn:openproject-org:api:v3:queries:directions:asc
                        title: Ascending
                      self:
                        href: "/api/v3/queries/sort_bys/status-asc"
                        title: Status (Ascending)
                    _type: QuerySortBy
                    id: status-asc
                    name: Status (Ascending)
              schema:
                "$ref": "#/components/schemas/Query_Sort_ByModel"
          description: OK
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:Unauthenticated
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions to see it.

            **Required permission:** view work package in any project
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The specified query does not exist.
          description: Returned if the QuerySortBy does not exist.
          headers: {}
      tags:
      - Query Sort Bys
      description: Retrieve an individual QuerySortBy as identified by the id parameter.
      operationId: View_Query_Sort_By
      summary: View Query Sort By
  "/api/v3/queries/{id}":
    delete:
      summary: Delete query
      operationId: Delete_query
      tags:
      - Queries
      description: Delete the query identified by the id parameter
      parameters:
      - description: Query id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '204':
          description: No Content
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** for own queries none; for public queries: manage public queries

            *Note that you will only receive this error, if you are at least allowed to see the corresponding query.*
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
          description: |-
            Returned if the query does not exist or the client does not have sufficient permissions to see it.

            **Required condition:** query belongs to user or query is public

            **Required permission:** view work package in queries project
          headers: {}
    get:
      summary: View query
      operationId: View_query
      tags:
      - Queries
      description: Retrieve an individual query as identified by the id parameter.
        Then end point accepts a number of parameters that can be used to override
        the resources' persisted parameters.
      parameters:
      - name: id
        description: Query id
        example: '1'
        in: path
        required: true
        schema:
          type: integer
      - name: filters
        description: |-
          JSON specifying filter conditions.
          The filters provided as parameters are not applied to the query but are instead used to override the query's persisted filters.
          All filters also accepted by the work packages endpoint are accepted. If no filter is to be applied, the client should send an empty array (`[]`).
        example: '[{ "assignee": { "operator": "=", "values": ["1", "5"] }" }]'
        in: query
        required: false
        schema:
          default: '[{ "status_id": { "operator": "o", "values": null }}]'
          type: string
      - name: offset
        description: Page number inside the queries' result collection of work packages.
        example: '25'
        in: query
        required: false
        schema:
          default: 1
          type: integer
      - name: pageSize
        description: Number of elements to display per page for the queries' result
          collection of work packages.
        example: '25'
        in: query
        required: false
        schema:
          type: integer
      - name: columns
        description: Selected columns for the table view.
        example: "[]"
        in: query
        required: false
        schema:
          default: "['type', 'priority']"
          type: string
      - name: sortBy
        description: JSON specifying sort criteria. The sort criteria is applied to
          the query's result collection of work packages overriding the query's persisted
          sort criteria.
        example: '[["status", "asc"]]'
        in: query
        required: false
        schema:
          default: '[["id", "asc"]]'
          type: string
      - name: groupBy
        description: The column to group by. The grouping criteria is applied to the
          to the query's result collection of work packages overriding the query's
          persisted group criteria.
        example: status
        in: query
        required: false
        schema:
          type: string
      - name: showSums
        description: Indicates whether properties should be summed up if they support
          it. The showSums parameter is applied to the to the query's result collection
          of work packages overriding the query's persisted sums property.
        example: true
        in: query
        required: false
        schema:
          default: false
          type: boolean
      - name: timestamps
        description: 'Indicates the timestamps to filter by when showing changed attributes
          on work packages. Values can be either ISO8601 dates, ISO8601 durations
          and the following relative date keywords: "oneDayAgo@HH:MM+HH:MM", "lastWorkingDay@HH:MM+HH:MM",
          "oneWeekAgo@HH:MM+HH:MM", "oneMonthAgo@HH:MM+HH:MM". The first "HH:MM" part
          represents the zero paded hours and minutes. The last "+HH:MM" part represents
          the timezone offset from UTC associated with the time, the offset can be
          positive or negative e.g."oneDayAgo@01:00+01:00", "oneDayAgo@01:00-01:00".
          Values older than 1 day are accepted only with valid Enterprise Token available.

          '
        example: 2023-01-01,P-1Y,PT0S,lastWorkingDay@12:00
        in: query
        required: false
        schema:
          default: PT0S
          type: string
      - name: timelineVisible
        description: Indicates whether the timeline should be shown.
        example: true
        in: query
        required: false
        schema:
          default: false
          type: boolean
      - name: timelineLabels
        description: Overridden labels in the timeline view
        example: "{}"
        in: query
        required: false
        schema:
          default: "{}"
          type: string
      - name: highlightingMode
        description: Highlighting mode for the table view.
        example: inline
        in: query
        required: false
        schema:
          default: inline
          type: string
      - name: highlightedAttributes
        description: Highlighted attributes mode for the table view when `highlightingMode`
          is `inline`. When set to `[]` all highlightable attributes will be returned
          as `highlightedAttributes`.
        example: "[]"
        in: query
        required: false
        schema:
          default: "['type', 'priority']"
          type: string
      - name: showHierarchies
        description: Indicates whether the hierarchy mode should be enabled.
        example: true
        in: query
        required: false
        schema:
          default: true
          type: boolean
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                Query:
                  "$ref": "#/components/examples/QueryModel"
              schema:
                "$ref": "#/components/schemas/QueryModel"
          description: OK
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The specified query does not exist.
          description: |-
            Returned if the query does not exist or the client does not have sufficient permissions to see it.

            **Required condition:** query belongs to user or query is public

            **Required permission:** view work package in queries project
          headers: {}
    patch:
      summary: Edit Query
      operationId: Edit_Query
      tags:
      - Queries
      description: |-
        When calling this endpoint the client provides a single object, containing the properties and links that it wants to change, in the body.
        Note that it is only allowed to provide properties or links supporting the **write** operation.
      parameters:
      - description: Query id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/Query_Update_Form"
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      highlightedAttributes: []
                      results:
                        _embedded:
                          elements:
                          - "<--- shortened for brevity --->"
                        _links:
                          changeSize:
                            href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=%7Bsize%7D&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
                            templated: true
                          createWorkPackage:
                            href: "/api/v3/work_packages/form"
                            method: post
                          createWorkPackageImmediate:
                            href: "/api/v3/work_packages"
                            method: post
                          jumpTo:
                            href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=%7Boffset%7D&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
                            templated: true
                          self:
                            href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
                        _type: WorkPackageCollection
                        count: 30
                        offset: 1
                        pageSize: 2
                        total: 234
                    _links:
                      columns:
                      - href: "/api/v3/queries/columns/id"
                        title: ID
                      - href: "/api/v3/queries/columns/subject"
                        title: Subject
                      - href: "/api/v3/queries/columns/type"
                        title: Type
                      - href: "/api/v3/queries/columns/status"
                        title: Status
                      - href: "/api/v3/queries/columns/priority"
                        title: Priority
                      - href: "/api/v3/queries/columns/assignee"
                        title: Assignee
                      - href: "/api/v3/queries/columns/updated_at"
                        title: Updated on
                      groupBy:
                        href:
                        title:
                      highlightedAttributes: []
                      project:
                        href: "/api/v3/projects/3"
                        title: copy
                      results:
                        href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
                      self:
                        href: "/api/v3/queries/9"
                        title: fdsfdsfdsf
                      sortBy:
                      - href: "/api/v3/queries/sort_bys/parent-desc"
                        title: Parent (Descending)
                      user:
                        href: "/api/v3/users/1"
                        title: OpenProject Admin
                    _type: Query
                    createdAt: '2015-03-20T12:56:56.343Z'
                    filters:
                    - _links:
                        filter:
                          href: "/api/v3/queries/filters/status"
                          title: Status
                        operator:
                          href: "/api/v3/queries/operators/o"
                          title: open
                        schema:
                          href: "/api/v3/queries/filter_instance_schemas/status"
                        values: []
                      _type: StatusQueryFilter
                      name: Status
                    - _links:
                        filter:
                          href: "/api/v3/queries/filters/dueDate"
                          title: Finish date
                        operator:
                          href: "/api/v3/queries/operators/<t+"
                          title: in less than
                        schema:
                          href: "/api/v3/queries/filter_instance_schemas/dueDate"
                      _type: DueDateQueryFilter
                      name: Finish date
                      values:
                      - '1'
                    id: 9
                    name: fdsfdsfdsf
                    public: false
                    starred: false
                    sums: false
                    updatedAt: '2015-05-20T18:16:53.884Z'
              schema:
                "$ref": "#/components/schemas/QueryModel"
          description: OK
          headers: {}
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not allowed to edit the content of the work package.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** edit work package
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The specified query does not exist.
          description: |-
            Returned if the query does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view work packages in the query's project (unless global)
          headers: {}
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
        '422':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _embedded:
                      details:
                        attribute: name
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation
                    message: The name might not be blank.
          description: |-
            Returned if:

            * the client tries to modify a read-only property (`PropertyIsReadOnly`)

            * a constraint for a property was violated (`PropertyConstraintViolation`)

            * the client provides a link to an invalid resource (`ResourceTypeMismatch`)
          headers: {}
  "/api/v3/queries/{id}/form":
    post:
      summary: Query Update Form
      operationId: Query_Update_Form
      tags:
      - Queries
      description: ''
      parameters:
      - description: Query id
        example: 1
        in: path
        name: id
        required: true
        schema:
          type: integer
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/Query_Update_Form"
      responses:
        '200':
          description: OK
          headers: {}
  "/api/v3/queries/{id}/star":
    patch:
      parameters:
      - description: Query id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      results:
                        _embedded:
                          elements:
                          - "<--- shortened for brevity --->"
                        _links:
                          changeSize:
                            href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=%7Bsize%7D&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
                            templated: true
                          createWorkPackage:
                            href: "/api/v3/work_packages/form"
                            method: post
                          createWorkPackageImmediate:
                            href: "/api/v3/work_packages"
                            method: post
                          jumpTo:
                            href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=%7Boffset%7D&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
                            templated: true
                          self:
                            href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
                        _type: WorkPackageCollection
                        count: 30
                        offset: 1
                        pageSize: 2
                        total: 234
                    _links:
                      columns:
                      - href: "/api/v3/queries/columns/id"
                        title: ID
                      - href: "/api/v3/queries/columns/subject"
                        title: Subject
                      - href: "/api/v3/queries/columns/type"
                        title: Type
                      - href: "/api/v3/queries/columns/status"
                        title: Status
                      - href: "/api/v3/queries/columns/priority"
                        title: Priority
                      - href: "/api/v3/queries/columns/assignee"
                        title: Assignee
                      - href: "/api/v3/queries/columns/updated_at"
                        title: Updated on
                      groupBy:
                        href:
                        title:
                      project:
                        href: "/api/v3/projects/3"
                        title: copy
                      results:
                        href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
                      self:
                        href: "/api/v3/queries/9"
                        title: fdsfdsfdsf
                      sortBy:
                      - href: "/api/v3/queries/sort_bys/parent-desc"
                        title: Parent (Descending)
                      user:
                        href: "/api/v3/users/1"
                        title: OpenProject Admin
                    _type: Query
                    createdAt: '2015-03-20T12:56:56.856Z'
                    filters:
                    - _links:
                        filter:
                          href: "/api/v3/queries/filters/status"
                          title: Status
                        operator:
                          href: "/api/v3/queries/operators/o"
                          title: open
                        schema:
                          href: "/api/v3/queries/filter_instance_schemas/status"
                        values: []
                      _type: StatusQueryFilter
                      name: Status
                    - _links:
                        filter:
                          href: "/api/v3/queries/filters/dueDate"
                          title: Finish date
                        operator:
                          href: "/api/v3/queries/operators/<t+"
                          title: in less than
                        schema:
                          href: "/api/v3/queries/filter_instance_schemas/dueDate"
                      _type: DueDateQueryFilter
                      name: Finish date
                      values:
                      - '1'
                    id: 9
                    name: fdsfdsfdsf
                    public: false
                    starred: true
                    sums: false
                    updatedAt: '2015-05-20T18:16:53.089Z'
              schema:
                "$ref": "#/components/schemas/Star_QueryModel"
          description: OK
          headers: {}
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not allowed to star this query.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** for own queries none; for public queries: manage public queries

            *Note that you will only receive this error, if you are at least allowed to see the corresponding query.*
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The specified query does not exist.
          description: |-
            Returned if the query does not exist or the client does not have sufficient permissions to see it.

            **Required condition:** query belongs to user or query is public

            **Required permission:** view work package in queries project
          headers: {}
      tags:
      - Queries
      description: ''
      operationId: Star_query
      summary: Star query
  "/api/v3/queries/{id}/unstar":
    patch:
      parameters:
      - description: Query id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      results:
                        _embedded:
                          elements:
                          - "<--- shortened for brevity --->"
                        _links:
                          changeSize:
                            href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=%7Bsize%7D&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
                            templated: true
                          createWorkPackage:
                            href: "/api/v3/work_packages/form"
                            method: post
                          createWorkPackageImmediate:
                            href: "/api/v3/work_packages"
                            method: post
                          jumpTo:
                            href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=%7Boffset%7D&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
                            templated: true
                          self:
                            href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
                        _type: WorkPackageCollection
                        count: 30
                        offset: 1
                        pageSize: 2
                        total: 234
                    _links:
                      columns:
                      - href: "/api/v3/queries/columns/id"
                        title: ID
                      - href: "/api/v3/queries/columns/subject"
                        title: Subject
                      - href: "/api/v3/queries/columns/type"
                        title: Type
                      - href: "/api/v3/queries/columns/status"
                        title: Status
                      - href: "/api/v3/queries/columns/priority"
                        title: Priority
                      - href: "/api/v3/queries/columns/assignee"
                        title: Assignee
                      - href: "/api/v3/queries/columns/updated_at"
                        title: Updated on
                      groupBy:
                        href:
                        title:
                      project:
                        href: "/api/v3/projects/3"
                        title: copy
                      results:
                        href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
                      self:
                        href: "/api/v3/queries/9"
                        title: fdsfdsfdsf
                      sortBy:
                      - href: "/api/v3/queries/sort_bys/parent-desc"
                        title: Parent (Descending)
                      user:
                        href: "/api/v3/users/1"
                        title: OpenProject Admin
                    _type: Query
                    createdAt: '2015-03-20T12:56:56.468Z'
                    filters:
                    - _links:
                        filter:
                          href: "/api/v3/queries/filters/status"
                          title: Status
                        operator:
                          href: "/api/v3/queries/operators/o"
                          title: open
                        schema:
                          href: "/api/v3/queries/filter_instance_schemas/status"
                        values: []
                      _type: StatusQueryFilter
                      name: Status
                    - _links:
                        filter:
                          href: "/api/v3/queries/filters/dueDate"
                          title: Finish date
                        operator:
                          href: "/api/v3/queries/operators/<t+"
                          title: in less than
                        schema:
                          href: "/api/v3/queries/filter_instance_schemas/dueDate"
                      _type: DueDateQueryFilter
                      name: Finish date
                      values:
                      - '1'
                    id: 9
                    name: fdsfdsfdsf
                    public: false
                    starred: false
                    sums: false
                    updatedAt: '2015-05-20T18:16:53.386Z'
              schema:
                "$ref": "#/components/schemas/Unstar_QueryModel"
          description: OK
          headers: {}
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not allowed to unstar this query.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** for own queries none; for public queries: manage public queries

            *Note that you will only receive this error, if you are at least allowed to see the corresponding query.*
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The specified query does not exist.
          description: |-
            Returned if the query does not exist or the client does not have sufficient permissions to see it.

            **Required condition:** query belongs to user or query is public

            **Required permission:** view work package in queries project
          headers: {}
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
      tags:
      - Queries
      description: ''
      operationId: Unstar_query
      summary: Unstar query
  "/api/v3/relations":
    get:
      summary: List Relations
      operationId: list_relations
      tags:
      - Relations
      description: |-
        Lists all relations according to the given (optional, logically conjunctive) filters and ordered by ID.
        The response only includes relations between work packages which the user is allowed to see.
      parameters:
      - name: filters
        description: |-
          JSON specifying filter conditions. Accepts the same format as returned by
          the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Valid fields to filter by are:

          - id - ID of relation
          - from - ID of work package from which the filtered relations emanates.
          - to - ID of work package to which this related points.
          - involved - ID of either the `from` or the `to` work package.
          - type - The type of relation to filter by, e.g. "follows".
        example: '[{ "from": { "operator": "=", "values": 42 }" }]'
        in: query
        required: false
        schema:
          type: string
      - name: sortBy
        description: |-
          JSON specifying sort criteria.
          Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint.
        example: '[["type", "asc"]]'
        in: query
        required: false
        schema:
          type: string
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/RelationCollectionModel"
              examples:
                response:
                  "$ref": "#/components/examples/RelationCollectionResponse"
        '400':
          description: Returned if the client provides invalid filter parameters.
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:InvalidQuery
                    message:
                    - Filters Type filter has invalid values.
  "/api/v3/relations/{id}":
    get:
      summary: Get Relation
      operationId: get_relation
      tags:
      - Relations
      description: Get a single relation specified by its unique identifier.
      parameters:
      - description: Relation id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              examples:
                response:
                  "$ref": "#/components/examples/RelationResponse"
              schema:
                "$ref": "#/components/schemas/RelationReadModel"
        '404':
          description: |-
            Returned if the relation does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view work packages for the involved work packages
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The specified relation does not exist.
    delete:
      summary: Delete Relation
      operationId: delete_relation
      tags:
      - Relations
      description: Deletes the relation.
      parameters:
      - description: The unique identifier of the relation resource
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '204':
          description: Returned if the relation was deleted successfully. The response
            body is empty.
        '403':
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** manage work package relations
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not allowed to delete this relation.
        '404':
          description: |-
            Returned if the relation does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view work packages
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The specified relation does not exist.
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
    patch:
      summary: Update Relation
      operationId: update_relation
      tags:
      - Relations
      description: |-
        When calling this endpoint the client provides a single object, containing the properties and links that it wants
        to change, in the body. It is only allowed to provide properties or links supporting the **write** operation.

        Note that changing the `type` of a relation invariably also changes the respective `reverseType` as well as the
        "name" of it. The returned Relation object will reflect that change. For instance if you change a Relation's
        `type` to "follows" then the `reverseType` will be changed to `precedes`.

        It is not allowed to change a relation's involved work packages.
      parameters:
      - description: Relation ID
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/RelationWriteModel"
            examples:
              request:
                "$ref": "#/components/examples/RelationUpdateRequest"
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/RelationReadModel"
              examples:
                response:
                  "$ref": "#/components/examples/RelationResponse"
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '404':
          description: |-
            Returned if the relation does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view work packages
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The specified relation does not exist.
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
        '422':
          description: |-
            Returned if:

            - the client tries to modify a read-only property (`PropertyIsReadOnly`)
            - a constraint for a property was violated (`PropertyConstraintViolation`)
            - the client provides a link to an invalid resource (`ResourceTypeMismatch`) or a
              work package that does not exist or for which the client does not have sufficient permissions
              to see it (**required permissions**: `view work packages` for the involved work packages).
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _embedded:
                      details:
                        attribute: lag
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation
                    message: Lag must be a number greater than or equal to 0
  "/api/v3/render/markdown":
    post:
      parameters:
      - description: |-
          API-Link to the context in which the rendering occurs, for example a specific work package.

          If left out only context-agnostic rendering takes place.
          Please note that OpenProject features markdown-extensions on top of the extensions GitHub Flavored Markdown (gfm) already
          provides that can only work given a context (e.g. display attached images).

          **Supported contexts:**

          * `/api/v3/work_packages/{id}` - an existing work package
        example: "/api/v3/work_packages/42"
        in: query
        name: context
        required: false
        schema:
          type: string
      responses:
        '200':
          content:
            text/html:
              examples:
                response:
                  value: <p>Hello world! <a href="http://example.com">This</a> <strong>is</strong>
                    markdown!</p>
              schema:
                "$ref": "#/components/schemas/MarkdownModel"
          description: OK
          headers: {}
        '400':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:InvalidRenderContext
                    message: Could not render markdown string in the given context.
          description: |-
            Returned if the context passed by the client is not valid (e.g. unknown).

            Note that this response will also occur when the requesting user
            is not allowed to see the context resource (e.g. limited work package visibility).
          headers: {}
        '415':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:TypeNotSupported
                    message: Expected Content-Type to be 'text/plain' but got 'application/json'.
          description: Returned if the Content-Type indicated in the request is not
            `text/plain`.
          headers: {}
      tags:
      - Previewing
      description: ''
      operationId: Preview_Markdown_document
      summary: Preview Markdown document
  "/api/v3/render/plain":
    post:
      responses:
        '200':
          content:
            text/html:
              examples:
                response:
                  value: "<p>Hello world! This *is* plain text!</p>\n"
              schema:
                "$ref": "#/components/schemas/Plain_TextModel"
          description: OK
          headers: {}
        '415':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:TypeNotSupported
                    message: Expected Content-Type to be 'text/plain' but got 'application/json'.
          description: Returned if the Content-Type indicated in the request is not
            `text/plain`.
          headers: {}
      tags:
      - Previewing
      description: ''
      operationId: Preview_plain_document
      summary: Preview plain document
  "/api/v3/revisions/{id}":
    get:
      parameters:
      - description: Revision id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _links:
                      author:
                        href: "/api/v3/users/1"
                      project:
                        href: "/api/v3/projects/1"
                      self:
                        href: "/api/v3/revisions/1"
                      showRevision:
                        href: "/projects/identifier/repository/revision/11f4b07"
                    _type: Revision
                    authorName: Some Developer
                    createdAt: '2015-07-21T13:36:59.454Z'
                    formattedIdentifier: 11f4b07
                    id: 1
                    identifier: 11f4b07dff4f4ce9548a52b7d002daca7cd63ec6
                    message:
                      format: plain
                      html: "<p>This revision provides new features<br/><br/>An elaborate
                        description</p>"
                      raw: |-
                        This revision provides new features

                        An elaborate description
              schema:
                "$ref": "#/components/schemas/RevisionModel"
          description: OK
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The specified revision does not exist.
          description: |-
            Returned if the revision does not exist or the client does not have sufficient permissions
            to see it.

            **Required permission:** view changesets for the project the repository is created in.

            *Note: A client without sufficient permissions shall not be able to test for the existence of a revision.
            That's why a 404 is returned here, even if a 403 might be more appropriate.*
          headers: {}
      tags:
      - Revisions
      description: ''
      operationId: View_revision
      summary: View revision
  "/api/v3/reminders":
    get:
      summary: List all active reminders
      operationId: list_reminders
      tags:
      - Reminders
      description: Gets a list of all active reminders for the user.
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                type: object
                required:
                - _type
                - total
                - count
                - _embedded
                properties:
                  _type:
                    type: string
                    enum:
                    - Collection
                  total:
                    type: integer
                    description: The total amount of elements available in the collection.
                    minimum: 0
                  count:
                    type: integer
                    description: Actual amount of elements in this response.
                    minimum: 0
                  _embedded:
                    type: object
                    required:
                    - elements
                    properties:
                      elements:
                        type: array
                        items:
                          "$ref": "#/components/schemas/ReminderModel"
  "/api/v3/reminders/{id}":
    patch:
      summary: Update a reminder
      operationId: update_reminder
      tags:
      - Reminders
      description: |-
        Updates an existing reminder.

        A user can only update their own active reminder.

        **Required permission:** view work packages for the project the reminder is contained in.
      parameters:
      - name: id
        in: path
        description: Reminder ID
        example: '1'
        required: true
        schema:
          type: integer
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                remindAt:
                  type: string
                  format: date-time
                  description: The date and time when the reminder is due
                note:
                  type: string
                  description: The note of the reminder (optional)
      responses:
        '200':
          description: Reminder updated successfully
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ReminderModel"
        '404':
          description: Returned if the reminder does not exist or the client does
            not have sufficient permissions to see it.
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
    delete:
      summary: Delete a reminder
      operationId: delete_reminder
      tags:
      - Reminders
      description: |-
        Deletes an existing reminder.

        A user can only delete their own active reminder.

        **Required permission:** view work packages for the project the reminder is contained in.
      parameters:
      - name: id
        in: path
        description: Reminder ID
        example: '1'
        required: true
        schema:
          type: integer
      responses:
        '204':
          description: Reminder deleted successfully
        '404':
          description: Returned if the reminder does not exist or the client does
            not have sufficient permissions to see it.
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
  "/api/v3/roles":
    get:
      parameters:
      - description: |-
          JSON specifying filter conditions.
          Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint.
          Currently supported filters are:

          + grantable: filters roles based on whether they are selectable for a membership

          + unit: filters roles based on the unit ('project' or 'system') for which they are selectable for a membership
        example: '[{ "unit": { "operator": "=", "values": ["system"] }" }]'
        in: query
        name: filters
        required: false
        schema:
          type: string
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      elements:
                      - _links:
                          self:
                            href: "/api/v3/roles/3"
                            title: Manager
                        _type: Role
                        id: 3
                        name: Manager
                      - _links:
                          self:
                            href: "/api/v3/roles/2"
                            title: Anonymous
                        _type: Role
                        id: 2
                        name: Anonymous
                      - _links:
                          self:
                            href: "/api/v3/roles/5"
                            title: Reader
                        _type: Role
                        id: 5
                        name: Reader
                      - _links:
                          self:
                            href: "/api/v3/roles/4"
                            title: Member
                        _type: Role
                        id: 4
                        name: Member
                      - _links:
                          self:
                            href: "/api/v3/roles/1"
                            title: Non member
                        _type: Role
                        id: 1
                        name: Non member
                    _links:
                      self:
                        href: "/api/v3/roles"
                    _type: Collection
                    count: 5
                    total: 5
              schema:
                "$ref": "#/components/schemas/RolesModel"
          description: OK
          headers: {}
      tags:
      - Roles
      description: List all defined roles. This includes built in roles like 'Anonymous'
        and 'Non member'.
      operationId: List_roles
      summary: List roles
  "/api/v3/roles/{id}":
    get:
      parameters:
      - description: Role id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _links:
                      self:
                        href: "/api/v3/roles/3"
                        title: Manager
                    _type: Role
                    id: 3
                    name: Manager
              schema:
                "$ref": "#/components/schemas/RoleModel"
          description: OK
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to view this resource.
          description: |-
            Returned if the client does not have sufficient permissions to see roles.

            **Required permission:** view members **or** manage members
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
          description: Returned if the role does not exist.
          headers: {}
      tags:
      - Roles
      description: Fetch an individual role.
      operationId: View_role
      summary: View role
  "/api/v3/statuses":
    get:
      summary: List the collection of all statuses
      operationId: list_statuses
      tags:
      - Statuses
      description: Returns a collection of all work package statuses.
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              examples:
                simple status collection:
                  "$ref": "#/components/examples/StatusCollection"
              schema:
                "$ref": "#/components/schemas/StatusCollectionModel"
        '403':
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** view work package (on any project)
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not allowed to see the statuses.
  "/api/v3/statuses/{id}":
    get:
      summary: Get a work package status
      operationId: get_status
      tags:
      - Statuses
      description: Returns a work package status by its unique identifier.
      parameters:
      - name: id
        description: Status id
        in: path
        required: true
        schema:
          type: integer
        example: '1'
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              examples:
                response:
                  "$ref": "#/components/examples/StatusResponse"
              schema:
                "$ref": "#/components/schemas/StatusModel"
        '403':
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** view work package (on any project)
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not allowed to see this status.
        '404':
          description: Returned if the status does not exist.
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
  "/api/v3/storages":
    get:
      summary: Get Storages
      operationId: list_storages
      tags:
      - File links
      description: Returns a collection of storages.
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/StorageCollectionModel"
              examples:
                Simple storage collection:
                  "$ref": "#/components/examples/StoragesSimpleCollectionModel"
        '400':
          description: Returned if the client sends invalid request parameters e.g.
            filters
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:InvalidQuery
                message: Filters Invalid filter does not exist.
    post:
      summary: Creates a storage.
      operationId: create_storage
      tags:
      - File links
      description: |-
        Creates a storage resource. When creating a storage, a confidential OAuth 2 provider application is created
        automatically. The oauth client id and secret of the created OAuth application are returned in the response.

        **IMPORTANT:** This is the only time, the oauth client secret is visible to the consumer. After that, the secret is
        hidden.

        To update the storage with OAuth client credentials, which enable the storage resource to behave as an OAuth 2
        client against an external OAuth 2 provider application, another request must be made to create those, see
        `POST /api/v3/storages/{id}/oauth_client_credentials`.
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/StorageWriteModel"
      responses:
        '201':
          description: Created
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/StorageReadModel"
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** Depends on the page the grid is defined for.
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
        '422':
          description: |-
            Returned if:

            * a constraint for a property was violated (`PropertyConstraintViolation`)
  "/api/v3/storages/{id}":
    get:
      summary: Get a storage
      operationId: get_storage
      tags:
      - File links
      description: |-
        Gets a storage resource. As a side effect, a live connection to the storages origin is established to retrieve
        connection state data.
      parameters:
      - name: id
        description: Storage id
        in: path
        required: true
        schema:
          type: integer
        example: 1337
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/StorageReadModel"
              examples:
                Nextcloud storage:
                  "$ref": "#/components/examples/StorageNextcloudResponse"
                Freshly created Nextcloud storage:
                  "$ref": "#/components/examples/StorageNextcloudResponseForCreation"
                OneDrive storage:
                  "$ref": "#/components/examples/StorageOneDriveResponse"
                Incomplete OneDrive storage:
                  "$ref": "#/components/examples/StorageOneDriveIncompleteResponse"
                Unauthorized Nextcloud storage:
                  "$ref": "#/components/examples/StorageNextcloudUnauthorizedResponse"
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The requested resource could not be found.
          description: |-
            Returned if the storage does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view file links
    patch:
      summary: Update a storage
      operationId: update_storage
      tags:
      - File links
      description: |-
        Updates a storage resource. Only data that is not generated by the server can be updated. This excludes the OAuth 2
        application data.
      parameters:
      - name: id
        description: Storage id
        in: path
        required: true
        schema:
          type: integer
        example: 1337
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/StorageWriteModel"
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/StorageReadModel"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** admin
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The requested resource could not be found.
          description: |-
            Returned if the storage does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view file links
    delete:
      summary: Delete a storage
      operationId: delete_storage
      tags:
      - File links
      description: |-
        Deletes a storage resource. This also deletes all related records, like the created oauth application, client, and
        any file links created within this storage.
      parameters:
      - name: id
        description: Storage id
        in: path
        required: true
        schema:
          type: integer
        example: 1337
      responses:
        '204':
          description: No content
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** admin
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The requested resource could not be found.
          description: |-
            Returned if the storage does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view file links
  "/api/v3/storages/{id}/files":
    get:
      summary: Gets files of a storage.
      operationId: get_storage_files
      tags:
      - File links
      description: |-
        Gets a collection of files from a storage.

        If no `parent` context is given, the result is the content of the document root. With `parent` context given, the
        result contains the collections of files/directories from within the given parent file id.

        If given `parent` context is no directory, `400 Bad Request` is returned.
      parameters:
      - name: id
        description: Storage id
        in: path
        required: true
        schema:
          type: integer
        example: 1337
      - name: parent
        description: Parent file identification
        in: query
        required: false
        schema:
          type: string
        example: "/my/data"
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/StorageFilesModel"
        '400':
          description: Returned if the given parent parameter value does not refer
            to a directory.
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:InvalidQuery
                message: The given parent is not a directory.
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The requested resource could not be found.
          description: |-
            Returned in either of those cases:
            - if the storage does not exist or the client does not have sufficient permissions to see it

              **Required permission:** view file links
            - if the document root file identification does not exist on the storage
  "/api/v3/storages/{id}/files/prepare_upload":
    post:
      summary: Preparation of a direct upload of a file to the given storage.
      operationId: prepare_storage_file_upload
      tags:
      - File links
      description: |-
        Executes a request that prepares a link for a direct upload to the storage.

        The background here is, that the client needs to make a direct request to the storage instance for file uploading,
        but should not get access to the credentials, which are stored in the backend. The response contains a link object,
        that enables the client to execute a file upload without the real credentials.
      parameters:
      - name: id
        description: Storage id
        in: path
        required: true
        schema:
          type: integer
        example: 1337
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/StorageFileUploadPreparationModel"
      responses:
        '201':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/StorageFileUploadLinkModel"
        '400':
          description: Returned if the given parent parameter value does not refer
            to a directory.
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:InvalidQuery
                message: The given parent is not a directory.
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** manage file links
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The requested resource could not be found.
          description: |-
            Returned if the storage does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view file links
        '500':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                outbound request failed:
                  description: |-
                    This error is returned, if the outbound request to the file storage failed with a 404, e.g. if the
                    upload location is not available.
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:OutboundRequest:NotFound
                    message: An outbound request to another resource has failed with
                      status code 404.
                enterprise token missing:
                  description: |-
                    This error is returned, if there is no Enterprise token available. The file upload to that storage is
                    only available in an Enterprise edition.
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingEnterpriseToken
                    message: The request cannot be handled due to invalid or missing
                      Enterprise token.
          description: Returned if the outbound request to the storage has failed
            with any reason.
  "/api/v3/storages/{id}/folders":
    post:
      summary: Creation of a new folder
      operationId: create_storage_folder
      tags:
      - File links
      description: Creates a new folder under the given parent
      parameters:
      - name: id
        description: Storage id
        in: path
        required: true
        schema:
          type: integer
        example: 1337
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/StorageFolderWriteModel"
            examples:
              Valid example:
                "$ref": "#/components/examples/StorageCreateFolderRequestBody"
      responses:
        '201':
          description: Created
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/StorageFileModel"
        '400':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:InvalidQuery
                message: The given parent is not a directory.
          description: Returned if the request is missing a required parameter.
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** manage file links
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The requested resource could not be found.
          description: |-
            Returned if the storage does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view file links
  "/api/v3/storages/{id}/oauth_client_credentials":
    post:
      summary: Creates an oauth client credentials object for a storage.
      operationId: create_storage_oauth_credentials
      tags:
      - File links
      description: |-
        Inserts the OAuth 2 credentials into the storage, to allow the storage to act as an OAuth 2 client. Calling this
        endpoint on a storage that already contains OAuth 2 client credentials will replace them.
      parameters:
      - name: id
        description: Storage id
        in: path
        required: true
        schema:
          type: integer
        example: 1337
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/OAuthClientCredentialsWriteModel"
      responses:
        '201':
          description: Created
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/StorageReadModel"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** admin
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The requested resource could not be found.
          description: |-
            Returned if the storage does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view file links
  "/api/v3/storages/{id}/open":
    get:
      summary: Open the storage
      operationId: open_storage
      tags:
      - File Links
      description: |-
        Gets a redirect to the location of the storage's remote origin. The storage's files root should be the target
        location.
      parameters:
      - name: id
        description: Storage id
        in: path
        required: true
        schema:
          type: integer
        example: 1337
      responses:
        '303':
          description: Redirect
          headers:
            Location:
              schema:
                type: string
                format: uri
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The requested resource could not be found.
          description: |-
            Returned if the storage does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view file links
  "/api/v3/time_entries":
    get:
      summary: List time entries
      operationId: list_time_entries
      tags:
      - Time entries
      description: |-
        Lists time entries. The time entries returned depend on the filters
        provided and also on the permission of the requesting user.
      parameters:
      - name: offset
        description: Page number inside the requested collection.
        example: 25
        in: query
        required: false
        schema:
          default: 1
          type: integer
      - name: pageSize
        description: Number of elements to display per page.
        example: '25'
        in: query
        required: false
        schema:
          type: integer
      - name: sortBy
        description: |-
          JSON specifying sort criteria.
          Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported sorts are:

          + id: Sort by primary key

          + hours: Sort by logged hours

          + spent_on: Sort by spent on date

          + created_at: Sort by time entry creation datetime

          + updated_at: Sort by the time the time entry was updated last
        example: '[["spent_on", "asc"]]'
        in: query
        required: false
        schema:
          default: '["spent_on", "asc"]'
          type: string
      - name: filters
        description: |-
          JSON specifying filter conditions.
          Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported filters are:

          + work_package: Filter time entries by work package

          + project: Filter time entries by project

          + user: Filter time entries by users

          + ongoing: Filter for your ongoing timers

          + spent_on: Filter time entries by spent on date

          + created_at: Filter time entries by creation datetime

          + updated_at: Filter time entries by the last time they where updated

          + activity: Filter time entries by time entry activity
        example: '[{ "work_package": { "operator": "=", "values": ["1", "2"] } },
          { "project": { "operator": "=", "values": ["1"] } }]'
        in: query
        required: false
        schema:
          type: string
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/TimeEntryCollectionModel"
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          description: Returned if the client is not logged in and login is required.
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not authorized to view this resource.
    post:
      summary: Create time entry
      tags:
      - Time entries
      description: |-
        Creates a new time entry applying the attributes provided in the body.
        Please note that while there is a fixed set of attributes, custom fields can extend
        a time entries' attributes and are accepted by the endpoint.
      operationId: create_time_entry
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/TimeEntryModel"
      responses:
        '201':
          description: Created
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/TimeEntryModel"
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** Log time
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
        '422':
          description: |-
            Returned if:

            * a constraint for a property was violated (`PropertyConstraintViolation`)
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _embedded:
                      details:
                        attribute: workPackage
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation
                    message: Work package is invalid.
  "/api/v3/time_entries/{id}/form":
    post:
      parameters:
      - description: Time entries activity id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: OK
          headers: {}
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions to edit the time entry.

            **Required permission:** *edit time entries* for every time entry of a project, or *edit own time entries* for time entries belonging to the user.
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
          description: |-
            Returned if the time entry does not exist or if the client does not have sufficient permissions to view it.

            **Required permission** `view time entries` in the project the time entry is assigned to or `view own time entries` for time entries belonging to the user
          headers: {}
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
      tags:
      - Time Entries
      description: ''
      operationId: Time_entry_update_form
      requestBody:
        content:
          application/json:
            schema:
              type: integer
        description: Time entries activity id
        required: true
      summary: Time entry update form
  "/api/v3/time_entries/activity/{id}":
    get:
      summary: View time entries activity
      operationId: get_time_entries_activity
      tags:
      - Time entry activities
      description: Fetches the time entry activity resource by the given id.
      parameters:
      - name: id
        description: Time entries activity id
        in: path
        example: 1
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/TimeEntryActivityModel"
        '404':
          description: |-
            Returned if the activity does not exist or if the user does not have permission to view them.

            **Required permission** `view time entries`, `log time`, `edit time entries`, `edit own time entries` or
            `manage project activities` in any project
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
  "/api/v3/time_entries/available_projects":
    get:
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      elements:
                      - _type: Project...
                      - _type: Project...
                    _links:
                      self:
                        href: "/api/v3/time_entries/available_projects"
                    _type: Collection
                    count: 2
                    total: 2
              schema:
                "$ref": "#/components/schemas/Available_projects_for_time_entriesModel"
          description: OK
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** *log time*, *edit time entries* or *edit own time entries* in any project
          headers: {}
      tags:
      - Time Entries
      description: Gets a list of projects in which a time entry can be created in
        or be assigned to on update. The list contains all projects in which the user
        issuing the request has the necessary permissions.
      operationId: Available_projects_for_time_entries
      summary: Available projects for time entries
  "/api/v3/time_entries/form":
    post:
      responses:
        '200':
          description: OK
          headers: {}
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** *log time* in any project
          headers: {}
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
      tags:
      - Time Entries
      description: ''
      operationId: Time_entry_create_form
      summary: Time entry create form
  "/api/v3/time_entries/schema":
    get:
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _dependencies: []
                    _links:
                      self:
                        href: "/api/v3/time_entries/schema"
                    _type: Schema
                    activity:
                      _links: {}
                      hasDefault: true
                      location: _links
                      name: Activity
                      required: true
                      type: TimeEntriesActivity
                      writable: true
                    createdAt:
                      hasDefault: false
                      name: Created on
                      options: {}
                      required: true
                      type: DateTime
                      writable: false
                    customField29:
                      hasDefault: false
                      name: sfsdfsdfsdfsdfdsf
                      options:
                        rtl:
                      required: false
                      type: String
                      writable: true
                    hours:
                      hasDefault: false
                      name: Hours
                      options: {}
                      required: true
                      type: Duration
                      writable: true
                    approvedHours:
                      hasDefault: false
                      name: Approved Hours
                      options: {}
                      required: false
                      type: Duration
                      writable: true
                    fromThKeyin:
                      hasDefault: false
                      name: From TH Keyin
                      options: {}
                      required: false
                      type: Boolean
                      writable: true
                    id:
                      hasDefault: false
                      name: ID
                      options: {}
                      required: true
                      type: Integer
                      writable: false
                    project:
                      _links: {}
                      hasDefault: false
                      location: _links
                      name: Project
                      required: false
                      type: Project
                      writable: true
                    ongoing:
                      hasDefault: false
                      name: Ongoing
                      options: {}
                      required: false
                      type: Boolean
                      writable: true
                    spentOn:
                      hasDefault: false
                      name: Date
                      options: {}
                      required: true
                      type: Date
                      writable: true
                    updatedAt:
                      hasDefault: false
                      name: Updated on
                      options: {}
                      required: true
                      type: DateTime
                      writable: false
                    user:
                      hasDefault: false
                      name: User
                      options: {}
                      required: true
                      type: User
                      writable: false
                    workPackage:
                      _links: {}
                      hasDefault: false
                      location: _links
                      name: Work package
                      required: false
                      type: WorkPackage
                      writable: true
              schema:
                "$ref": "#/components/schemas/View_time_entry_schemaModel"
          description: OK
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions to see the schema.

            **Required permission:** *log time* or *view time entries* or *edit time entries* or *edit own time entries* on any project
          headers: {}
      tags:
      - Time Entries
      description: ''
      operationId: View_time_entry_schema
      summary: View time entry schema
  "/api/v3/time_entries/{id}":
    delete:
      summary: Delete time entry
      tags:
      - Time entries
      description: Permanently deletes the specified time entry.
      operationId: delete_time_entry
      parameters:
      - name: id
        description: Time entry id
        example: 1
        in: path
        required: true
        schema:
          type: integer
      responses:
        '204':
          description: Returned if the time entry was deleted successfully.
        '403':
          description: Returned if the client does not have sufficient permissions
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not authorized to access this resource.
        '404':
          description: |-
            Returned if the time entry does not exist or if the user does not have sufficient permissions to see the time entry.

            **Required permission** `view time entries` in the project the time entry is assigned to or `view own time entries` for time entries belonging to the user
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The requested resource could not be found.
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
    get:
      summary: Get time entry
      tags:
      - Time entries
      description: Retrieves a single time entry identified by the given id.
      operationId: get_time_entry
      parameters:
      - name: id
        description: time entry id
        example: 1
        in: path
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/TimeEntryModel"
        '404':
          description: |-
            Returned if the time entry does not exist or if the user does not have permission to view them.

            **Required permission**
            - `view time entries` in the project the time entry is assigned to or
            - `view own time entries` for time entries belonging to the user
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The requested resource could not be found.
    patch:
      summary: update time entry
      tags:
      - Time Entries
      description: |-
        Updates the given time entry by applying the attributes provided in
        the body. Please note that while there is a fixed set of attributes, custom fields
        can extend a time entries' attributes and are accepted by the endpoint.
      operationId: update_time_entry
      parameters:
      - name: id
        description: Time entry id
        example: 1
        in: path
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/TimeEntryModel"
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** Edit (own) time entries, depending on what time entry is being modified.
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not authorized to access this resource.
          headers: {}
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
        '422':
          description: |-
            Returned if:

            * a constraint for a property was violated (`PropertyConstraintViolation`)
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _embedded:
                  details:
                    attribute: workPackage
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation
                message: Work package is invalid.
  "/api/v3/types":
    get:
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      elements:
                      - _links:
                          self:
                            href: "/api/v3/types/1"
                        _type: Type
                        color: "#ff0000"
                        createdAt: '2014-05-21T08:51:20.396Z'
                        id: 1
                        isDefault: true
                        isMilestone: false
                        name: Bug
                        position: 1
                        updatedAt: '2014-05-21T08:51:20.396Z'
                      - _links:
                          self:
                            href: "/api/v3/types/2"
                        _type: Type
                        color: "#888"
                        createdAt: '2014-05-21T08:51:20.396Z'
                        id: 2
                        isDefault: false
                        isMilestone: false
                        name: Feature
                        position: 2
                        updatedAt: '2014-05-21T08:51:20.396Z'
                    _links:
                      self:
                        href: "/api/v3/types"
                    _type: Collection
                    count: 2
                    total: 2
              schema:
                "$ref": "#/components/schemas/TypesModel"
          description: OK
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not allowed to see the types.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** view work package or manage types (on any project)
          headers: {}
      tags:
      - Types
      description: ''
      operationId: List_all_Types
      summary: List all Types
  "/api/v3/types/{id}":
    get:
      parameters:
      - description: Type id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _links:
                      self:
                        href: "/api/v3/types/1"
                    _type: Type
                    color: "#ff0000"
                    createdAt: '2014-05-21T08:51:20.396Z'
                    id: 1
                    isDefault: true
                    isMilestone: false
                    name: Bug
                    position: 1
                    updatedAt: '2014-05-21T08:51:20.396Z'
              schema:
                "$ref": "#/components/schemas/TypeModel"
          description: OK
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not allowed to see this type.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** view work package or manage types (on any project)
          headers: {}
      tags:
      - Types
      description: ''
      operationId: View_Type
      summary: View Type
  "/api/v3/users":
    get:
      summary: List Users
      operationId: list_Users
      description: |-
        Lists users. Only administrators or users with any of the following can access this resource:

        - `manage_members`
        - `manage_user`
        - `share_work_packages`
      tags:
      - Users
      - Principals
      parameters:
      - description: Page number inside the requested collection.
        example: '25'
        in: query
        name: offset
        required: false
        schema:
          default: 1
          type: integer
      - description: Number of elements to display per page.
        example: '25'
        in: query
        name: pageSize
        required: false
        schema:
          type: integer
      - description: |-
          JSON specifying filter conditions.
          Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/)
          endpoint. Currently supported filters are:

          + status: Status the user has

          + group: Name of the group in which to-be-listed users are members.

          + name: Filter users in whose first or last names, or email addresses the given string occurs.

          + login: User's login
        example: '[{ "status": { "operator": "=", "values": ["invited"] } }, { "group":
          { "operator": "=", "values": ["1"] } }, { "name": { "operator": "=", "values":
          ["h.wurst@openproject.com"] } }]'
        in: query
        name: filters
        required: false
        schema:
          type: string
      - description: |-
          JSON specifying sort criteria.
          Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint.
        example: '[["status", "asc"]]'
        in: query
        name: sortBy
        required: false
        schema:
          type: string
      - description: Comma separated list of properties to include.
        example: total,elements/name,elements/self,self
        in: query
        name: select
        required: false
        schema:
          type: string
      responses:
        '200':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/UserCollectionModel"
          description: OK
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not allowed to list users.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** Administrator or any of: 'manage_members', 'manage_user', 'share_work_packages'.
    post:
      summary: Create User
      operationId: create_user
      tags:
      - Users
      - Principals
      description: |-
        Creates a new user. Only administrators and users with manage_user global permission are allowed to do so.
        When calling this endpoint the client provides a single object, containing at least the properties and links that are required, in the body.

        Valid values for `status`:

        1) "active" - In this case a password has to be provided in addition to the other attributes.

        2) "invited" - In this case nothing but the email address is required. The rest is optional. An invitation will be sent to the user.
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/UserCreateModel"
      responses:
        '201':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/UserModel"
          description: Created
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not allowed to create new users.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** Administrator
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
        '422':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _embedded:
                  details:
                    attribute: email
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation
                message: The email address is already taken.
          description: |-
            Returned if:

            * a constraint for a property was violated (`PropertyConstraintViolation`)
  "/api/v3/users/schema":
    get:
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _dependencies: []
                    _links:
                      self:
                        href: "/api/v3/users/schema"
                    _type: Schema
                    admin:
                      hasDefault: false
                      name: Administrator
                      options: {}
                      required: false
                      type: Boolean
                      writable: true
                    avatar:
                      hasDefault: false
                      name: Avatar
                      options: {}
                      required: false
                      type: String
                      writable: false
                    createdAt:
                      hasDefault: false
                      name: Created on
                      options: {}
                      required: true
                      type: DateTime
                      writable: false
                    customField1:
                      hasDefault: false
                      name: User String CF
                      required: false
                      type: String
                      writable: true
                    customField2:
                      hasDefault: false
                      location: _links
                      name: User List cf
                      required: false
                      type: CustomOption
                      writable: true
                    firstName:
                      hasDefault: false
                      maxLength: 255
                      minLength: 1
                      name: First name
                      options: {}
                      required: true
                      type: String
                      writable: false
                    id:
                      hasDefault: false
                      name: ID
                      options: {}
                      required: true
                      type: Integer
                      writable: false
                    identityUrl:
                      hasDefault: false
                      name: Identity url
                      options: {}
                      required: false
                      type: String
                      writable: true
                    language:
                      hasDefault: false
                      name: Language
                      options: {}
                      required: false
                      type: String
                      writable: true
                    lastName:
                      hasDefault: false
                      maxLength: 255
                      minLength: 1
                      name: Last name
                      options: {}
                      required: true
                      type: String
                      writable: false
                    login:
                      hasDefault: false
                      maxLength: 255
                      minLength: 1
                      name: Username
                      options: {}
                      required: true
                      type: String
                      writable: true
                    mail:
                      hasDefault: false
                      maxLength: 255
                      minLength: 1
                      name: Email
                      options: {}
                      required: true
                      type: String
                      writable: true
                    password:
                      hasDefault: false
                      name: Password
                      options: {}
                      required: false
                      type: Password
                      writable: false
                    status:
                      hasDefault: false
                      name: Status
                      options: {}
                      required: false
                      type: String
                      writable: true
                    updatedAt:
                      hasDefault: false
                      name: Updated on
                      options: {}
                      required: true
                      type: DateTime
                      writable: false
              schema:
                "$ref": "#/components/schemas/View_user_schemaModel"
          description: OK
          headers: {}
      tags:
      - Users
      description: The schema response use two exemplary custom fields that extend
        the schema response. Depending on your instance and custom field configuration,
        the response will look somewhat different.
      operationId: View_user_schema
      summary: View user schema
  "/api/v3/users/{id}":
    delete:
      summary: Delete user
      operationId: delete_user
      description: Permanently deletes the specified user account.
      tags:
      - Users
      - Principals
      parameters:
      - description: User id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '202':
          description: |-
            Returned if the account was deleted successfully.

            Note that the response body is empty as of now. In future versions of the API a body
            *might* be returned, indicating the progress of deletion.
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not allowed to delete the account of this user.
          description: |-
            Returned if the client does not have sufficient permissions or if deletion of users was disabled in the instance wide settings.

            **Required permission:** Administrators only (exception: users might be able to delete their own accounts)
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The specified user does not exist.
          description: Returned if the user does not exist.
    get:
      summary: View user
      operationId: view_user
      description: ''
      tags:
      - Users
      - Principals
      parameters:
      - description: User id. Use `me` to reference current user, if any.
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: string
      responses:
        '200':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/UserModel"
              examples:
                user response:
                  "$ref": "#/components/examples/UserResponse"
          description: OK
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The specified user does not exist or you do not have permission
                  to view them.
          description: |-
            Returned if the user does not exist or if the API user does not have permission to view them.

            **Required permission** The user needs to be locked in if the installation is configured to prevent anonymous access
    patch:
      summary: Update user
      operationId: update_user
      tags:
      - Users
      - Principals
      description: |-
        Updates the user's writable attributes.
        When calling this endpoint the client provides a single object, containing at least the properties and links that are required, in the body.
      parameters:
      - description: User id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/UserCreateModel"
      responses:
        '200':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/UserModel"
          description: OK
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not allowed to update the account of this user.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** Administrators, manage_user global permission
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The specified user does not exist or you do not have permission
                  to view them.
          description: |-
            Returned if the user does not exist or if the API user does not have the necessary permissions to update it.

            **Required permission:** Administrators only (exception: users may update their own accounts)
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
        '422':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _embedded:
                  details:
                    attribute: email
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation
                message: The email address is already taken.
          description: |-
            Returned if:

            * the client tries to modify a read-only property (`PropertyIsReadOnly`)

            * a constraint for a property was violated (`PropertyConstraintViolation`)
  "/api/v3/users/{id}/form":
    post:
      parameters:
      - description: User id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: OK
          headers: {}
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** manage_user global permission
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
          description: |-
            Returned if the request user can not be found.

            *Note: A client without sufficient permissions shall not be able to test for the existence of
            a membership. That's why a 404 is returned here, even if a 403 might be more appropriate.*
          headers: {}
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
      tags:
      - Users
      description: ''
      operationId: User_update_form
      summary: User update form
  "/api/v3/users/{id}/lock":
    delete:
      summary: Unlock user
      operationId: unlock_user
      tags:
      - Users
      parameters:
      - description: User id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/UserModel"
          description: OK
        '400':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:InvalidUserStatusTransition
                message: The current user account status does not allow this operation.
          description: |-
            Returned if the client tries to unlock a user account whose current status does not allow this transition.

            **Required permission:** Administrators only
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not allowed to unlock the account of this user.
          description: |-
            Returned if the client does not have sufficient permissions for unlocking a user.

            **Required permission:** Administrators only
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The specified user does not exist.
          description: Returned if the user does not exist.
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
    post:
      summary: Lock user
      operationId: lock_user
      tags:
      - Users
      parameters:
      - description: User id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/UserModel"
          description: OK
        '400':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:InvalidUserStatusTransition
                message: The current user account status does not allow this operation.
          description: |-
            Returned if the client tries to lock a user account whose current status does not allow this transition.

            **Required permission:** Administrators only
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not allowed to lock the account of this user.
          description: |-
            Returned if the client does not have sufficient permissions for locking a user.

            **Required permission:** Administrators only
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The specified user does not exist.
          description: Returned if the user does not exist.
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
  "/api/v3/values/schema/{id}":
    get:
      parameters:
      - name: id
        in: path
        description: |-
          The identifier of the value. This is typically the value of the `property` property of
          the `Values` resource. It should be in lower camelcase format.
        example: startDate
        required: true
        schema:
          type: string
      responses:
        '200':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/SchemaModel"
              examples:
                Values::Property Start date schema:
                  "$ref": "#/components/examples/ValuesPropertyStartDateSchema"
                Values::Property Due date schema:
                  "$ref": "#/components/examples/ValuesPropertyDueDateSchema"
                Values::Property Date schema for Milestone work package:
                  "$ref": "#/components/examples/ValuesPropertyDateSchema"
          description: OK
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The requested resource could not be found.
          description: Returned if the schema does not exist.
        '400':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:BadRequest
                message: 'Bad request: property is invalid'
          description: Returned if the requested property id is not in a lower camel
            case format.
      tags:
      - Values::Property
      description: The schema of a `Values` resource.
      operationId: View_values_schema
      summary: View Values schema
  "/api/v3/versions":
    get:
      parameters:
      - description: |-
          JSON specifying filter conditions.
          Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint.
          Currently supported filters are:

          + sharing: filters versions by how they are shared within the server (*none*, *descendants*, *hierarchy*, *tree*, *system*).
        example: '[{ "sharing": { "operator": "*", "values": ["system"] }" }]'
        in: query
        name: filters
        required: false
        schema:
          type: string
      - description: |-
          JSON specifying sort criteria.
          Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint. Currently supported attributes are:

          + id: Sort by the version id
          + name: Sort by the version name using numeric collation, comparing sequences of decimal digits by their numeric value
          + semver_name: Deprecated, use name instead
        example: '[["name", "desc"]]'
        in: query
        name: sortBy
        required: false
        schema:
          type: string
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      elements:
                      - _links:
                          availableInProjects:
                            href: "/api/v3/versions/11/projects"
                          definingProject:
                            href: "/api/v3/projects/12"
                          self:
                            href: "/api/v3/versions/11"
                        _type: Version
                        description:
                          format: plain
                          html: This version has a description
                          raw: This version has a description
                        endDate:
                        id: 11
                        name: v3.0 Alpha
                        startDate: '2014-11-20'
                        status: Open
                      - _links:
                          availableInProjects:
                            href: "/api/v3/versions/12/projects"
                          definingProject:
                            href: "/api/v3/projects/11"
                          self:
                            href: "/api/v3/versions/12"
                        _type: Version
                        description:
                          format: plain
                          html: ''
                          raw: ''
                        endDate:
                        id: 12
                        name: v2.0
                        startDate:
                        status: Closed
                      - _links:
                          availableInProjects:
                            href: "/api/v3/versions/13/projects"
                          definingProject:
                            href: "/api/v3/projects/13"
                          self:
                            href: "/api/v3/versions/10"
                        _type: Version
                        description:
                          format: plain
                          html: ''
                          raw: ''
                        endDate:
                        id: 10
                        name: v1.0
                        startDate:
                        status: Open
                    _links:
                      self:
                        href: "/api/v3/versions"
                    _type: Collection
                    count: 3
                    total: 3
              schema:
                "$ref": "#/components/schemas/VersionsModel"
          description: OK
          headers: {}
      tags:
      - Versions
      description: Returns a collection of versions. The client can choose to filter
        the versions similar to how work packages are filtered. In addition to the
        provided filters, the server will reduce the result set to only contain versions,
        for which the requesting client has sufficient permissions (*view_work_packages*).
      operationId: List_versions
      summary: List versions
    post:
      responses:
        '201':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/VersionModel"
          description: Created
          headers: {}
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** Manage versions
          headers: {}
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
        '422':
          description: |-
            Returned if:

            * a constraint for a property was violated (`PropertyConstraintViolation`)
          headers: {}
      tags:
      - Versions
      description: |-
        Creates a new version applying the attributes provided in the body. Please note that while there is a fixed set of attributes, custom fields can extend a version's attributes and are accepted by the endpoint.

        You can use the form and schema to be retrieve the valid attribute values and by that be guided towards successful creation.
      operationId: Create_version
      summary: Create version
  "/api/v3/versions/available_projects":
    get:
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      elements:
                      - _links:
                          categories:
                            href: "/api/v3/projects/6/categories"
                          createWorkPackage:
                            href: "/api/v3/projects/6/work_packages/form"
                            method: post
                          createWorkPackageImmediate:
                            href: "/api/v3/projects/6/work_packages"
                            method: post
                          editWorkPackage:
                            href: "/api/v3//work_packages/{id}/form"
                            method: post
                            templated: true
                          self:
                            href: "/api/v3/projects/6"
                            title: A project
                          versions:
                            href: "/api/v3/projects/6/versions"
                        _type: Project
                        createdAt: '2015-07-06T13:28:14+00:00'
                        description: Eveniet molestias omnis quis aut qui eum adipisci.
                          Atque aut aut in exercitationem adipisci amet. Nisi asperiores
                          quia ratione veritatis enim exercitationem magnam. Aut fuga
                          architecto adipisci nihil. Et repellat pariatur. Aliquam
                          et sed perferendis nostrum quaerat. Fugit doloremque voluptatem.
                        id: 6
                        identifier: a_project
                        name: A project
                        type: Customer Project
                        updatedAt: '2015-10-01T09:55:02+00:00'
                      - _links:
                          categories:
                            href: "/api/v3/projects/14/categories"
                          createWorkPackage:
                            href: "/api/v3/projects/14/work_packages/form"
                            method: post
                          createWorkPackageImmediate:
                            href: "/api/v3/projects/14/work_packages"
                            method: post
                          self:
                            href: "/api/v3/projects/14"
                            title: Another project
                          versions:
                            href: "/api/v3/projects/14/versions"
                        _type: Project
                        createdAt: '2016-02-29T12:50:20+00:00'
                        description: ''
                        id: 14
                        identifier: another_project
                        name: Another project
                        type:
                        updatedAt: '2016-02-29T12:50:20+00:00'
                    _links:
                      self:
                        href: "/api/v3/versions/available_projects"
                    _type: Collection
                    count: 2
                    total: 2
              schema:
                "$ref": "#/components/schemas/Available_projects_for_versionsModel"
          description: OK
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** manage versions
          headers: {}
      tags:
      - Versions
      description: Gets a list of projects in which a version can be created in. The
        list contains all projects in which the user issuing the request has the manage
        versions permissions.
      operationId: Available_projects_for_versions
      summary: Available projects for versions
  "/api/v3/versions/form":
    post:
      responses:
        '200':
          description: OK
          headers: {}
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** manage versions in any project
          headers: {}
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
      tags:
      - Versions
      description: ''
      operationId: Version_create_form
      summary: Version create form
  "/api/v3/versions/schema":
    get:
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _dependencies: []
                    _links:
                      self:
                        href: "/api/v3/versions/schema"
                    _type: Schema
                    createdAt:
                      hasDefault: false
                      name: Created on
                      required: true
                      type: DateTime
                      writable: false
                    customField14:
                      hasDefault: false
                      name: text CF
                      required: false
                      type: String
                      visibility: default
                      writable: true
                    customField40:
                      _links: {}
                      hasDefault: false
                      location: _links
                      name: List CF
                      required: false
                      type: CustomOption
                      visibility: default
                      writable: true
                    definingProject:
                      _links: {}
                      hasDefault: false
                      name: Project
                      required: true
                      type: Project
                      writable: true
                    description:
                      hasDefault: false
                      name: Description
                      required: false
                      type: Formattable
                      writable: true
                    endDate:
                      hasDefault: false
                      name: Finish date
                      required: false
                      type: Date
                      writable: false
                    id:
                      hasDefault: false
                      name: ID
                      required: true
                      type: Integer
                      writable: false
                    name:
                      hasDefault: false
                      maxLength: 60
                      minLength: 1
                      name: Name
                      required: true
                      type: String
                      writable: true
                    sharing:
                      _links: {}
                      hasDefault: false
                      name: Sharing
                      required: true
                      type: String
                      visibility: default
                      writable: true
                    startDate:
                      hasDefault: false
                      name: Start date
                      required: false
                      type: Date
                      writable: true
                    status:
                      _links: {}
                      hasDefault: false
                      name: Status
                      required: true
                      type: String
                      visibility: default
                      writable: true
                    updatedAt:
                      hasDefault: false
                      name: Updated on
                      required: true
                      type: DateTime
                      writable: false
              schema:
                "$ref": "#/components/schemas/Version_schemaModel"
          description: OK
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions to see the schema.

            **Required permission:** view work packages or manage versions on any project
          headers: {}
      tags:
      - Versions
      description: ''
      operationId: View_version_schema
      summary: View version schema
  "/api/v3/versions/{id}":
    delete:
      parameters:
      - description: Version id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '204':
          description: Returned if the version was successfully deleted
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** manage versions
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
          description: |-
            Returned if the version does not exist or the client does not have sufficient permissions
            to see it.

            **Required permission:** view work packages **or** manage versions (any project where the version is available)

            *Note: A client without sufficient permissions shall not be able to test for the existence of
            a version. That's why a 404 is returned here, even if a 403 might be more appropriate.*
          headers: {}
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
      tags:
      - Versions
      description: Deletes the version. Work packages associated to the version will
        no longer be assigned to it.
      operationId: Delete_Version
      summary: Delete version
    get:
      parameters:
      - description: Version id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _links:
                      availableInProjects:
                        href: "/api/v3/versions/11/projects"
                      customField4:
                        href: "/api/v3/custom_options/5"
                        title: Custom field option
                      definingProject:
                        href: "/api/v3/projects/11"
                      self:
                        href: "/api/v3/versions/11"
                      update:
                        href: "/api/v3/versions/11/form"
                        method: POST
                      updateImmediately:
                        href: "/api/v3/versions/11"
                        method: PATCH
                    _type: Version
                    customField14: '1234567890'
                    description:
                      format: plain
                      html: This version has a description
                      raw: This version has a description
                    endDate:
                    id: 11
                    name: v3.0 Alpha
                    sharing: system
                    startDate: '2014-11-20'
                    status: open
              schema:
                "$ref": "#/components/schemas/VersionModel"
          description: OK
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
          description: |-
            Returned if the version does not exist or the client does not have sufficient permissions
            to see it.

            **Required permission:** view work packages **or** manage versions (any project where the version is available)

            *Note: A client without sufficient permissions shall not be able to test for the existence of
            a version. That's why a 404 is returned here, even if a 403 might be more appropriate.*
          headers: {}
      tags:
      - Versions
      description: ''
      operationId: View_version
      summary: View version
    patch:
      parameters:
      - description: Version id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/VersionModel"
          description: OK
          headers: {}
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** Manage versions in the version's project.
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
          description: |-
            Returned if the version does not exist or the client does not have sufficient permissions
            to see it.

            **Required permission:** view work packages **or** manage versions (any project where the version is available)

            *Note: A client without sufficient permissions shall not be able to test for the existence of
            a version. That's why a 404 is returned here, even if a 403 might be more appropriate.*
          headers: {}
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
        '422':
          description: |-
            Returned if:

            * a constraint for a property was violated (`PropertyConstraintViolation`)
          headers: {}
      tags:
      - Versions
      description: Updates the given version by applying the attributes provided in
        the body. Please note that while there is a fixed set of attributes, custom
        fields can extend a version's attributes and are accepted by the endpoint.
      operationId: Update_Version
      summary: Update Version
  "/api/v3/versions/{id}/form":
    post:
      parameters:
      - description: Project id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: OK
          headers: {}
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** manage versions in the version's project
          headers: {}
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
      tags:
      - Versions
      description: ''
      operationId: Version_update_form
      summary: Version update form
  "/api/v3/versions/{id}/projects":
    get:
      parameters:
      - description: Version id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      elements:
                      - _links:
                          categories:
                            href: "/api/v3/projects/1/categories"
                          self:
                            href: "/api/v3/projects/1"
                            title: Lorem
                          status:
                            href: "/api/v3/project_statuses/on_track"
                            title: On track
                          versions:
                            href: "/api/v3/projects/1/versions"
                        _type: Project
                        active: true
                        createdAt: '2014-05-21T08:51:20.396Z'
                        description:
                          format: markdown
                          html: "<p>Lorem <strong>ipsum</strong> dolor sit amet</p>"
                          raw: Lorem **ipsum** dolor sit amet
                        id: 1
                        identifier: project_identifier
                        name: Project example
                        statusExplanation:
                          format: markdown
                          html: "<p>Everything <strong>fine</strong></p>"
                          raw: Everything **fine**
                        updatedAt: '2014-05-21T08:51:20.396Z'
                    _links:
                      self:
                        href: "/api/v3/versions/2/projects"
                    _type: Collection
                    count: 1
                    total: 1
              schema:
                "$ref": "#/components/schemas/List_projects_by_versionModel"
          description: OK
          headers: {}
        '404':
          description: |-
            Returned if the version does not exist or the client does not have sufficient permissions
            to see it.

            **Required permission:** view work packages **or** manage versions (any project where the given version is available)

            *Note: A client without sufficient permissions shall not be able to test for the existence of a version.
            That's why a 404 is returned here, even if a 403 might be more appropriate.*
          headers: {}
      tags:
      - Projects
      description: |-
        This endpoint lists the projects where the given version is available.

        The projects returned depend on the sharing settings of the given version,
        but are also limited to the projects that the current user is allowed to see.
      operationId: List_projects_with_version
      summary: List projects having version
  "/api/v3/views":
    get:
      parameters:
      - description: |-
          JSON specifying filter conditions.
          Currently supported filters are:

          + project: filters views by the project their associated query is assigned to. If the project filter is passed with the `!*` (not any) operator, global views are returned.

          + id: filters views based on their id

          + type: filters views based on their type
        example: '[{ "project_id": { "operator": "!*", "values": null }" }]'
        in: query
        name: filters
        required: false
        schema:
          type: string
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                Queries:
                  "$ref": "#/components/examples/Views"
          description: OK
          headers: {}
      tags:
      - Views
      description: Returns a collection of Views. The collection can be filtered via
        query parameters similar to how work packages are filtered.
      operationId: List_views
      summary: List views
  "/api/v3/views/{id}":
    get:
      parameters:
      - description: View id
        example: 42
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                ViewWorkPackagesTable:
                  "$ref": "#/components/examples/ViewWorkPackagesTable"
                ViewTeamPlanner:
                  "$ref": "#/components/examples/ViewTeamPlanner"
          description: Returns the result of a single view, dependent of the view
            type.
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** The required permission depends on the type of the view.
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
          description: |-
            Returned if the resource can not be found.

            *Note: A client without sufficient permissions shall not be able to test for the existence of
            a view. That's why a 404 is returned here, even if a 403 might be more appropriate.*
          headers: {}
      tags:
      - Views
      description: ''
      operationId: View_view
      summary: View view
    post:
      parameters:
      - description: The view identifier
        name: id
        in: path
        required: true
        example: '1'
        schema:
          type: string
      requestBody:
        content:
          application/json:
            examples:
              Views::WorkPackagesTable:
                value:
                  _links:
                    query:
                      href: "/api/v3/queries/5"
              Views::TeamPlanner:
                value:
                  _links:
                    query:
                      href: "/api/v3/queries/5"
            schema:
              type: object
              properties:
                _links:
                  type: object
                  properties:
                    query:
                      type: object
                      properties:
                        href:
                          type: string
                          format: uri
      responses:
        '201':
          content:
            application/hal+json:
              schema:
                type: object
              examples:
                Views::WorkPackagesTable:
                  "$ref": "#/components/examples/ViewWorkPackagesTable"
                Views::TeamPlanner:
                  "$ref": "#/components/examples/ViewTeamPlanner"
          description: Created
          headers: {}
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
        '422':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _embedded:
                      details:
                        attribute: query
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation
                    message: Query does not exist.
          description: |-
            Returned if:

            * the client tries to modify a read-only property (`PropertyIsReadOnly`)

            * a constraint for a property was violated (`PropertyConstraintViolation`)

            * the client provides a link to an invalid resource (`ResourceTypeMismatch`),
              e.g. a query not found
          headers: {}
      tags:
      - Views
      description: |-
        When calling this endpoint the client provides a single object, containing at least the properties and links that are required, in the body.
        The required fields of a View can be found in its schema, which is embedded in the respective form.
        Note that it is only allowed to provide properties or links supporting the write operation.

        There are different subtypes of `Views` (e.g. `Views::WorkPackagesTable`) with each having its own
        endpoint for creating that subtype e.g.

        * `/api/v3/views/work_packages_table` for `Views::WorkPackagesTable`
        * `/api/v3/views/team_planner` for `Views::TeamPlanner`
        * `/api/v3/views/work_packages_calendar` for `Views::WorkPackagesCalendar`

        **Not yet implemented** To get the list of available subtypes and by that the endpoints for creating a subtype, use the
        ```
          /api/v3/views/schemas
        ```
        endpoint.
      operationId: Create_views
      summary: Create view
  "/api/v3/wiki_pages/{id}":
    get:
      parameters:
      - description: Wiki page identifier
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      project:
                        _type: Project...
                        id: 12
                    _links:
                      addAttachment:
                        href: "/api/v3/wiki_pages/72/attachments"
                        method: post
                      attachments:
                        href: "/api/v3/wiki_pages/72/attachments"
                      project:
                        href: "/api/v3/projects/12"
                        title: some project
                      self:
                        href: "/api/v3/wiki_pages/72"
                    _type: WikiPage
                    id: 72
                    title: A wiki page with a name
              schema:
                "$ref": "#/components/schemas/Wiki_PageModel"
          description: OK
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
          description: |-
            Returned if the wiki page does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view wiki page in the page's project
          headers: {}
      tags:
      - Wiki Pages
      description: Retrieve an individual wiki page as identified by the id parameter
      operationId: View_Wiki_Page
      summary: View Wiki Page
  "/api/v3/wiki_pages/{id}/attachments":
    get:
      parameters:
      - description: ID of the wiki page whose attachments will be listed
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      elements:
                      - _links:
                          author:
                            href: "/api/v3/users/1"
                            title: OpenProject Admin
                          container:
                            href: "/api/v3/wiki_pages/72"
                            title: wiki
                          delete:
                            href: "/api/v3/attachments/376"
                            method: delete
                          downloadLocation:
                            href: "/api/v3/attachments/376/content"
                          self:
                            href: "/api/v3/attachments/376"
                            title: 200.gif
                        _type: Attachment
                        contentType: image/gif
                        createdAt: '2018-06-01T07:24:19.896Z'
                        description:
                          format: plain
                          html: ''
                          raw: ''
                        digest:
                          algorithm: md5
                          hash: 7ac9c97ef73d47127f590788b84c0c1c
                        fileName: some.gif
                        fileSize: 3521772
                        id: 376
                    _links:
                      self:
                        href: "/api/v3/wiki_pages/72/attachments"
                    _type: Collection
                    count: 1
                    total: 1
              schema:
                "$ref": "#/components/schemas/Attachments_Model"
          description: OK
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
          description: |-
            Returned if the wiki page does not exist or the client does not have sufficient permissions
            to see it.

            **Required permission:** view wiki pages

            *Note: A client without sufficient permissions shall not be able to test for the existence of a work package.
            That's why a 404 is returned here, even if a 403 might be more appropriate.*
          headers: {}
      tags:
      - Attachments
      description: ''
      operationId: List_attachments_by_wiki_page
      summary: List attachments by wiki page
    post:
      parameters:
      - description: ID of the wiki page to receive the attachment
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      author:
                        _links:
                          lock:
                            href: "/api/v3/users/1/lock"
                            method: post
                            title: Set lock on admin
                          self:
                            href: "/api/v3/users/1"
                            title: OpenProject Admin
                          showUser:
                            href: "/users/1"
                            type: text/html
                          updateImmediately:
                            href: "/api/v3/users/1"
                            method: patch
                            title: Update admin
                        _type: User
                        admin: true
                        avatar: ''
                        createdAt: '2015-03-20T12:56:52.343Z'
                        email:
                        firstName: OpenProject
                        id: 1
                        identityUrl:
                        lastName: Admin
                        login: admin
                        name: OpenProject Admin
                        status: active
                        updatedAt: '2018-05-29T13:57:44.662Z'
                      container:
                        _links:
                          addAttachment:
                            href: "/api/v3/wiki_pages/72/attachments"
                            method: post
                          attachments:
                            href: "/api/v3/wiki_pages/72/attachments"
                          project:
                            href: "/api/v3/projects/12"
                            title: Demo project
                          self:
                            href: "/api/v3/wiki_pages/72"
                        _type: WikiPage
                        id: 72
                        title: wiki
                    _links:
                      author:
                        href: "/api/v3/users/1"
                        title: OpenProject Admin
                      container:
                        href: "/api/v3/wiki_pages/72"
                        title: wiki
                      delete:
                        href: "/api/v3/attachments/376"
                        method: delete
                      downloadLocation:
                        href: "/api/v3/attachments/376/content"
                      self:
                        href: "/api/v3/attachments/376"
                        title: 200.gif
                    _type: Attachment
                    contentType: image/gif
                    createdAt: '2018-06-01T07:24:19.896Z'
                    description:
                      format: plain
                      html: ''
                      raw: ''
                    digest:
                      algorithm: md5
                      hash: 7ac9c97ef73d47127f590788b84c0c1c
                    fileName: some.gif
                    fileSize: 3521772
                    id: 376
          description: OK
          headers: {}
        '400':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:InvalidRequestBody
                    message: The request could not be parsed as JSON.
          description: |-
            Returned if the client sends a not understandable request. Reasons include:

            * Omitting one of the required parts (metadata and file)

            * sending unparsable JSON in the metadata part
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not allowed to delete this attachment.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** edit wiki pages

            *Note that you will only receive this error, if you are at least allowed to see the wiki page*
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
          description: |-
            Returned if the wiki page does not exist or the client does not have sufficient permissions
            to see it.

            **Required permission:** view wiki pages

            *Note: A client without sufficient permissions shall not be able to test for the existence of a wiki page
            That's why a 404 is returned here, even if a 403 might be more appropriate.*
          headers: {}
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
        '422':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation
                    message: File is too large (maximum size is 5242880 Bytes).
          description: |-
            Returned if the client tries to send an invalid attachment.
            Reasons are:

            * Omitting the file name (`fileName` property of metadata part)

            * Sending a file that is too large
          headers: {}
      tags:
      - Attachments
      description: Adds an attachment with the wiki page as its container.
      operationId: Add_attachment_to_wiki_page
      summary: Add attachment to wiki page
  "/api/v3/work_packages":
    get:
      summary: List work packages
      operationId: list_work_packages
      tags:
      - Work Packages
      description: Returns a collection of work packages.
      parameters:
      - description: Page number inside the requested collection.
        example: '25'
        in: query
        name: offset
        required: false
        schema:
          default: 1
          type: integer
      - description: Number of elements to display per page.
        example: '25'
        in: query
        name: pageSize
        required: false
        schema:
          type: integer
      - description: |-
          JSON specifying filter conditions.
          Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/)
          endpoint. If no filter is to be applied, the client should send an empty array (`[]`), otherwise a default
          filter is applied. A Currently supported filters are (there are additional filters added by modules):

          - assigned_to
          - assignee_or_group
          - attachment_base
          - attachment_content
          - attachment_file_name
          - author
          - blocked
          - blocks
          - category
          - comment
          - created_at
          - custom_field
          - dates_interval
          - description
          - done_ratio
          - due_date
          - duplicated
          - duplicates
          - duration
          - estimated_hours
          - file_link_origin_id
          - follows
          - group
          - id
          - includes
          - linkable_to_storage_id
          - linkable_to_storage_url
          - manual_sort
          - milestone
          - only_subproject
          - parent
          - partof
          - precedes
          - principal_base
          - priority
          - project
          - relatable
          - relates
          - required
          - requires
          - responsible
          - role
          - search
          - start_date
          - status
          - storage_id
          - storage_url
          - subject
          - subject_or_id
          - subproject
          - type
          - typeahead
          - updated_at
          - version
          - watcher
          - work_package
        example: '[{ "type_id": { "operator": "=", "values": ["1", "2"] }}]'
        in: query
        name: filters
        required: false
        schema:
          default: '[{ "status_id": { "operator": "o", "values": null }}]'
          type: string
      - description: |-
          JSON specifying sort criteria.
          Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/) endpoint.
        example: '[["status", "asc"]]'
        in: query
        name: sortBy
        required: false
        schema:
          default: '[["id", "asc"]]'
          type: string
      - description: The column to group by.
        example: status
        in: query
        name: groupBy
        required: false
        schema:
          type: string
      - description: Indicates whether properties should be summed up if they support
          it.
        example: true
        in: query
        name: showSums
        required: false
        schema:
          default: false
          type: boolean
      - description: Comma separated list of properties to include.
        example: total,elements/subject,elements/id,self
        in: query
        name: select
        required: false
        schema:
          type: string
      - description: |-
          In order to perform a [baseline comparison](/docs/api/baseline-comparisons), you may provide one or several timestamps
          in ISO-8601 format as comma-separated list. The timestamps may be absolute or relative,
          such as ISO8601 dates, ISO8601 durations and the following relative date keywords: "oneDayAgo@HH:MM+HH:MM",
          "lastWorkingDay@HH:MM+HH:MM", "oneWeekAgo@HH:MM+HH:MM", "oneMonthAgo@HH:MM+HH:MM".
          The first "HH:MM" part represents the zero paded hours and minutes.
          The last "+HH:MM" part represents the timezone offset from UTC associated with the time,
          the offset can be positive or negative e.g."oneDayAgo@01:00+01:00", "oneDayAgo@01:00-01:00".

          Usually, the first timestamp is the baseline date, the last timestamp is the current date.
          Values older than 1 day are accepted only with valid Enterprise Token available.
        example: 2022-01-01T00:00:00Z,PT0S
        in: query
        name: timestamps
        required: false
        schema:
          default: PT0S
          type: string
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/Work_PackagesModel"
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not allowed to see work packages.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** view work packages (globally or in any project)
    post:
      summary: Create Work Package
      operationId: create_work_package
      tags:
      - Work Packages
      description: |-
        When calling this endpoint the client provides a single object, containing at least the properties and links that are required, in the body.
        The required fields of a WorkPackage can be found in its schema, which is embedded in the respective form.
        Note that it is only allowed to provide properties or links supporting the write operation.

        A project link must be set when creating work packages through this route.

        When setting start date, finish date, and duration together, their correctness will be checked and a 422 error will be returned if one value does not match with the two others. You can make the server compute a value: set only two values in the request and the third one will be computed and returned in the response. For instance, when sending `{ "startDate": "2022-08-23", duration: "P2D" }`, the response will include `{ "dueDate": "2022-08-24" }`.
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/WorkPackageModel"
      parameters:
      - description: |-
          Indicates whether change notifications (e.g. via E-Mail) should be sent.
          Note that this controls notifications for all users interested in changes to the work package (e.g. watchers, author and assignee),
          not just the current user.
        example: false
        in: query
        name: notify
        required: false
        schema:
          default: true
          type: boolean
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/WorkPackageModel"
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not allowed to add work packages to this project.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** add work packages

            *Note that you will only receive this error, if you are at least allowed to see the corresponding project.*
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The specified project does not exist.
          description: |-
            Returned if the project does not exist or the client does not have sufficient permissions
            to see it.

            **Required permissions:** view project

            *Note: A client without sufficient permissions shall not be able to test for the existence of a project.
            That's why a 404 is returned here, even if a 403 might be more appropriate.*
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
        '422':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation
                message: The subject might not be blank.
                _embedded:
                  details:
                    attribute: Subject
          description: |-
            Returned if:

            * the client tries to write a read-only property

            * a constraint for a property was violated

            * a property was provided in an unreadable format
  "/api/v3/work_packages/form":
    post:
      summary: Form for creating a Work Package
      operationId: form_create_work_package
      tags:
      - Work Packages
      description: |-
        When calling this endpoint, the client provides a single object containing the properties and links to be
        created, in the body. The input is validated and a schema response is returned. If the validation errors of the
        response is empty, the same payload can be used to create a work package.

        Only the properties of the work package write model are allowed to set on a work package on creation.

        When setting start date, finish date, and duration together, their correctness will be checked and a validation
        error will be returned if one value does not match with the two others. You can make the server compute a value:
        set only two values in the request and the third one will be computed and returned in the response. For instance,
        when sending `{ "startDate": "2022-08-23", duration: "P2D" }`, the response will
        include `{ "dueDate": "2022-08-24" }`.
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/WorkPackageWriteModel"
            examples:
              Valid creation:
                "$ref": "#/components/examples/WorkPackageCreateValid"
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/WorkPackageFormModel"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
  "/api/v3/work_packages/schemas":
    get:
      summary: List Work Package Schemas
      operationId: list_work_package_schemas
      tags:
      - Work Packages
      description: |-
        List all work package schemas that match the given filters. This endpoint does not return a successful response,
        if no filter is given.
      parameters:
      - name: filters
        description: |-
          JSON specifying filter conditions.
          Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/)
          endpoint. Currently supported filters are:

          + id: The schema's id

          Schema id has the form `project_id-work_package_type_id`.
        in: query
        required: true
        schema:
          type: string
        example: '[{ "id": { "operator": "=", "values": ["12-1", "14-2"] } }]'
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      elements:
                      - _links:
                          self:
                            href: "/api/v3/work_packages/schemas/13-1"
                        _type: Schema...
                      - _links:
                          self:
                            href: "/api/v3/work_packages/schemas/7-6"
                        _type: Schema...
                    _links:
                      self:
                        href: "/api/v3/work_packages/schemas"
                    _type: Collection
                    count: 2
                    total: 5
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not allowed to list schemas.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** View work packages in any project.
          headers: {}
  "/api/v3/work_packages/schemas/{identifier}":
    get:
      parameters:
      - description: Identifier of the schema
        example: 12-13
        in: path
        name: identifier
        required: true
        schema:
          type: string
      responses:
        '200':
          description: OK
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The specified schema does not exist.
          description: |-
            Returned if the schema does not exist or the client does not have sufficient permissions
            to see it.

            **Required permission:** view work packages (on the project where this schema is used)

            *Note: A client without sufficient permissions shall not be able to test for the existence of a project.
            That's why a 404 is returned here, even if a 403 might be more appropriate.*
          headers: {}
      tags:
      - Work Packages
      description: ''
      operationId: View_Work_Package_Schema
      summary: View Work Package Schema
  "/api/v3/work_packages/{id}":
    delete:
      summary: Delete Work Package
      operationId: delete_work_package
      tags:
      - Work Packages
      description: |-
        Deletes the work package, as well as:

        - all associated time entries
        - its hierarchy of child work packages
      parameters:
      - description: Work package id
        in: path
        name: id
        required: true
        schema:
          type: integer
        example: 1
      responses:
        '204':
          description: |-
            Returned if the work package was deleted successfully.

            Note that the response body is empty as of now. In future versions of the API a body
            *might* be returned along with an appropriate HTTP status.
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not allowed to delete this work package.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** delete work package
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The specified work package does not exist.
          description: |-
            Returned if the work package does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view work package
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
    get:
      summary: View Work Package
      operationId: view_work_package
      tags:
      - Work Packages
      description: Returns the specified work package.
      parameters:
      - description: Work package id
        in: path
        name: id
        required: true
        schema:
          type: integer
        example: 1
      - description: |-
          In order to perform a [baseline comparison](/docs/api/baseline-comparisons) of the work-package attributes, you may
          provide one or several timestamps in ISO-8601 format as comma-separated list. The timestamps may be absolute or relative,
          such as ISO8601 dates, ISO8601 durations and the following relative date keywords: "oneDayAgo@HH:MM+HH:MM",
          "lastWorkingDay@HH:MM+HH:MM", "oneWeekAgo@HH:MM+HH:MM", "oneMonthAgo@HH:MM+HH:MM".
          The first "HH:MM" part represents the zero paded hours and minutes.
          The last "+HH:MM" part represents the timezone offset from UTC associated with the time,
          the offset can be positive or negative e.g."oneDayAgo@01:00+01:00", "oneDayAgo@01:00-01:00".

          Usually, the first timestamp is the baseline date, the last timestamp is the current date.
          Values older than 1 day are accepted only with valid Enterprise Token available.
        in: query
        name: timestamps
        required: false
        schema:
          default: PT0S
          type: string
        example: 2022-01-01T00:00:00Z,PT0S
      responses:
        '200':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/WorkPackageModel"
          description: OK
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The specified work package does not exist.
          description: |-
            Returned if the work package does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view work package
    patch:
      summary: Update a Work Package
      operationId: update_work_package
      tags:
      - Work Packages
      description: |-
        When calling this endpoint the client provides a single object, containing the properties and links that it wants
        to change, in the body. Note that it is only allowed to provide properties or links supporting the **write**
        operation.

        Additionally to the fields the client wants to change, it is mandatory to provide the value of `lockVersion` which
        was received by the `GET` request this change originates from.

        The value of `lockVersion` is used to implement
        [optimistic locking](https://en.wikipedia.org/wiki/Optimistic_concurrency_control).
      parameters:
      - name: id
        description: Work package id
        in: path
        required: true
        schema:
          type: integer
        example: 42
      - name: notify
        description: |-
          Indicates whether change notifications should be sent. Note that this controls notifications for all users
          interested in changes to the work package (e.g. watchers, author and assignee), not just the current user.
        in: query
        required: false
        schema:
          type: boolean
          default: true
        example: false
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/WorkPackageModel"
      responses:
        '200':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/WorkPackagePatchModel"
          description: OK
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not allowed to edit the content of the work package.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** edit work package, assign version, change work package status, manage subtasks or move work package
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The specified work package does not exist.
          description: |-
            Returned if the work package does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view work package
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '409':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:UpdateConflict
                message: Your changes could not be saved, because the work package
                  was changed since you've seen it the last time.
          description: Returned if the resource was changed since the client requested
            it. This is determined using the `lockVersion` property.
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
        '422':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _embedded:
                  details:
                    attribute: Subject
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation
                message: The subject might not be blank.
          description: |-
            Returned if:

            - the client tries to modify a read-only property (`PropertyIsReadOnly`)
            - a constraint for a property was violated (`PropertyConstraintViolation`)
            - the client provides a link to an invalid resource (`ResourceTypeMismatch`)
  "/api/v3/work_packages/{id}/activities":
    get:
      parameters:
      - description: Work package id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      elements:
                      - _links:
                          self:
                            href: "/api/v3/activity/1"
                          user:
                            href: "/api/v3/users/1"
                          workPackage:
                            href: "/api/v3/work_packages/1"
                        _type: Activity
                        comment:
                          format: markdown
                          html: "<p>Lorem ipsum dolor sit amet.</p>"
                          raw: Lorem ipsum dolor sit amet.
                        createdAt: '2014-05-21T08:51:20.396Z'
                        updatedAt: '2014-05-21T09:14:02.726Z'
                        details: []
                        id: 1
                        version: 1
                      - _links:
                          self:
                            href: "/api/v3/activity/2"
                          user:
                            href: "/api/v3/users/1"
                          workPackage:
                            href: "/api/v3/work_packages/1"
                        _type: Activity
                        comment:
                          format: markdown
                          html: "<p>Lorem ipsum dolor sit amet.</p>"
                          raw: Lorem ipsum dolor sit amet.
                        createdAt: '2014-05-21T09:51:22.077Z'
                        updatedAt: '2014-05-21T10:14:02.957Z'
                        details: []
                        id: 2
                        version: 2
                    _links:
                      self:
                        href: "/api/v3/work_packages/1/revisions"
                    _type: Collection
                    count: 2
                    total: 2
              schema:
                "$ref": "#/components/schemas/Work_Package_activitiesModel"
          description: OK
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The specified work package does not exist.
          description: |-
            Returned if the work package does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view work package
          headers: {}
      tags:
      - Work Packages
      description: ''
      operationId: List_work_package_activities
      summary: List work package activities
    post:
      parameters:
      - description: Work package id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      - description: |-
          Indicates whether change notifications (e.g. via E-Mail) should be sent.
          Note that this controls notifications for all users interested in changes to the work package (e.g. watchers, author and assignee),
          not just the current user.
        example: false
        in: query
        name: notify
        required: false
        schema:
          default: true
          type: boolean
      responses:
        '201':
          description: Created
          headers: {}
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not allowed to create a comment here.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** create journals

            *Note that you will only receive this error, if you are at least allowed to see the corresponding work package.*
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The specified work package does not exist.
          description: |-
            Returned if the work package does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view work package
          headers: {}
      tags:
      - Work Packages
      description: |-
        Creates an activity for the selected work package and, on success, returns the
        updated activity.
      operationId: Comment_work_package
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/ActivityCommentWriteModel"
      summary: Comment work package
  "/api/v3/work_packages/{id}/activities_emoji_reactions":
    get:
      summary: List emoji reactions by work package activities
      operationId: list_work_package_activities_emoji_reactions
      tags:
      - WorkPackages
      - Activities
      - EmojiReactions
      description: List all emoji reactions of all activities of a single work package.
      parameters:
      - name: id
        description: ID of the work package whose activities' emoji reactions will
          be listed
        in: path
        required: true
        schema:
          type: integer
        example: '1'
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/EmojiReactions_Model"
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The requested resource could not be found.
          description: |-
            Returned if the work package does not exist or the client does not have sufficient permissions
            to see it.

            **Required permission:**
            - `view_work_packages`
            - for internal comments: `view_internal_comments`

            *Note: A client without sufficient permissions shall not be able to test for the existence of a work package.
            That's why a 404 is returned here, even if a 403 might be more appropriate.*
  "/api/v3/work_packages/{id}/attachments":
    get:
      parameters:
      - description: ID of the work package whose attachments will be listed
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/Attachments_Model"
          description: OK
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The specified work package does not exist.
          description: |-
            Returned if the work package does not exist or the client does not have sufficient permissions
            to see it.

            **Required permission:** view work package

            *Note: A client without sufficient permissions shall not be able to test for the existence of a work package.
            That's why a 404 is returned here, even if a 403 might be more appropriate.*
      tags:
      - Attachments
      description: ''
      operationId: list_work_package_attachments
      summary: List attachments by work package
    post:
      parameters:
      - description: ID of the work package to receive the attachment
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/AttachmentModel"
          description: OK
        '400':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:InvalidRequestBody
                message: The request could not be parsed as JSON.
          description: |-
            Returned if the client sends a not understandable request. Reasons include:

            * Omitting one of the required parts (metadata and file)

            * sending unparsable JSON in the metadata part
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not allowed to delete this attachment.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** edit work package or add work package

            *Note that you will only receive this error, if you are at least allowed to see the work package.*
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The specified work package does not exist.
          description: |-
            Returned if the work package does not exist or the client does not have sufficient permissions
            to see it.

            **Required permission:** view work package

            *Note: A client without sufficient permissions shall not be able to test for the existence of a work package.
            That's why a 404 is returned here, even if a 403 might be more appropriate.*
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
        '422':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation
                message: File is too large (maximum size is 5242880 Bytes).
          description: |-
            Returned if the client tries to send an invalid attachment.
            Reasons are:

            * Omitting the file name (`fileName` property of metadata part)

            * Sending a file that is too large
      tags:
      - Attachments
      description: |-
        To add an attachment to a work package, a client needs to issue a request of type `multipart/form-data`
        with exactly two parts.

        The first part *must* be called `metadata`. Its content type is expected to be `application/json`,
        the body *must* be a single JSON object, containing at least the `fileName` and optionally the attachments `description`.

        The second part *must* be called `file`, its content type *should* match the mime type of the file.
        The body *must* be the raw content of the file.
        Note that a `filename` must be indicated in the `Content-Disposition` of this part, however it will be ignored.
        Instead the `fileName` inside the JSON of the metadata part will be used.
      operationId: create_work_package_attachment
      summary: Create work package attachment
  "/api/v3/work_packages/{id}/available_assignees":
    get:
      parameters:
      - description: Work package id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      elements:
                      - _links:
                          delete:
                            href: "/api/v3/users/1"
                            method: DELETE
                            title: Delete j.sheppard
                          lock:
                            href: "/api/v3/users/1/lock"
                            method: POST
                            title: Set lock on j.sheppard
                          self:
                            href: "/api/v3/users/1"
                            title: John Sheppard - j.sheppard
                        _type: User
                        avatar: https://example.org/users/1/avatar
                        createdAt: '2014-05-21T08:51:20.396Z'
                        email: shep@mail.com
                        firstName: John
                        id: 1
                        lastName: Sheppard
                        login: j.sheppard
                        status: active
                        updatedAt: '2014-05-21T08:51:20.396Z'
                      - _links:
                          delete:
                            href: "/api/v3/users/2"
                            method: DELETE
                            title: Delete j.sheppard2
                          lock:
                            href: "/api/v3/users/2/lock"
                            method: POST
                            title: Set lock on j.sheppard2
                          self:
                            href: "/api/v3/users/2"
                            title: Jim Sheppard - j.sheppard2
                        _type: User
                        avatar: https://example.org/users/1/avatar
                        createdAt: '2014-05-21T08:51:20.396Z'
                        email: shep@mail.net
                        firstName: Jim
                        id: 2
                        lastName: Sheppard
                        login: j.sheppard2
                        status: active
                        updatedAt: '2014-05-21T08:51:20.396Z'
                    _links:
                      self:
                        href: "/api/v3/work_packages/42/available_assignees"
                    _type: Collection
                    count: 2
                    total: 2
              schema:
                "$ref": "#/components/schemas/Available_AssigneesModel"
          description: OK
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not allowed to see the assignable users for this
                      work package.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** edit work packages

            *Note that you will only receive this error, if you are at least allowed to see the corresponding work package.*
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The work package you are looking for cannot be found
                      or has been deleted.
          description: |-
            Returned if the work package does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view work packages
          headers: {}
      tags:
      - Work Packages
      description: Gets a list of users that can be assigned to the given work package.
      operationId: Work_Package_Available_assignees
      summary: Work Package Available assignees
  "/api/v3/work_packages/{id}/available_projects":
    get:
      parameters:
      - description: work package id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      elements:
                      - _links:
                          categories:
                            href: "/api/v3/projects/6/categories"
                          createWorkPackage:
                            href: "/api/v3/projects/6/work_packages/form"
                            method: post
                          createWorkPackageImmediate:
                            href: "/api/v3/projects/6/work_packages"
                            method: post
                          editWorkPackage:
                            href: "/api/v3//work_packages/{id}/form"
                            method: post
                            templated: true
                          self:
                            href: "/api/v3/projects/6"
                            title: A project
                          versions:
                            href: "/api/v3/projects/6/versions"
                        _type: Project
                        createdAt: '2015-07-06T13:28:14+00:00'
                        description: Eveniet molestias omnis quis aut qui eum adipisci.
                          Atque aut aut in exercitationem adipisci amet. Nisi asperiores
                          quia ratione veritatis enim exercitationem magnam. Aut fuga
                          architecto adipisci nihil. Et repellat pariatur. Aliquam
                          et sed perferendis nostrum quaerat. Fugit doloremque voluptatem.
                        id: 6
                        identifier: a_project
                        name: A project
                        type: Customer Project
                        updatedAt: '2015-10-01T09:55:02+00:00'
                      - _links:
                          categories:
                            href: "/api/v3/projects/14/categories"
                          createWorkPackage:
                            href: "/api/v3/projects/14/work_packages/form"
                            method: post
                          createWorkPackageImmediate:
                            href: "/api/v3/projects/14/work_packages"
                            method: post
                          self:
                            href: "/api/v3/projects/14"
                            title: Another project
                          versions:
                            href: "/api/v3/projects/14/versions"
                        _type: Project
                        createdAt: '2016-02-29T12:50:20+00:00'
                        description: ''
                        id: 14
                        identifier: another_project
                        name: Another project
                        type:
                        updatedAt: '2016-02-29T12:50:20+00:00'
                    _links:
                      self:
                        href: "/api/v3/work_packages/5/available_projects"
                    _type: Collection
                    count: 2
                    total: 2
              schema:
                "$ref": "#/components/schemas/Available_projects_for_work_packageModel"
          description: OK
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** edit work package

            *Note that you will only receive this error, if you are at least allowed to see the corresponding work package.*
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The specified work package does not exist.
          description: |-
            Returned if the work package does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view work package
          headers: {}
      tags:
      - Work Packages
      description: Gets a list of projects that are available as projects to which
        the work package can be moved.
      operationId: Available_projects_for_work_package
      summary: Available projects for work package
  "/api/v3/work_packages/{id}/available_relation_candidates":
    get:
      summary: Available relation candidates
      operationId: list_available_relation_candidates
      tags:
      - Work Packages
      description: ''
      parameters:
      - description: Project id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      - description: Maximum number of candidates to list (default 10)
        example: '25'
        in: query
        name: pageSize
        required: false
        schema:
          type: integer
      - description: |-
          JSON specifying filter conditions.
          Accepts the same filters as the [work packages](https://www.openproject.org/docs/api/endpoints/work-packages/) endpoint.
        example: '[{ "status_id": { "operator": "o", "values": null } }]'
        in: query
        name: filters
        required: false
        schema:
          type: string
      - description: Shortcut for filtering by ID or subject
        example: '"rollout"'
        in: query
        name: query
        required: false
        schema:
          type: string
      - description: Type of relation to find candidates for (default "relates")
        example: '"follows"'
        in: query
        name: type
        required: false
        schema:
          type: string
      - description: |-
          JSON specifying sort criteria.
          Accepts the same sort criteria as the [work packages](https://www.openproject.org/docs/api/endpoints/work-packages/) endpoint.
        example: '[["status", "asc"]]'
        in: query
        name: sortBy
        required: false
        schema:
          default: '[["id", "asc"]]'
          type: string
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      elements:
                      - _links:
                          self:
                            href: "/api/v3/work_packages/1"
                        _type: WorkPackage
                        id: 1
                        subject: Skipped other properties for brevity
                      - _links:
                          self:
                            href: "/api/v3/work_packages/2"
                        _type: WorkPackage
                        id: 2
                        subject: Skipped other properties for brevity
                    _links:
                      self:
                        href: "/api/v3/projects/14/work_packages"
                    _type: Collection
                    count: 2
                    total: 2
              schema:
                "$ref": "#/components/schemas/Available_relation_candidatesModel"
          description: OK
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The specified work package does not exist.
          description: |-
            Returned if the work package does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view work package
  "/api/v3/work_packages/{id}/available_watchers":
    get:
      parameters:
      - description: work package id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      elements:
                      - _links:
                          delete:
                            href: "/api/v3/users/1"
                            method: DELETE
                            title: Delete j.sheppard
                          lock:
                            href: "/api/v3/users/1/lock"
                            method: POST
                            title: Set lock on j.sheppard
                          self:
                            href: "/api/v3/users/1"
                            title: John Sheppard - j.sheppard
                        _type: User
                        avatar: https://example.org/users/1/avatar
                        createdAt: '2014-05-21T08:51:20.396Z'
                        email: shep@mail.com
                        firstName: John
                        id: 1
                        lastName: Sheppard
                        login: j.sheppard
                        status: active
                        updatedAt: '2014-05-21T08:51:20.396Z'
                      - _links:
                          delete:
                            href: "/api/v3/users/2"
                            method: DELETE
                            title: Delete j.sheppard2
                          lock:
                            href: "/api/v3/users/2/lock"
                            method: POST
                            title: Set lock on j.sheppard2
                          self:
                            href: "/api/v3/users/2"
                            title: Jim Sheppard - j.sheppard2
                        _type: User
                        avatar: https://example.org/users/1/avatar
                        createdAt: '2014-05-21T08:51:20.396Z'
                        email: shep@mail.net
                        firstName: Jim
                        id: 2
                        lastName: Sheppard
                        login: j.sheppard2
                        status: active
                        updatedAt: '2014-05-21T08:51:20.396Z'
                    _links:
                      self:
                        href: "/api/v3/work_packages/1/available_watchers"
                    _type: Collection
                    count: 2
                    total: 2
              schema:
                "$ref": "#/components/schemas/Available_WatchersModel"
          description: OK
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** add work package watchers

            *Note that you will only receive this error, if you are at least allowed to see the corresponding work package.*
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The specified work package does not exist.
          description: |-
            Returned if the work package does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view work package
          headers: {}
      tags:
      - Work Packages
      description: Gets a list of users that are able to be watchers of the specified
        work package.
      operationId: Available_watchers
      summary: Available watchers
  "/api/v3/work_packages/{id}/file_links":
    post:
      summary: Creates file links.
      operationId: create_work_package_file_link
      tags:
      - Work Packages
      - File links
      description: |-
        Creates file links on a work package.

        The request is interpreted as a bulk insert, where every element of the collection is validated separately. Each
        element contains the origin meta data and a link to the storage, the file link is about to point to. The storage
        link can be provided as a resource link with id or as the host url.

        The file's id and name are considered mandatory information. The rest of the origin meta data SHOULD be provided
        by the client. The _mimeType_ SHOULD be a standard mime type. An empty mime type will be handled as unknown. To link
        a folder, the custom mime type `application/x-op-directory` MUST be used.

        Up to 20 file links can be submitted at once.

        If any element data is invalid, no file links will be created.

        If a file link with matching origin id, work package, and storage already exists, then it will not create an
        additional file link or update the meta data. Instead the information from the existing file link will be returned.
      parameters:
      - name: id
        description: Work package id
        in: path
        required: true
        schema:
          type: integer
        example: 1337
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/FileLinkCollectionWriteModel"
            example:
              _type: Collection
              _embedded:
                elements:
                - originData:
                    id: 5503
                    name: logo.png
                    mimeType: image/png
                    size: 433765
                    createdAt: '2021-12-19T09:42:10.170Z'
                    lastModifiedAt: '2021-12-20T14:00:13.987Z'
                    createdByName: Luke Skywalker
                    lastModifiedByName: Anakin Skywalker
                  _links:
                    storageUrl:
                      href: https://nextcloud.deathstar.rocks/
      responses:
        '201':
          description: Created
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/FileLinkCollectionReadModel"
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** manage file links

            *Note that you will only receive this error, if you are at least allowed to see the corresponding work package.*
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The requested resource could not be found.
          description: |-
            Returned if the work package does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view work package, view file links
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
        '422':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation
                message: The request was invalid. File Link logo.png - Storage was
                  invalid.
          description: |-
            Occurs if the request body was correctly formatted, but some properties lead to errors in the validation
            process. This happens e.g. if the provided storage url is not available on the server.
    get:
      summary: Gets all file links of a work package
      operationId: list_work_package_file_links
      tags:
      - Work Packages
      - File links
      description: "Gets all file links of a work package.\n\nAs a side effect, for
        every file link a request is sent to the storage's origin to fetch live data
        and patch\nthe file link's data before returning, as well as retrieving permissions
        of the user on this origin file. "
      parameters:
      - name: id
        description: Work package id
        in: path
        required: true
        schema:
          type: integer
        example: 1337
      - name: filters
        in: query
        description: |-
          JSON specifying filter conditions.
          Accepts the same format as returned by the [queries](https://www.openproject.org/docs/api/endpoints/queries/)
          endpoint. The following filters are supported:

          - storage
        required: false
        example: '[{"storage":{"operator":"=","values":["42"]}}]'
        schema:
          type: string
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/FileLinkCollectionReadModel"
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not authorized to access this resource.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** view file links

            *Note that you will only receive this error, if you are at least allowed to see the corresponding work package.*
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The requested resource could not be found.
          description: |-
            Returned if the work package does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view work package
  "/api/v3/work_packages/{id}/form":
    post:
      summary: Form for editing a Work Package
      operationId: form_edit_work_package
      tags:
      - Work Packages
      description: |-
        When calling this endpoint, the client provides a single object containing the properties and links to be
        edited, in the body. The input is validated and a schema response is returned. If the validation errors of the
        response is empty, the same payload can be used to edit the work package.

        Only the properties of the work package write model are allowed to set on a work package on editing.

        When setting start date, finish date, and duration together, their correctness will be checked and a validation
        error will be returned if one value does not match with the two others. You can make the server compute a value:
        set only two values in the request and the third one will be computed and returned in the response. For instance,
        when sending `{ "startDate": "2022-08-23", duration: "P2D" }`, the response will
        include `{ "dueDate": "2022-08-24" }`.
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/WorkPackageWriteModel"
            examples:
              Changing subject:
                "$ref": "#/components/examples/WorkPackageEditSubject"
      parameters:
      - name: id
        description: ID of the work package being modified
        in: path
        required: true
        schema:
          type: integer
        example: '1'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/WorkPackageFormModel"
        '404':
          description: "Returned if the work package does not exist or the client
            does not have sufficient permissions to see it.\t\n\n**Required permission:**
            view work package"
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The specified work package does not exist.
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
  "/api/v3/work_packages/{id}/revisions":
    get:
      parameters:
      - description: Work package id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              examples:
                response:
                  value:
                    _embedded:
                      elements:
                      - _links:
                          author:
                            href: "/api/v3/users/1"
                            title: John Sheppard - j.sheppard
                          project:
                            href: "/api/v3/projects/1"
                            title: A Test Project
                          self:
                            href: "/api/v3/revisions/13"
                          showRevision:
                            href: "/projects/identifier/repository/revision/11f4b07"
                        _type: Revision
                        authorName: John Sheppard
                        createdAt: '2015-07-21T13:36:59.220Z'
                        formattedIdentifier: 11f4b07
                        id: 13
                        identifier: 11f4b07dff4f4ce9548a52b7d002daca7cd63ec6
                        message:
                          format: plain
                          html: "<p>This revision provides new features<br/><br/>An
                            elaborate description</p>"
                          raw: |-
                            This revision provides new features

                            An elaborate description
                      - _links:
                          author:
                            href: "/api/v3/users/2"
                            title: Jim Sheppard - j.sheppard
                          project:
                            href: "/api/v3/projects/1"
                            title: A Test Project
                          self:
                            href: "/api/v3/revisions/14"
                          showRevision:
                            href: "/projects/identifier/repository/revision/029ed72a"
                        _type: Revision
                        authorName: j1msheppard
                        createdAt: '2015-06-30T08:47:00.818Z'
                        formattedIdentifier: '029ed72a'
                        id: 13
                        identifier: '029ed72a3b7b7c4ab332b1f6eaa6576e7c946059'
                        message:
                          format: plain
                          html: "<p>This revision fixes some stuff<br/><br/>More information
                            here</p>"
                          raw: |-
                            This revision fixes some stuff

                            More information here
                    _links:
                      self:
                        href: "/api/v3/work_packages/42/revisions"
                    _type: Collection
                    count: 2
                    total: 2
              schema:
                "$ref": "#/components/schemas/RevisionsModel"
          description: OK
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not allowed to see linked revisions for this
                      work package.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** view work packages for the project the work package is contained in.

            *Note that you will only receive this error, if you are at least allowed to see the corresponding work package.*
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The specified work project does not exist.
          description: |-
            Returned if the work package does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view work package
          headers: {}
      tags:
      - Work Packages
      description: |-
        Gets a list of revisions that are linked to this work package, e.g., because it is referenced in the commit message of the revision.
        Only linked revisions from repositories are shown if the user has the view changesets permission in the defining project.
      operationId: Revisions
      summary: Revisions
  "/api/v3/work_packages/{id}/relations":
    post:
      summary: Create relation
      operationId: create_relation
      tags:
      - Relations
      description: |-
        Create a work package relation on the given work package. A successful creation will result in a relation between
        two work packages, thus appearing on both involved work package resources.
      parameters:
      - name: id
        description: Work package id
        example: '1'
        in: path
        required: true
        schema:
          type: integer
      requestBody:
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/RelationWriteModel"
            examples:
              request:
                "$ref": "#/components/examples/RelationCreateRequest"
      responses:
        '201':
          description: Created
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/RelationReadModel"
              examples:
                Simple response:
                  "$ref": "#/components/examples/RelationResponse"
        '400':
          "$ref": "#/components/responses/InvalidRequestBody"
        '403':
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** manage work package relations
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not allowed to create a relation.
        '409':
          description: |-
            Returned if there already exists a relation between the given work packages of **any** type
            or if the relation is not allowed.
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:UpdateConflict
                    message: Couldn't update the resource because of conflicting modifications.
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
        '422':
          description: |-
            Returned if:

            - the client tries to write a read-only property (`PropertyIsReadOnly`)
            - a constraint for a property was violated (`PropertyConstraintViolation`)
            - the client provides a link to an invalid resource (`ResourceTypeMismatch`)
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _embedded:
                      details:
                        attribute: lag
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation
                    message: Lag must be a number greater than or equal to 0
  "/api/v3/work_packages/{work_package_id}/reminders":
    get:
      summary: List work package reminders
      operationId: list_work_package_reminders
      tags:
      - Work Packages
      - Reminders
      description: |-
        Gets a list of your upcoming reminders for this work package.

        Only active reminders that belong to the current user are returned.
      parameters:
      - name: work_package_id
        in: path
        description: Work package id
        example: '1'
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: OK
          content:
            application/hal+json:
              schema:
                type: object
                required:
                - _type
                - total
                - count
                - _embedded
                properties:
                  _type:
                    type: string
                    enum:
                    - Collection
                  total:
                    type: integer
                    description: The total amount of elements available in the collection.
                    minimum: 0
                  count:
                    type: integer
                    description: Actual amount of elements in this response.
                    minimum: 0
                  _embedded:
                    type: object
                    required:
                    - elements
                    properties:
                      elements:
                        type: array
                        items:
                          "$ref": "#/components/schemas/ReminderModel"
        '403':
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** view work packages for the project the work package is contained in.
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
        '404':
          description: |-
            Returned if the work package does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view work package
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
    post:
      summary: Create a work package reminder
      operationId: create_work_package_reminder
      tags:
      - Work Packages
      - Reminders
      description: |-
        Creates a new reminder for the specified work package.

        **Note:** A user can only have one **active** reminder at a time for a given work package.
      parameters:
      - name: work_package_id
        in: path
        description: Work package id
        example: '1'
        required: true
        schema:
          type: integer
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - remindAt
              properties:
                remindAt:
                  type: string
                  format: date-time
                  description: The date and time when the reminder is due
                note:
                  type: string
                  description: The note of the reminder
      responses:
        '201':
          description: Reminder created successfully
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ReminderModel"
        '404':
          description: |-
            Returned if the work package does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view work package
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
        '409':
          description: |-
            Returned if the user already has an active reminder for this work package.

            **Error message**: You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
  "/api/v3/work_packages/{id}/watchers":
    get:
      parameters:
      - description: Work package id
        example: 1
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          content:
            application/hal+json:
              example:
                _embedded:
                  elements:
                  - _links:
                      delete:
                        href: "/api/v3/users/1"
                        method: DELETE
                        title: Delete j.sheppard
                      lock:
                        href: "/api/v3/users/1/lock"
                        method: POST
                        title: Set lock on j.sheppard
                      self:
                        href: "/api/v3/users/1"
                        title: John Sheppard - j.sheppard
                      showUser:
                        href: "/users/1"
                        type: text/html
                    _type: User
                    avatar: https://example.org/users/1/avatar
                    createdAt: '2014-05-21T08:51:20.396Z'
                    firstName: John
                    id: 1
                    lastName: Sheppard
                    login: j.sheppard
                    mail: shep@mail.com
                    status: active
                    updatedAt: '2014-05-21T08:51:20.396Z'
                  - _links:
                      delete:
                        href: "/api/v3/users/2"
                        method: DELETE
                        title: Delete j.sheppard2
                      lock:
                        href: "/api/v3/users/2/lock"
                        method: POST
                        title: Set lock on j.sheppard2
                      self:
                        href: "/api/v3/users/2"
                        title: Jim Sheppard - j.sheppard2
                    _type: User
                    avatar: https://example.org/users/1/avatar
                    createdAt: '2014-05-21T08:51:20.396Z'
                    firstName: Jim
                    id: 2
                    lastName: Sheppard
                    login: j.sheppard2
                    mail: shep@mail.net
                    status: active
                    updatedAt: '2014-05-21T08:51:20.396Z'
                _links:
                  self:
                    href: "/api/v3/work_packages/14/watchers"
                _type: Collection
                count: 2
                total: 2
              schema:
                "$ref": "#/components/schemas/WatchersModel"
          description: OK
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not allowed to see the watchers of this work package.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** view work package watchers

            *Note that you will only receive this error, if you are at least allowed to see the corresponding work package.*
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The specified work package does not exist.
          description: |-
            Returned if the work package does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view work package

            *Note that you will effectively not be able to see the watchers of a work package without being able to see the work package.*
          headers: {}
      tags:
      - Work Packages
      description: ''
      operationId: List_watchers
      summary: List watchers
    post:
      parameters:
      - description: Work package id
        example: 1
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: OK
          headers: {}
        '201':
          description: Created
          headers: {}
        '400':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:InvalidRequestBody
                message: The request body was not a single JSON object.
          description: |-
            Occurs when the client did not send a valid JSON object in the request body.

            For example:

            * The request did not contain a single JSON object

            * The JSON object did not contain the key `user`

            * The value of `users` was not a link object
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                message: You are not allowed to add watchers to this work package.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permissions:**

            * view work package (for self)

            * add work package watchers (for other users)

            *Note that you will only receive this error, if you are at least allowed to see the corresponding work package.*
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              example:
                _type: Error
                errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                message: The specified work package does not exist.
          description: |-
            Returned if the work package does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view work package

            *Note that you will effectively not be able to change the watchers of a work package without being able to see the work package.*
          headers: {}
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
        '422':
          description: |-
            Returned if:

            * the client tries to specify a link to a resource that is not a user (`ResourceTypeMismatch`)

            * the user specified is not allowed to watch that work package (`PropertyConstraintViolation`)

            * the user specified does not exist (`PropertyConstraintViolation`)
          headers: {}
      tags:
      - Work Packages
      description: |-
        Adds a watcher to the specified work package.

        The request is expected to contain a single JSON object, that contains a link object under the `user` key.

        The response will be user added as watcher.
        In case the user was already watching the work package an `HTTP 200` is returned, an
        `HTTP 201` if the user was added as a new watcher.
      operationId: Add_watcher
      requestBody:
        content:
          application/json:
            schema:
              example:
                user:
                  href: "/api/v3/users/1"
              properties:
                user:
                  properties:
                    href:
                      type: string
                  type: object
              type: object
      summary: Add watcher
  "/api/v3/work_packages/{id}/watchers/{user_id}":
    delete:
      parameters:
      - description: Work package id
        example: '1'
        in: path
        name: id
        required: true
        schema:
          type: integer
      - description: User id
        example: '1'
        in: path
        name: user_id
        required: true
        schema:
          type: integer
      responses:
        '204':
          description: No Content
          headers: {}
        '403':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
                    message: You are not allowed to remove watchers from this work
                      package.
          description: |-
            Returned if the client does not have sufficient permissions.

            **Required permission:** delete work package watchers

            *Note that you will only receive this error, if you are at least allowed to see the corresponding work package.*
          headers: {}
        '404':
          content:
            application/hal+json:
              schema:
                "$ref": "#/components/schemas/ErrorResponse"
              examples:
                response:
                  value:
                    _type: Error
                    errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
                    message: The specified work package does not exist.
          description: |-
            Returned in one of the following cases:

            Either the work package does not exist or the client does not have sufficient permissions to see it.

            **Required permission:** view work package

            Or the specified user does not exist at all.

            *Note that you will effectively not be able to change the watchers of a work package without being able to see the work package.*
          headers: {}
        '406':
          "$ref": "#/components/responses/MissingContentType"
        '415':
          "$ref": "#/components/responses/UnsupportedMediaType"
      tags:
      - Work Packages
      description: |-
        Removes the specified user from the list of watchers for the given work package.

        If the request succeeds, the specified user is not watching the work package anymore.

        *Note: This might also be the case, if the specified user did not watch the work package prior to the request.*
      operationId: Remove_watcher
      summary: Remove watcher
components:
  examples:
    ActivityResponse:
      description: A simple response example for an activity comment.
      value:
        _type: Activity::Comment
        id: 1478
        comment:
          format: markdown
          raw: I can give you a CR70 corvette, you have to make do, Leia...
          html: <p class="op-uc-p">I can give you a CR70 corvette, you have to make
            do, Leia...</p>
        details: []
        version: 4
        internal: false
        createdAt: '2025-04-17T13:54:40.737Z'
        updatedAt: '2025-04-17T13:54:40.737Z'
        _embedded:
          attachments:
            _type: Collection
            total: 1
            count: 1
            _hint: Attachments resource shortened for brevity.
          workPackage:
            id: 207
            _type: WorkPackage
            _hint: Work package resource shortened for brevity.
          emojiReactions:
            _type: Collection
            total: 1
            count: 1
            _hint: Emoji reactions resource shortened for brevity.
        _links:
          attachments:
            href: "/api/v3/activities/1478/attachments"
          addAttachment:
            href: "/api/v3/activities/1478/attachments"
            method: post
          self:
            href: "/api/v3/activities/1478"
          workPackage:
            href: "/api/v3/work_packages/207"
            title: Recover Death Star blueprints
          user:
            href: "/api/v3/users/33"
          update:
            href: "/api/v3/activities/1478"
            method: patch
    DateAlertNotification:
      value:
        _type: Notification
        id: 1
        readIAN: false
        reason: dateAlert
        createdAt: '2022-04-05T14:38:28.361Z'
        updatedAt: '2022-04-06T09:03:24.347Z'
        _embedded:
          project:
            _hint: Project resource shortened for brevity
            _type: Project
            id: 11
            name: Jedi Remnant Locator
          resource:
            _hint: WorkPackage resource shortened for brevity
            _type: WorkPackage
            id: 77
            subject: Educate Visas Marr
          details:
          - _type: Values::Property
            property: startDate
            value: '2021-01-01'
            _links:
              self:
                href: api/v3/notifications/123/details/0
              schema:
                href: api/v3/values/schemas/startDate
        _links:
          self:
            href: "/api/v3/notifications/1"
          readIAN:
            href: "/api/v3/notifications/1/read_ian"
            method: post
          actor:
            href:
          project:
            href: "/api/v3/projects/11"
            title: Jedi Remnant Locator
          activity:
            href:
          resource:
            href: "/api/v3/work_packages/77"
            title: Educate Visas Marr
    GridSimpleCollectionResponse:
      value:
        _type: Collection
        total: 1
        count: 1
        pageSize: 30
        offset: 1
        _embedded:
          elements:
          - _type: Grid
            id: 2
            rowCount: 8
            columnCount: 5
            widgets:
            - _type: GridWidget
              identifier: time_entries_current_user
              startRow: 1
              endRow: 8
              startColumn: 1
              endColumn: 3
            - _type: GridWidget
              identifier: news
              startRow: 3
              endRow: 8
              startColumn: 4
              endColumn: 5
            - _type: GridWidget
              identifier: documents
              startRow: 1
              endRow: 3
              startColumn: 3
              endColumn: 6
            createdAt: '2018-12-03T16:58:30.297Z'
            updatedAt: '2018-12-13T19:36:40.352Z'
            _links:
              scope:
                href: "/my/page"
                type: text/html
              updateImmediately:
                href: "/api/v3/grids/2"
                method: patch
              update:
                href: "/api/v3/grids/2/form"
                method: post
              self:
                href: "/api/v3/grids/2"
    GridSimplePatchModel:
      value:
        rowCount: 1
        columnCount: 2
        widgets:
        - _type: GridWidget
          identifier: tasks
          startRow: 1
          endRow: 2
          startColumn: 1
          endColumn: 2
          options:
            name: Tasks
        - _type: GridWidget
          identifier: news
          startRow: 1
          endRow: 2
          startColumn: 2
          endColumn: 3
          options:
            name: News
        _links:
          scope:
            href: "/my/page"
            type: text/html
    GridSimpleResponse:
      value:
        _type: Grid
        id: 2
        rowCount: 8
        columnCount: 5
        widgets:
        - _type: GridWidget
          identifier: tasks
          startRow: 1
          endRow: 8
          startColumn: 1
          endColumn: 3
        - _type: GridWidget
          identifier: news
          startRow: 3
          endRow: 8
          startColumn: 4
          endColumn: 5
        - _type: GridWidget
          identifier: documents
          startRow: 1
          endRow: 3
          startColumn: 3
          endColumn: 6
        createdAt: '2018-12-03T16:58:30.915Z'
        updatedAt: '2018-12-13T19:36:40.588Z'
        _links:
          self:
            href: "/api/v3/grids/2"
          attachments:
            href: "/api/v3/grids/2/attachments"
          addAttachment:
            href: "/api/v3/grids/2/attachments"
            method: post
          scope:
            href: "/my/page"
            type: text/html
          updateImmediately:
            href: "/api/v3/grids/2"
            method: patch
          update:
            href: "/api/v3/grids/2/form"
            method: post
          delete:
            href: "/api/v3/grids/2"
            method: delete
    GroupResponse:
      value:
        _type: Group
        id: 26
        name: Force Users
        createdAt: '2024-01-11T15:54:16.542Z'
        updatedAt: '2024-01-11T15:58:02.237Z'
        _embedded:
          members:
          - _hint: Principal resource shortened for brevity
            _type: User
            id: 23
            name: Grogu Jarin
          - _hint: Principal resource shortened for brevity
            _type: User
            id: 14
            name: Mara Jade
          - _hint: Principal resource shortened for brevity
            _type: User
            id: 3
            name: Darth Vader
        _links:
          self:
            href: "/api/v3/groups/26"
            title: Force Users
          memberships:
            href: "/api/v3/memberships?filters=%5B%7B%22principal%22%3A%7B%22operator%22%3A%22%3D%22%2C%22values%22%3A%5B%2226%22%5D%7D%7D%5D"
            title: Memberships
          delete:
            href: "/api/v3/groups/26"
            method: delete
          updateImmediately:
            href: "/api/v3/groups/26"
            method: patch
          members:
          - href: "/api/v3/users/23"
            title: Grogu Jarin
          - href: "/api/v3/users/14"
            title: Mara Jade
          - href: "/api/v3/users/3"
            title: Darth Vader
    HierarchyItemCollectionFilteredResponse:
      description: Filtered response of a hierarchy structure starting at a specific
        parent and restricting the depth.
      value:
        _type: Collection
        total: 3
        count: 3
        _embedded:
          elements:
          - _type: HierarchyItem
            id: 1338
            label: Stormtroopers
            short: ST
            depth: 1
            _links:
              self:
                href: "/api/v3/custom_field_items/1338"
                name: Stormtroopers
              parent:
                href: "/api/v3/custom_field_items/1337"
                name:
              children:
              - href: "/api/v3/custom_field_items/1340"
                name: ST-377
              - href: "/api/v3/custom_field_items/1341"
                name: ST-422
          - _type: HierarchyItem
            id: 1340
            label: ST-377
            short:
            depth: 2
            _links:
              self:
                href: "/api/v3/custom_field_items/1340"
                name: ST-377
              parent:
                href: "/api/v3/custom_field_items/1338"
                name: Stormtroopers
              children:
              - href: "/api/v3/custom_field_items/1480"
                name: ST-377-200
              - href: "/api/v3/custom_field_items/1481"
                name: ST-377-201
          - _type: HierarchyItem
            id: 1341
            label: ST-422
            short:
            depth: 2
            _links:
              self:
                href: "/api/v3/custom_field_items/1341"
                name: ST-422
              parent:
                href: "/api/v3/custom_field_items/1338"
                name: Stormtroopers
              children:
              - href: "/api/v3/custom_field_items/1580"
                name: ST-422-137
              - href: "/api/v3/custom_field_items/1581"
                name: ST-422-138
        _links:
          self:
            href: "/api/v3/custom_field/42/items?parent=1338&depth=1"
    HierarchyItemCollectionResponse:
      description: Simple response of a hierarchy structure starting at root.
      value:
        _type: Collection
        total: 37
        count: 37
        _embedded:
          elements:
          - _type: HierarchyItem
            id: 1337
            label:
            short:
            depth: 0
            _links:
              self:
                href: "/api/v3/custom_field_items/1337"
                name:
              parent:
                href:
              children:
              - href: "/api/v3/custom_field_items/1338"
                name: Stormtroopers
              - href: "/api/v3/custom_field_items/1339"
                name: Dark Troopers
          - _type: HierarchyItem
            id: 1338
            label: Stormtroopers
            short: ST
            depth: 1
            _links:
              self:
                href: "/api/v3/custom_field_items/1338"
                name: Stormtroopers
              parent:
                href: "/api/v3/custom_field_items/1337"
                name:
              children:
              - href: "/api/v3/custom_field_items/1340"
                name: ST-377
              - href: "/api/v3/custom_field_items/1341"
                name: ST-422
          - _type: HierarchyItem
            _hint: hierarchy item shortened for brevity
            id: 1340
            label: ST-377
            short:
            depth: 2
          - _hint: hierarchy item shortened for brevity
        _links:
          self:
            href: "/api/v3/custom_field/42/items"
    HierarchyItemResponse:
      description: Simple response of a single item of a custom field of type hierarchy.
      value:
        _type: HierarchyItem
        id: 1338
        label: Stormtroopers
        short: ST
        depth: 1
        _links:
          self:
            href: "/api/v3/custom_field_items/1338"
            name: Stormtroopers
          parent:
            href: "/api/v3/custom_field_items/1337"
            name:
          children:
          - href: "/api/v3/custom_field_items/1340"
            name: ST-377
          - href: "/api/v3/custom_field_items/1341"
            name: ST-422
    MembershipCreateRequestCustomMessage:
      description: Create a membership and send a custom notification message.
      value:
        _links:
          principal:
            href: "/api/v3/users/14"
          project:
            href: "/api/v3/projects/21"
          roles:
          - href: "/api/v3/roles/4"
        _meta:
          notificationMessage:
            format: markdown
            raw: Granted permission to execute Order *66*.
    MembershipCreateRequestGlobalRole:
      description: Create a membership for a global role. To address global roles,
        no project must be set.
      value:
        _links:
          principal:
            href: "/api/v3/users/14"
          roles:
          - href: "/api/v3/roles/4"
    MembershipCreateRequestNoNotification:
      description: Create a membership without sending a notification message.
      value:
        _links:
          principal:
            href: "/api/v3/users/14"
          project:
            href: "/api/v3/projects/21"
          roles:
          - href: "/api/v3/roles/4"
        _meta:
          sendNotification: false
    MembershipFormResponse:
      description: A simple form response example.
      value:
        _type: Form
        _embedded:
          payload:
            _meta:
              notificationMessage:
                format: markdown
                raw: "*Hallo*"
                html: <p class="op-uc-p"><em>Hallo</em></p>
            _links:
              project:
                href: "/api/v3/projects/21"
                title: Death Star v3
              principal:
                href: "/api/v3/users/14"
                title: Mara Jade
              roles: []
          schema:
            _type: Schema
            _hint: Schema resource shortened for brevity
          validationErrors:
            roles:
              _type: Error
              errorIdentifier: urn:openproject-org:api:v3:errors:PropertyConstraintViolation
              message: Roles need to be assigned.
              _embedded:
                details:
                  attribute: roles
        _links:
          self:
            href: "/api/v3/memberships/form"
            method: post
          validate:
            href: "/api/v3/memberships/form"
            method: post
    MembershipSchemaResponse:
      description: A simple schema response example.
      value:
        _type: Schema
        _dependencies: []
        id:
          type: Integer
          name: ID
          required: true
          hasDefault: false
          writable: false
          options: {}
        createdAt:
          type: DateTime
          name: Created on
          required: true
          hasDefault: false
          writable: false
          options: {}
        updatedAt:
          type: DateTime
          name: Updated on
          required: true
          hasDefault: false
          writable: false
          options: {}
        notificationMessage:
          type: Formattable
          name: Message
          required: false
          hasDefault: false
          writable: true
          options: {}
          location: _meta
        project:
          type: Project
          name: Project
          required: false
          hasDefault: false
          writable: true
          location: _links
          _links:
            allowedValues:
              href: "/api/v3/memberships/available_projects?filters=%5B%7B%22principal%22%3A%7B%22operator%22%3A%22%21%22%2C%22values%22%3A%5B%2214%22%5D%7D%7D%5D"
        principal:
          type: Principal
          name: Principal
          required: true
          hasDefault: false
          writable: true
          location: _links
          _links:
            allowedValues:
              href: "/api/v3/principals?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22%21%22%2C%22values%22%3A%5B%223%22%5D%7D%7D%2C%7B%22member%22%3A%7B%22operator%22%3A%22%21%22%2C%22values%22%3A%5B%2221%22%5D%7D%7D%5D"
        roles:
          type: "[]Role"
          name: Role
          required: true
          hasDefault: false
          writable: true
          location: _links
          _links:
            allowedValues:
              href: "/api/v3/roles"
        _links:
          self:
            href: "/api/v3/memberships/schema"
    MembershipSimpleCollectionResponse:
      description: A simple membership collection response example.
      value:
        _type: Collection
        total: 2
        count: 2
        pageSize: 20
        offset: 1
        _embedded:
          elements:
          - _type: Membership
            id: 11
            createdAt: '2015-03-20T12:56:56.643Z'
            updatedAt: '2018-12-20T18:16:11.643Z'
            _links:
              self:
                href: "/api/v3/memberships/11"
                title: Darth Vader
              schema:
                href: "/api/v3/memberships/schema"
              update:
                href: "/api/v3/memberships/11/form"
                method: post
              updateImmediately:
                href: "/api/v3/memberships/11"
                method: patch
              project:
                href: "/api/v3/projects/3"
                title: Death Start v3
              principal:
                href: "/api/v3/users/5"
                title: Darth Vader
              roles:
              - href: "/api/v3/roles/4"
                title: Sith Lord
          - _type: Membership
            id: 12
            _hint: Membership resource shortened for brevity
        _links:
          self:
            href: "/api/v3/memberships"
          jumpTo:
            href: "/api/v3/memberships?filters=%5B%5D&offset=%7Boffset%7D&pageSize=20"
            templated: true
          changeSize:
            href: "/api/v3/memberships?filters=%5B%5D&offset=1&pageSize=%7Bsize%7D"
            templated: true
          nextByOffset:
            href: "/api/v3/memberships?filters=%5B%5D&offset=2&pageSize=20"
    MembershipSimpleResponse:
      description: A simple membership response example.
      value:
        _type: Membership
        id: 11
        createdAt: '2015-03-20T12:56:56.626Z'
        updatedAt: '2018-12-20T18:16:11.563Z'
        _embedded:
          project:
            _type: Project
            id: 3
            _hint: Project resource shortened for brevity
          principal:
            _type: User
            id: 5
            _hint: User resource shortened for brevity
          roles:
          - _type: Role
            id: 4
            _hint: Roles resource shortened for brevity
        _links:
          self:
            href: "/api/v3/memberships/11"
            title: Darth Vader
          schema:
            href: "/api/v3/memberships/schema"
          update:
            href: "/api/v3/memberships/11/form"
            method: post
          updateImmediately:
            href: "/api/v3/memberships/11"
            method: patch
          project:
            href: "/api/v3/projects/3"
            title: Death Start v3
          principal:
            href: "/api/v3/users/5"
            title: Darth Vader
          roles:
          - href: "/api/v3/roles/4"
            title: Sith Lord
    MembershipUpdateAdditionalRoles:
      description: Updates a membership and add multiple roles.
      value:
        _links:
          roles:
          - href: "/api/v3/roles/5"
          - href: "/api/v3/roles/6"
    MentionedNotification:
      value:
        _type: Notification
        id: 1
        readIAN: false
        reason: mentioned
        createdAt: '2022-04-05T14:38:28.881Z'
        updatedAt: '2022-04-06T09:03:24.591Z'
        _embedded:
          author:
            _hint: User resource shortened for brevity
            _type: User
            id: 13
            name: Darth Nihilus
          project:
            _hint: Project resource shortened for brevity
            _type: Project
            id: 11
            name: Jedi Remnant Locator
          activity:
            _hint: Activity resource shortened for brevity
            _type: Activity::Comment
            id: 180
            version: 3
          resource:
            _hint: WorkPackage resource shortened for brevity
            _type: WorkPackage
            id: 77
            subject: Educate Visas Marr
          details: []
        _links:
          self:
            href: "/api/v3/notifications/1"
          readIAN:
            href: "/api/v3/notifications/1/read_ian"
            method: post
          actor:
            href: "/api/v3/users/13"
            title: Darth Nihilus
          project:
            href: "/api/v3/projects/11"
            title: Jedi Remnant Locator
          activity:
            href: "/api/v3/activities/180"
          resource:
            href: "/api/v3/work_packages/77"
            title: Educate Visas Marr
    NotificationCollection:
      value:
        _type: Collection
        count: 2
        total: 2
        offset: 1
        pageSize: 20
        _embedded:
          elements:
          - _hint: Notification resource shortened for brevity
            id: 1
            readIAN: false
            reason: mentioned
          - _hint: Notification resource shortened for brevity
            id: 2
            readIAN: false
            reason: dateAlert
            _embedded:
              details:
              - _type: Values::Property
                property: startDate
                value: '2021-01-01'
                _links:
                  self:
                    href: api/v3/notifications/123/details/0
                  schema:
                    href: api/v3/values/schemas/startDate
          detailsSchemas:
          - _type: Schema
            property:
              name: Property
              type: String
            value:
              name: Start date
              type: Date
            _links:
              self:
                href: "/api/v3/values/schemas/startDate"
        _links:
          self:
            href: "/api/v3/notifications?offset=1&pageSize=20"
          jumpTo:
            href: "/api/v3/notifications?filters=%5B%5D&offset=%7Boffset%7D&pageSize=20"
            templated: true
          changeSize:
            href: "/api/v3/notifications?filters=%5B%5D&offset=1&pageSize=%7Bsize%7D"
            templated: true
    PlaceholderUserResponse:
      value:
        _type: PlaceholderUser
        id: 27
        name: Akolyth
        createdAt: '2024-02-12T11:52:24.708Z'
        updatedAt: '2024-02-12T11:52:24.708Z'
        _links:
          self:
            href: "/api/v3/placeholder_users/27"
            title: Akolyth
          memberships:
            href: "/api/v3/memberships?filters=%5B%7B%22principal%22%3A%7B%22operator%22%3A%22%3D%22%2C%22values%22%3A%5B%2227%22%5D%7D%7D%5D"
            title: Memberships
          updateImmediately:
            href: "/api/v3/placeholder_users/27"
            title: Update Akolyth
            method: patch
          delete:
            href: "/api/v3/placeholder_users/27"
            title: Delete Akolyth
            method: delete
          showUser:
            href: "/placeholder_users/27"
            type: text/html
    PriorityCollection:
      value:
        _embedded:
          elements:
          - _links:
              self:
                href: "/api/v3/priorities/1"
                title: Low
            _type: Priority
            id: 1
            isActive: true
            isDefault: false
            name: Low
            position: 1
          - _links:
              self:
                href: "/api/v3/priorities/2"
                title: Normal
            _type: Priority
            id: 2
            isActive: true
            isDefault: true
            name: Normal
            position: 2
          - _links:
              self:
                href: "/api/v3/priorities/3"
                title: High
            _type: Priority
            id: 3
            isActive: true
            isDefault: false
            name: High
            position: 3
          - _links:
              self:
                href: "/api/v3/priorities/4"
                title: Immediate
            _type: Priority
            id: 4
            isActive: true
            isDefault: false
            name: Immediate
            position: 5
        _links:
          self:
            href: "/api/v3/priorities"
        _type: Collection
        count: 4
        total: 4
    Project:
      value:
        _type: Project
        _links:
          self:
            href: "/api/v3/projects/1"
            title: Lorem
          createWorkPackage:
            href: "/api/v3/projects/1/work_packages/form"
            method: post
          createWorkPackageImmediate:
            href: "/api/v3/projects/1/work_packages"
            method: post
          categories:
            href: "/api/v3/projects/1/categories"
          types:
            href: "/api/v3/projects/1/types"
          versions:
            href: "/api/v3/projects/1/versions"
          workPackages:
            href: "/api/v3/projects/1/work_packages"
          memberships:
            href: /api/v3/memberships?filters=[{"project":{"operator":"=","values":["1"]}}]
          customField456:
            href: "/api/v3/users/315"
            title: A user
          parent:
            href: "/api/v3/projects/123"
            title: Parent project
          ancestors:
          - href: "/api/v3/projects/2"
            title: Root project
          - href: "/api/v3/projects/12"
            title: Grandparent project
          - href: "/api/v3/projects/123"
            title: Parent project
          status:
            href: "/api/v3/project_statuses/on_track"
            title: On track
        id: 1
        identifier: project_example
        name: Project example
        active: true
        public: false
        statusExplanation:
          format: markdown
          raw: Everything **fine**
          html: "<p>Everything <strong>fine</strong></p>"
        description:
          format: markdown
          raw: Lorem **ipsum** dolor sit amet
          html: "<p>Lorem <strong>ipsum</strong> dolor sit amet</p>"
        createdAt: '2014-05-21T08:51:20.396Z'
        updatedAt: '2014-05-21T08:51:20.396Z'
        customField123: 123
    ProjectBody:
      value:
        name: Project example
        statusExplanation:
          raw: Everything **fine**
        description:
          raw: Lorem **ipsum** dolor sit amet
        customField123: 123
        _links:
          parent:
            href: "/api/v3/projects/123"
          customField456:
            href: "/api/v3/users/315"
    ProjectCollection:
      value:
        _type: Collection
        count: 2
        total: 2
        pageSize: 20
        offset: 1
        _embedded:
          elements:
          - _hint: Project resource shortened for brevity
            id: 1
            identifier: initialproject
            name: DeathStar construction
            active: true
            public: true
          - _hint: Project resource shortened for brevity
            id: 2
            identifier: mysecret
            name: Palpatine's secret plan
            active: true
            public: false
        _links:
          self:
            href: "/api/v3/projects?filters=%5B%5D&offset=1&pageSize=20"
          jumpTo:
            href: "/api/v3/projects?filters=%5B%5D&offset=%7Boffset%7D&pageSize=20"
            templated: true
          changeSize:
            href: "/api/v3/projects?filters=%5B%5D&offset=1&pageSize=%7Bsize%7D"
            templated: true
          representations:
          - href: "/projects.csv?filters=%5B%5D&offset=1&pageSize=20"
            identifier: csv
            type: text/csv
            title: CSV
          - href: "/projects.xls?filters=%5B%5D&offset=1&pageSize=20"
            identifier: xls
            type: application/vnd.ms-excel
            title: XLS
    RelationCollectionResponse:
      description: Simple response of a relation collection.
      value:
        _type: Collection
        total: 40
        count: 20
        pageSize: 20
        offset: 1
        _embedded:
        - _type: Relation
          id: 650
          name: duplicated by
          type: duplicated
          reverseType: duplicates
          lag:
          description: Those are the same... stupid Stormtroopers!
          _links:
            self:
              href: "/api/v3/relations/650"
            updateImmediately:
              href: "/api/v3/relations/650"
              method: patch
            delete:
              href: "/api/v3/relations/650"
              method: delete,
              title: Remove relation
            from:
              href: "/api/v3/work_packages/108"
              title: Destroy Rebel Base
            to:
              href: "/api/v3/work_packages/78"
              title: Annihilate Yavin 4
        - _type: Relation
          id: 652
          name: relates to
          type: relates
          reverseType: relates
          _hint: Relation resource shortened for brevity.
        - _hint: Further relation resources shortened for brevity.
        _links:
          self:
            href: "/api/v3/relations?filters=%5B%5D&offset=1&pageSize=20"
          jumpTo:
            href: "/api/v3/relations?filters=%5B%5D&offset=%7Boffset%7D&pageSize=20"
            templated: true
          changeSize:
            href: "/api/v3/relations?filters=%5B%5D&offset=1&pageSize=%7Bsize%7D"
            templated: true
          nextByOffset:
            href: "/api/v3/relations?filters=%5B%5D&offset=2&pageSize=20"
    RelationCreateRequest:
      description: Example request to create a relation between two work packages.
      value:
        type: follows
        lag: 2
        description: Build hangar AFTER improving external skeleton of Death Star.
        _links:
          to:
            href: "/api/v3/work_packages/1337"
    RelationResponse:
      description: Simple response of a 'duplicated by' relation between two work
        packages.
      value:
        _type: Relation
        id: 650
        name: duplicated by
        type: duplicated
        reverseType: duplicates
        lag:
        description: Those are the same... stupid Stormtroopers!
        _embedded:
          from:
            id: 108
            _type: WorkPackage
            _hint: Work package resource shortened for brevity.
          to:
            id: 78
            _type: WorkPackage
            _hint: Work package resource shortened for brevity.
        _links:
          self:
            href: "/api/v3/relations/650"
          updateImmediately:
            href: "/api/v3/relations/650"
            method: patch
          delete:
            href: "/api/v3/relations/650"
            method: delete,
            title: Remove relation
          from:
            href: "/api/v3/work_packages/108"
            title: Destroy Rebel Base
          to:
            href: "/api/v3/work_packages/78"
            title: Annihilate Yavin 4
    RelationUpdateRequest:
      description: Example request to update the relation's description.
      value:
        description: This is the new description.
    StatusCollection:
      description: A standard, unpaginated collection of statuses.
      value:
        _type: Collection
        count: 6
        total: 6
        _embedded:
          elements:
          - _type: Status
            id: 1
            name: New
            isClosed: false
            color: "#3997AD"
            isDefault: true
            isReadonly: false
            excludedFromTotals: false
            defaultDoneRatio: 0
            position: 1
            _links:
              self:
                href: "/api/v3/statuses/1"
          - _type: Status
            id: 3
            name: Resolved
            isClosed: false
            color: "#93D2AE"
            isDefault: false
            isReadonly: false
            excludedFromTotals: false
            defaultDoneRatio: 75
            position: 3
            _links:
              self:
                href: "/api/v3/statuses/3"
          - _type: Status
            id: 4
            name: Feedback
            isClosed: false
            color: "#A96FFE"
            isDefault: false
            isReadonly: false
            excludedFromTotals: false
            defaultDoneRatio: 25
            position: 4
            _links:
              self:
                href: "/api/v3/statuses/4"
          - _type: Status
            id: 5
            name: Closed
            isClosed: true
            color: "#DF6DA1"
            isDefault: false
            isReadonly: false
            excludedFromTotals: false
            defaultDoneRatio: 100
            position: 5
            _links:
              self:
                href: "/api/v3/statuses/5"
          - _type: Status
            id: 6
            name: Rejected
            isClosed: true
            color: "#D32937"
            isDefault: false
            isReadonly: true
            excludedFromTotals: true
            defaultDoneRatio: 100
            position: 6
            _links:
              self:
                href: "/api/v3/statuses/6"
          - _type: Status
            id: 2
            name: In Progress
            isClosed: false
            color: "#3852C6"
            isDefault: false
            isReadonly: false
            excludedFromTotals: false
            defaultDoneRatio: 50
            position: 3
            _links:
              self:
                href: "/api/v3/statuses/2"
        _links:
          self:
            href: "/api/v3/statuses"
    StatusResponse:
      description: A standard status resource response.
      value:
        _type: Status
        id: 13
        name: Waiting for Darth-approval
        isClosed: false
        color: "#FE005D"
        isDefault: false
        isReadonly: false
        excludedFromTotals: false
        defaultDoneRatio: 66
        position: 4
        _links:
          self:
            href: "/api/v3/statuses/13"
            title: Waiting for Darth-approval
    StorageNextcloudResponse:
      value:
        _type: Storage
        id: 1337
        name: It's no moon
        hasApplicationPassword: true
        createdAt: '2021-12-20T13:37:00.211Z'
        updatedAt: '2021-12-20T13:37:00.211Z'
        configured: true
        _embedded:
          oauthApplication:
            id: 42
            _type: OAuthApplication
            name: It's no moon (Nextcloud)
            clientId: O5h6WObhMg1Z8IcLHRE3_LMh4jJYmmca2V6OTFSv8DA
            confidential: true
            createdAt: '2022-12-07T12:56:42.626Z'
            updatedAt: '2022-12-07T12:56:42.626Z'
            scopes:
            - api_v3
            _links:
              self:
                href: "/api/v3/oauth_applications/42"
              owner:
                href: "/api/v3/users/13"
                title: Darth Vader
              integration:
                href: "/api/v3/storages/1337"
                title: It's no moon
              redirectUri:
              - href: https://nextcloud.deathstar.rocks/index.php/apps/integration_openproject/oauth-redirect
          oauthClientCredentials:
            _type: OAuthClientCredentials
            id: 42
            clientId: fGEFWxIpROrpci25TW6qWCZozDFEAKSkonMBkrf3LYvBXRljBbLajBf2vD2fjePm
            confidential: true
            createdAt: '2023-12-08T09:49:24.397Z'
            updatedAt: '2023-12-08T09:49:24.397Z'
            _links:
              self:
                href: "/api/v3/oauth_client_credentials/42"
              integration:
                href: "/api/v3/storages/1337"
                title: It's no moon
        _links:
          self:
            href: "/api/v3/storages/1337"
            title: It's no moon
          type:
            href: urn:openproject-org:api:v3:storages:Nextcloud
            title: Nextcloud
          origin:
            href: https://nextcloud.deathstar.rocks/
          prepareUpload:
          - href: "/api/v3/storages/1337/files/prepare_upload"
            method: post
            title: Upload file
            payload:
              projectId: 21
              fileName: "{fileName}"
              parent: "{parent}"
            templated: true
          - href: "/api/v3/storages/95/files/prepare_upload"
            method: post
            title: Upload file
            payload:
              projectId: 11
              fileName: "{fileName}"
              parent: "{parent}"
            templated: true
          open:
            href: "/api/v3/storages/1337/open"
          authorizationState:
            href: urn:openproject-org:api:v3:storages:authorization:Connected
            title: Connected
          projectStorages:
            href: /api/v3/project_storages?filters=[{"storageId":{"operator":"=","values":["1337"]}}]
          oauthApplication:
            href: "/api/v3/oauth_application/42"
            title: It's no moon (Nextcloud)
          oauthClientCredentials:
            href: "/api/v3/oauth_client_credentials/42"
    StorageCreateFolderRequestBody:
      description: A valid request body to create a new folder on a external storage
      value:
        name: Uploads
        parentId: '200'
    StorageNextcloudResponseForCreation:
      value:
        _type: Storage
        id: 1337
        name: My New DeathStar
        hasApplicationPassword: false
        createdAt: '2024-05-21T09:11:53.880Z'
        updatedAt: '2024-05-21T09:11:53.880Z'
        configured: false
        _embedded:
          oauthApplication:
            id: 42
            _type: OAuthApplication
            name: My New DeathStar (Nextcloud)
            clientId: gNQ-gi3VX59ruoft5B9aRmukEYbZOhKIsxXE9iT1tcQ
            confidential: true
            clientSecret: 79hIlb1Ezj5kPx8LgE6LI9L1-mb8g7jX1-u_a08RJlI
            createdAt: '2024-05-21T09:11:53.908Z'
            updatedAt: '2024-05-21T09:11:53.908Z'
            scopes:
            - api_v3
            _links:
              self:
                href: "/api/v3/oauth_applications/42"
              owner:
                href: "/api/v3/users/13"
                title: Darth Vader
              integration:
                href: "/api/v3/storages/1337"
                title: My New DeathStar
              redirectUri:
              - href: https://nextcloud.deathstar.rocks/index.php/apps/integration_openproject/oauth-redirect
        _links:
          self:
            href: "/api/v3/storages/1337"
            title: My New DeathStar
          type:
            href: urn:openproject-org:api:v3:storages:Nextcloud
            title: Nextcloud
          origin:
            href: https://nextcloud.deathstar.rocks/
          open:
            href: "/api/v3/storages/1337/open"
          prepareUpload: []
          authorizationState:
            href: urn:openproject-org:api:v3:storages:authorization:FailedAuthorization
            title: Authorization failed
          projectStorages:
            href: /api/v3/project_storages?filters=[{"storageId":{"operator":"=","values":["1337"]}}]
          oauthApplication:
            href: "/api/v3/oauth_application/42"
            title: My New DeathStar (Nextcloud)
          oauthClientCredentials:
            href:
    StorageNextcloudUnauthorizedResponse:
      value:
        _type: Storage
        id: 1337
        name: It's no moon
        hasApplicationPassword: false
        createdAt: '2021-12-20T13:37:00.211Z'
        updatedAt: '2021-12-20T13:37:00.211Z'
        configured: true
        _embedded:
          oauthApplication:
            id: 42
            _type: OAuthApplication
            name: It's no moon (Nextcloud)
            clientId: O5h6WObhMg1Z8IcLHRE3_LMh4jJYmmca2V6OTFSv8DA
            confidential: true
            createdAt: '2022-12-07T12:56:42.626Z'
            updatedAt: '2022-12-07T12:56:42.626Z'
            scopes:
            - api_v3
            _links:
              self:
                href: "/api/v3/oauth_applications/42"
              owner:
                href: "/api/v3/users/13"
                title: Darth Vader
              integration:
                href: "/api/v3/storages/1337"
                title: It's no moon
              redirectUri:
              - href: https://nextcloud.deathstar.rocks/index.php/apps/integration_openproject/oauth-redirect
          oauthClientCredentials:
            _type: OAuthClientCredentials
            id: 42
            clientId: fGEFWxIpROrpci25TW6qWCZozDFEAKSkonMBkrf3LYvBXRljBbLajBf2vD2fjePm
            confidential: true
            createdAt: '2023-12-08T09:49:24.397Z'
            updatedAt: '2023-12-08T09:49:24.397Z'
            _links:
              self:
                href: "/api/v3/oauth_client_credentials/42"
              integration:
                href: "/api/v3/storages/1337"
                title: It's no moon
        _links:
          self:
            href: "/api/v3/storages/1337"
            title: It's no moon
          type:
            href: urn:openproject-org:api:v3:storages:Nextcloud
            title: Nextcloud
          origin:
            href: https://nextcloud.deathstar.rocks/
          prepareUpload: []
          open:
            href: "/api/v3/storages/1337/open"
          authorizationState:
            href: urn:openproject-org:api:v3:storages:authorization:FailedAuthorization
            title: Authorization failed
          authorize:
            href: https://nextcloud25.local/index.php/apps/oauth2/authorize?client_id=fnrIeJZqqAKGQlejuDaGhSQfCAVtoayHLACWCYcPJ0w17Pp6daPPUktkM9QaGxca&redirect_uri=https://openproject.local/oauth_clients/fnrIeJZqqAKGQlejuDaGhSQfCAVtoayHLACWCYcPJ0w17Pp6daPPUktkM9QaGxca/callback&response_type=code
            title: Authorize
          projectStorages:
            href: /api/v3/project_storages?filters=[{"storageId":{"operator":"=","values":["1337"]}}]
          oauthApplication:
            href: "/api/v3/oauth_application/42"
            title: It's no moon (Nextcloud)
          oauthClientCredentials:
            href: "/api/v3/oauth_client_credentials/42"
    StorageOneDriveIncompleteResponse:
      value:
        _type: Storage
        id: 1337
        name: It's no moon
        tenantId: e36f1dbc-fdae-427e-b61b-0d96ddfb81a4
        driveId:
        createdAt: '2021-12-20T13:37:00.211Z'
        updatedAt: '2021-12-20T13:37:00.211Z'
        configured: false
        _links:
          self:
            href: "/api/v3/storages/1337"
            title: It's no moon
          type:
            href: urn:openproject-org:api:v3:storages:OneDrive
            title: OneDrive/SharePoint
          prepareUpload: []
          open:
            href: "/api/v3/storages/1337/open"
          authorizationState:
            href: urn:openproject-org:api:v3:storages:authorization:FailedAuthorization
            title: Authorization failed
          projectStorages:
            href: /api/v3/project_storages?filters=[{"storageId":{"operator":"=","values":["1337"]}}]
          oauthClientCredentials:
            href: "/api/v3/oauth_client_credentials/42"
    StorageOneDriveResponse:
      value:
        _type: Storage
        id: 1337
        name: It's no moon
        tenantId: e36f1dbc-fdae-427e-b61b-0d96ddfb81a4
        driveId: b!FeOZEMfQx0eGQKqVBLcP__BG8mq-4-9FuRqOyk3MXY8Qconfm2i6SKEoCmuGYqQK
        createdAt: '2021-12-20T13:37:00.211Z'
        updatedAt: '2021-12-20T13:37:00.211Z'
        configured: true
        _embedded:
          oauthClientCredentials:
            _type: OAuthClientCredentials
            id: 42
            clientId: b8a5bb54-5fb2-4e0e-9427-9d24dbac32ff
            confidential: true
            createdAt: '2023-12-08T09:49:24.397Z'
            updatedAt: '2023-12-08T09:49:24.397Z'
            _links:
              self:
                href: "/api/v3/oauth_client_credentials/42"
              integration:
                href: "/api/v3/storages/1337"
                title: It's no moon
        _links:
          self:
            href: "/api/v3/storages/1337"
            title: It's no moon
          type:
            href: urn:openproject-org:api:v3:storages:OneDrive
            title: OneDrive/SharePoint
          prepareUpload:
          - href: "/api/v3/storages/1337/files/prepare_upload"
            method: post
            title: Upload file
            payload:
              projectId: 33
              fileName: "{fileName}"
              parent: "{parent}"
            templated: true
          open:
            href: "/api/v3/storages/1337/open"
          authorizationState:
            href: urn:openproject-org:api:v3:storages:authorization:Connected
            title: Connected
          projectStorages:
            href: /api/v3/project_storages?filters=[{"storageId":{"operator":"=","values":["1337"]}}]
          oauthClientCredentials:
            href: "/api/v3/oauth_client_credentials/42"
    StoragesSimpleCollectionModel:
      value:
        _type: Collection
        count: 2
        total: 2
        offset: 1
        pageSize: 20
        _embedded:
          elements:
          - id: 1337
            _type: Storage
            name: It's no moon
            hasApplicationPassword: true
            configured: true
            createdAt: '2021-12-20T13:37:00.211Z'
            updatedAt: '2021-12-20T13:37:00.211Z'
            _links:
              self:
                href: "/api/v3/storages/1337"
                title: It's no moon
              type:
                href: urn:openproject-org:api:v3:storages:nextcloud
                title: Nextcloud
              origin:
                href: https://nextcloud.deathstar.rocks/
              open:
                href: https://nextcloud.deathstar.rocks/apps/files
              authorizationState:
                href: urn:openproject-org:api:v3:storages:authorization:FailedAuthorization
                title: Failed Authorization
              authorize:
                href: https://nextcloud.deathstar.rocks/authorize/
                title: Authorize
              projectStorages:
                href: /api/v3/project_storages?filters=[{"storageId":{"operator":"=","values":["1337"]}}]
              oauthApplication:
                href: "/api/v3/oauth_application/42"
                title: It's no moon (Nextcloud)
              oauthClientCredentials:
                href: "/api/v3/oauth_client_credentials/42"
          - id: 1338
            _type: Storage
            name: EmpireSharepoint
            tenantId: e36f1dbc-fdae-427e-b61b-0d96ddfb81a4
            driveId: b!FeOZEMfQx0eGQKqVBLcP__BG8mq-4-9FuRqOyk3MXY8Qconfm2i6SKEoCmuGYqQK
            createdAt: '2021-12-20T13:37:00.211Z'
            updatedAt: '2021-12-20T13:37:00.211Z'
            configured: true
            _links:
              self:
                href: "/api/v3/storages/1338"
                title: EmpireSharepoint
              type:
                href: urn:openproject-org:api:v3:storages:one-drive
                title: OneDrive
              open:
                href: https://empire.sharepoint.com/sites/Documents
              authorizationState:
                href: urn:openproject-org:api:v3:storages:authorization:Connected
                title: Connected
              projectStorages:
                href: /api/v3/project_storages?filters=[{"storageId":{"operator":"=","values":["1338"]}}]
              oauthClientCredentials:
                href: "/api/v3/oauth_client_credentials/44"
    QueriesModel:
      value:
        _links:
          self:
            href: "/api/v3/queries"
        total: 1
        count: 1
        _type: Collection
        _embedded:
          elements:
          - _type: Query
            id: 9
            name: fdsfdsfdsf
            createdAt: '2015-03-20T12:56:56.413Z'
            updatedAt: '2015-05-20T18:16:53.392Z'
            filters:
            - _type: StatusQueryFilter
              name: Status
              _links:
                filter:
                  href: "/api/v3/queries/filters/status"
                  title: Status
                operator:
                  href: "/api/v3/queries/operators/o"
                  title: open
                schema:
                  href: "/api/v3/queries/filter_instance_schemas/status"
                values: []
            - _type: DueDateQueryFilter
              name: Finish date
              values:
              - '1'
              _links:
                filter:
                  href: "/api/v3/queries/filters/dueDate"
                  title: Finish date
                operator:
                  href: "/api/v3/queries/operators/<t+"
                  title: in less than
                schema:
                  href: "/api/v3/queries/filter_instance_schemas/dueDate"
            public: false
            sums: false
            starred: true
            projections:
            - _type: QueryProjection::Table
            - _type: QueryProjection::TeamPlanner
              _links:
                rows:
                - href: "/api/v3/users/1"
                  title: Bob Bobbit
            - _type: QueryProjection::Calendar
            _embedded:
              results:
                _type: WorkPackageCollection
                total: 234
                count: 30
                pageSize: 30
                offset: 1
                _embedded:
                  elements:
                  - "<--- shortened for brevity --->"
                _links:
                  self:
                    href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
                  jumpTo:
                    href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=%7Boffset%7D&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
                    templated: true
                  changeSize:
                    href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=%7Bsize%7D&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
                    templated: true
                  createWorkPackage:
                    href: "/api/v3/work_packages/form"
                    method: post
                  createWorkPackageImmediate:
                    href: "/api/v3/work_packages"
                    method: post
            _links:
              self:
                href: "/api/v3/queries/9"
                title: fdsfdsfdsf
              results:
                href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
              columns:
              - href: "/api/v3/queries/columns/id"
                title: ID
              - href: "/api/v3/queries/columns/subject"
                title: Subject
              - href: "/api/v3/queries/columns/type"
                title: Type
              - href: "/api/v3/queries/columns/status"
                title: Status
              - href: "/api/v3/queries/columns/priority"
                title: Priority
              - href: "/api/v3/queries/columns/assignee"
                title: Assignee
              - href: "/api/v3/queries/columns/updated_at"
                title: Updated on
              groupBy:
                href:
                title:
              sortBy:
              - href: "/api/v3/queries/sort_bys/parent-desc"
                title: Parent (Descending)
              user:
                href: "/api/v3/users/1"
                title: OpenProject Admin
              project:
                href: "/api/v3/projects/3"
                title: copy
    QueryModel:
      value:
        _type: Query
        id: 9
        name: abcdefg
        createdAt: '2015-03-20T12:56:56.235Z'
        updatedAt: '2015-05-20T18:16:53.976Z'
        filters:
        - _type: StatusQueryFilter
          name: Status
          _links:
            filter:
              href: "/api/v3/queries/filters/status"
              title: Status
            operator:
              href: "/api/v3/queries/operators/o"
              title: open
            schema:
              href: "/api/v3/queries/filter_instance_schemas/status"
            values: []
        - _type: DueDateQueryFilter
          name: Finish date
          values:
          - '1'
          _links:
            filter:
              href: "/api/v3/queries/filters/dueDate"
              title: Finish date
            operator:
              href: "/api/v3/queries/operators/<t+"
              title: in less than
            schema:
              href: "/api/v3/queries/filter_instance_schemas/dueDate"
        public: false
        sums: false
        starred: false
        hidden: false
        timestamps:
        - PT0S
        projections:
        - _type: QueryProjection::Table
          showHierarchies: true
          _links:
            columns:
            - href: "/api/v3/queries/columns/id"
              title: ID
            - href: "/api/v3/queries/columns/subject"
              title: Subject
            - href: "/api/v3/queries/columns/type"
              title: Type
            - href: "/api/v3/queries/columns/status"
              title: Status
            - href: "/api/v3/queries/columns/priority"
              title: Priority
            - href: "/api/v3/queries/columns/assignee"
              title: Assignee
            - href: "/api/v3/queries/columns/updated_at"
              title: Updated on
            highlightedAttributes: []
        - _type: QueryProjection::Gantt
          labels: {}
          zoomLevel: auto
          _links:
            highlightedAttributes: []
        - _type: QueryProjection::TeamPlanner
          _links:
            rows:
            - href: "/api/v3/users/1"
              title: Alan Touring
            - href: "/api/v3/users/5"
              title: John von Neumann
        - _type: QueryProjection::Calendar
        _embedded:
          results:
            _type: WorkPackageCollection
            total: 234
            count: 30
            pageSize: 30
            offset: 1
            _embedded:
              elements:
              - "<--- shortened for brevity --->"
            _links:
              self:
                href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
              jumpTo:
                href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=%7Boffset%7D&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
                templated: true
              changeSize:
                href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=%7Bsize%7D&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
                templated: true
              createWorkPackage:
                href: "/api/v3/work_packages/form"
                method: post
              createWorkPackageImmediate:
                href: "/api/v3/work_packages"
                method: post
        _links:
          self:
            href: "/api/v3/queries/9"
            title: abcdefg
          results:
            href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
          groupBy:
            href:
            title:
          sortBy:
          - href: "/api/v3/queries/sort_bys/parent-desc"
            title: Parent (Descending)
          user:
            href: "/api/v3/users/1"
            title: OpenProject Admin
          project:
            href: "/api/v3/projects/3"
            title: copy
    QuerySchemaModel:
      value:
        _dependencies: []
        _embedded:
          filtersSchemas:
            _embedded:
              elements:
              - _dependencies:
                - _type: SchemaDependency
                  dependencies:
                    "/api/v3/queries/operators/!":
                      values:
                        _links: {}
                        hasDefault: false
                        name: Values
                        required: true
                        type: "[]User"
                        writable: true
                    "/api/v3/queries/operators/!*": {}
                    "/api/v3/queries/operators/*": {}
                    "/api/v3/queries/operators/=":
                      values:
                        _links: {}
                        hasDefault: false
                        name: Values
                        required: true
                        type: "[]User"
                        writable: true
                  'on': operator
                _links:
                  filter:
                    href: "/api/v3/queries/filters/assignee"
                    title: Assignee
                  self:
                    href: "/api/v3/queries/filter_instance_schemas/assignee"
                _type: QueryFilterInstanceSchema
                filter:
                  _links: {}
                  hasDefault: false
                  name: Filter
                  required: true
                  type: QueryFilter
                  writable: true
                name:
                  hasDefault: true
                  name: Name
                  required: true
                  type: String
                  writable: false
              - _dependencies:
                - _type: SchemaDependency
                  dependencies:
                    "/api/v3/queries/operators/!":
                      values:
                        _links: {}
                        hasDefault: false
                        name: Values
                        required: true
                        type: "[]User"
                        writable: true
                    "/api/v3/queries/operators/=":
                      values:
                        _links: {}
                        hasDefault: false
                        name: Values
                        required: true
                        type: "[]User"
                        writable: true
                  'on': operator
                _links:
                  filter:
                    href: "/api/v3/queries/filters/author"
                    title: Author
                  self:
                    href: "/api/v3/queries/filter_instance_schemas/author"
                _type: QueryFilterInstanceSchema
                filter:
                  _links: {}
                  hasDefault: false
                  name: Filter
                  required: true
                  type: QueryFilter
                  writable: true
                name:
                  hasDefault: true
                  name: Name
                  required: true
                  type: String
                  writable: false
            _links:
              self:
                href: "/api/v3/queries/filter_instance_schemas"
            _type: Collection
            count: 20
            total: 20
        _links:
          self:
            href: "/api/v3/queries/schema"
        _type: Schema
        columns:
          _links: {}
          hasDefault: true
          location: _links
          name: Columns
          required: false
          type: "[]QueryColumn"
          writable: true
        createdAt:
          hasDefault: false
          name: Created on
          required: true
          type: DateTime
          writable: false
        filters:
          _links:
            allowedValuesSchemas:
              href: "/api/v3/queries/filter_instance_schemas"
          hasDefault: true
          location: _links
          name: Filters
          required: false
          type: "[]QueryFilterInstance"
          writable: true
        groupBy:
          _links: {}
          hasDefault: false
          name: Group results by
          required: false
          type: "[]QueryGroupBy"
          writable: true
        highlightedAttributes:
          hasDefault: true
          location: _links
          name: Highlighted attributes
          required: false
          type: "[]QueryColumn"
          writable: true
          deprecated: true
        highlightingMode:
          hasDefault: true
          name: Highlighting mode
          required: false
          type: String
          writable: true
          deprecated: true
        id:
          hasDefault: false
          name: ID
          required: true
          type: Integer
          writable: false
        name:
          hasDefault: false
          maxLength: 255
          minLength: 1
          name: Name
          required: true
          type: String
          writable: true
        project:
          _links: {}
          hasDefault: false
          location: _links
          name: Project
          required: false
          type: Project
          writable: true
        public:
          hasDefault: true
          name: Public
          required: false
          type: Boolean
          writable: true
        results:
          hasDefault: false
          name: Results
          required: false
          type: WorkPackageCollection
          writable: false
        showHierarchies:
          hasDefault: true
          name: Show hierarchies
          required: false
          type: Boolean
          writable: true
          deprecated: true
        sortBy:
          _links: {}
          hasDefault: true
          name: Sort by
          required: false
          type: "[]QuerySortBy"
          writable: true
        starred:
          hasDefault: true
          name: Starred
          required: false
          type: Boolean
          writable: true
        sums:
          hasDefault: true
          name: Sums
          required: false
          type: Boolean
          writable: true
        timelineLabels:
          hasDefault: true
          name: Timeline labels
          required: false
          type: QueryTimelineLabels
          writable: true
          deprecated: true
        timelineVisible:
          hasDefault: true
          name: Timeline visible
          required: false
          type: Boolean
          writable: true
          deprecated: true
        timelineZoomLevel:
          hasDefault: true
          name: Timeline zoom level
          required: false
          type: String
          writable: true
          deprecated: true
        timestamps:
          hasDefault: true
          name: Timestamps
          required: false
          type: "[]Timestamp"
          writable: true
        updatedAt:
          hasDefault: false
          name: Updated on
          required: true
          type: DateTime
          writable: false
        user:
          hasDefault: true
          name: User
          required: true
          type: User
          writable: false
    UserResponse:
      value:
        _type: User
        id: 14
        name: Mara Jade
        createdAt: '2022-04-04T08:07:22.910Z'
        updatedAt: '2024-02-09T09:01:17.382Z'
        login: member
        admin: false
        firstName: Mara
        lastName: Jade
        email: m.jade@empire.org
        avatar: https://secure.gravatar.com/avatar/17dd23570f3bd129d06db9b48b7a41b8?default=404&secure=true
        status: active
        identityUrl:
        language: en
        _links:
          self:
            href: "/api/v3/users/14"
            title: Mara Jade
          memberships:
            href: "/api/v3/memberships?filters=%5B%7B%22principal%22%3A%7B%22operator%22%3A%22%3D%22%2C%22values%22%3A%5B%2214%22%5D%7D%7D%5D"
            title: Memberships
          showUser:
            href: "/users/14"
            type: text/html
          updateImmediately:
            href: "/api/v3/users/14"
            title: Update member
            method: patch
          lock:
            href: "/api/v3/users/14/lock"
            title: Set lock on member
            method: post
          delete:
            href: "/api/v3/users/14"
            title: Delete member
            method: delete
    ValuesPropertyStartDateSchema:
      value:
        _type: Schema
        property:
          name: Property
          type: String
        value:
          name: Start date
          type: Date
        _links:
          self:
            href: api/v3/values/schemas/startDate
    ValuesPropertyDueDateSchema:
      value:
        _type: Schema
        property:
          name: Property
          type: String
        value:
          name: Due date
          type: Date
        _links:
          self:
            href: api/v3/values/schemas/dueDate
    ValuesPropertyDateSchema:
      value:
        _type: Schema
        property:
          name: Property
          type: String
        value:
          name: Date
          type: Date
        _links:
          self:
            href: api/v3/values/schemas/date
    ValuesPropertyStartDate:
      value:
        _type: Values::Property
        property: startDate
        value: '2021-01-01'
        _links:
          self:
            href: api/v3/notifications/123/details/0
          schema:
            href: api/v3/values/schemas/startDate
    ValuesPropertyDueDate:
      value:
        _type: Values::Property
        property: dueDate
        value: '2021-01-01'
        _links:
          self:
            href: api/v3/notifications/123/details/0
          schema:
            href: api/v3/values/schemas/dueDate
    ValuesPropertyDate:
      value:
        _type: Values::Property
        property: date
        value: '2021-01-01'
        _links:
          self:
            href: api/v3/notifications/123/details/0
          schema:
            href: api/v3/values/schemas/date
    Views:
      value:
        _links:
          self:
            href: "/api/v3/views"
          changeSize:
            href: "/api/v3/views?pageSize={size}"
            templated: true
          jumpTo:
            href: "/api/v3/views?offset={offset}"
            templated: true
        total: 1
        count: 1
        _type: Collection
        _embedded:
          elements:
          - _type: Views::WorkPackagesTable
            name: Current work packages
            timelineVisible: true
            id: 9
            _links:
              self:
                href: "/api/v3/views/9"
              query:
                href: "/api/v3/queries/18"
                title: A query
              columns:
              - href: "/api/v3/users/id"
                title: ID
              - href: "/api/v3/users/subject"
                title: Subject
              - href: "/api/v3/users/type"
                title: Type
              - href: "/api/v3/users/status"
                title: Status
              - href: "/api/v3/users/priority"
                title: Priority
              - href: "/api/v3/users/assignee"
                title: Assignee
              - href: "/api/v3/users/updated_at"
                title: Updated on
              project:
                href: "/api/v3/project/89"
                title: The project
    ViewWorkPackagesTable:
      value:
        _type: Views::WorkPackagesTable
        name: Current work packages
        id: 9
        _links:
          self:
            href: "/api/v3/views/9"
          query:
            href: "/api/v3/queries/18"
            title: Current work packages
          project:
            href: "/api/v3/project/89"
            title: The project
    ViewTeamPlanner:
      value:
        _type: Views::TeamPlanner
        name: Product team
        id: 9
        _links:
          self:
            href: "/api/v3/views/9"
          query:
            href: "/api/v3/queries/18"
            title: Product team
          project:
            href: "/api/v3/project/89"
            title: The project
    WorkPackageCreateOnlySubject:
      description: |-
        A request body to create a work package with only a subject. This can only be used, if the project context is already
        given in the path. All other values will fall back to defaults.
      value:
        subject: Replace GNK power droids
    WorkPackageCreateValid:
      description: A valid request body to create or edit a work package with a couple
        of properties.
      value:
        subject: Install Dromund Kass planetary shield
        description:
          format: markdown
          raw: |-
            # TODO

            The planetary shield of Dromund Kass needs to be installed to protect the planet from orbital bombardment.
        startDate: '2877-07-21'
        duration: P1337D
        estimatedTime: P1Y5DT13H
        ignoreNonWorkingDays: true
        project:
          href: "/api/v3/projects/42"
        type:
          href: "/api/v3/types/13"
        status:
          href: "/api/v3/statuses/2"
    WorkPackageEditSubject:
      description: A request body to edit a work package's subject.
      value:
        subject: Replace GNK power droids
  responses:
    InvalidQuery:
      description: Returned if the client sends invalid request parameters e.g. filters
      content:
        application/hal+json:
          schema:
            "$ref": "#/components/schemas/ErrorResponse"
          example:
            _type: Error
            errorIdentifier: urn:openproject-org:api:v3:errors:InvalidQuery
            message: Filters Invalid filter does not exist.
    InvalidRequestBody:
      description: Occurs when the client did not send a valid JSON object in the
        request body.
      content:
        application/hal+json:
          schema:
            "$ref": "#/components/schemas/ErrorResponse"
          example:
            _type: Error
            errorIdentifier: urn:openproject-org:api:v3:errors:InvalidRequestBody
            message: The request body was not a single JSON object.
    MissingContentType:
      description: Occurs when the client did not send a Content-Type header
      content:
        text/plain:
          schema:
            type: string
          example: Missing content-type header
    UnsupportedMediaType:
      description: Occurs when the client sends an unsupported Content-Type header.
      content:
        application/hal+json:
          schema:
            "$ref": "#/components/schemas/ErrorResponse"
          example:
            _type: Error
            errorIdentifier: urn:openproject-org:api:v3:errors:TypeNotSupported
            message: Expected CONTENT-TYPE to be (expected value) but got (actual
              value).
  schemas:
    ActivityModel:
      type: object
      properties:
        _type:
          type: string
          enum:
          - Activity::Comment
        id:
          type: integer
          description: Activity id
          minimum: 1
        version:
          type: integer
          description: Activity version
          minimum: 1
        comment:
          "$ref": "#/components/schemas/Formattable"
        details:
          type: array
          items:
            "$ref": "#/components/schemas/Formattable"
        internal:
          type: boolean
          description: Whether this activity is internal (only visible to users with
            view_internal_comments permission)
        createdAt:
          type: string
          format: date-time
          description: Time of creation
        updatedAt:
          type: string
          format: date-time
          description: Time of update
        _embedded:
          type: object
          properties:
            attachments:
              allOf:
              - "$ref": "#/components/schemas/Attachments_Model"
              - description: Collection of attachments for this activity
            workPackage:
              allOf:
              - "$ref": "#/components/schemas/WorkPackageModel"
              - description: |-
                  The work package this activity belongs to

                  # Conditions

                  Only embedded when the `journable` of the activity is a work package
            emojiReactions:
              allOf:
              - "$ref": "#/components/schemas/EmojiReactions_Model"
              - description: Collection of emoji reactions for this activity
        _links:
          type: object
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This activity

                  **Resource**: Activity
            workPackage:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The work package this activity belongs to

                  **Resource**: WorkPackage
            user:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The user who created this activity

                  **Resource**: Principal
            update:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: Update this activity
            attachments:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The attachment collection of this activity

                  **Resource**: Attachments
            addAttachment:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Attach a file to the activity

                  # Conditions

                  **Permissions**:
                  - `add_work_package_comments`
                  - for internal comments: `add_internal_comments`
            emojiReactions:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The emoji reactions collection of this activity

                  **Resource**: EmojiReactions
      example:
        id: 1
        _type: Activity::Comment
        _embedded:
          attachments:
            _type: Collection
            total: 1
            count: 1
            _embedded:
              elements:
              - _type: Attachment
                id: 30388
                fileName: Task_Ensure_financing___4___OpenProject_DEV.jpeg
                fileSize: 540992
                description:
                  format: plain
                  raw: ''
                  html: ''
                status: uploaded
                contentType: image/jpeg
                digest:
                  algorithm: md5
                  hash: d02d312b25383b595a9fa10f1a8999fe
                createdAt: '2025-04-08T15:37:19.275Z'
                _links:
                  self:
                    href: "/api/v3/attachments/30388"
                    title: Task_Ensure_financing___4___OpenProject_DEV.jpeg
                  author:
                    href: "/api/v3/users/435"
                    title: Firstname
                  container:
                    href: "/api/v3/activities/79090"
                  staticDownloadLocation:
                    href: "/api/v3/attachments/30388/content"
                  downloadLocation:
                    href: "/api/v3/attachments/30388/content"
                  delete:
                    href: "/api/v3/attachments/30388"
                    method: delete
            _links:
              self:
                href: "/api/v3/activities/79090/attachments"
          emojiReactions:
            _type: Collection
            total: 2
            count: 2
            _embedded:
              elements:
              - _type: EmojiReaction
                id: 1-thumbs_up
                reaction: thumbs_up
                emoji: "\U0001F44D"
                reactionsCount: 3
                firstReactionAt: '2024-04-08T15:37:19.275Z'
                _links:
                  self:
                    href: "/api/v3/emoji_reactions/1-thumbs_up"
                  reactable:
                    href: "/api/v3/activities/1"
                  reactingUsers:
                  - href: "/api/v3/users/435"
                    title: John Doe
                  - href: "/api/v3/users/436"
                    title: Jane Smith
                  - href: "/api/v3/users/437"
                    title: Bob Johnson
              - _type: EmojiReaction
                id: 1-heart
                reaction: heart
                emoji: "❤️"
                reactionsCount: 1
                firstReactionAt: '2024-04-08T15:38:19.275Z'
                _links:
                  self:
                    href: "/api/v3/emoji_reactions/1-heart"
                  reactable:
                    href: "/api/v3/activities/1"
                  reactingUsers:
                  - href: "/api/v3/users/435"
                    title: John Doe
            _links:
              self:
                href: "/api/v3/activities/1/emoji_reactions"
          workPackage:
            _type: WorkPackage
            id: 10403
            lockVersion: 2
            subject: Ensure financing
            description:
              format: markdown
              raw: Lorem ipsum dolor sit amet.
              html: "<p>Lorem ipsum dolor sit amet.</p>"
            scheduleManually: true
            startDate:
            dueDate:
            derivedStartDate:
            derivedDueDate:
            estimatedTime:
            derivedEstimatedTime:
            derivedRemainingTime:
            duration:
            ignoreNonWorkingDays: false
            percentageDone:
            derivedPercentageDone:
            createdAt: '2025-03-24T13:11:09.480Z'
            updatedAt: '2025-04-14T11:00:02.411Z'
            _links:
              self:
                href: "/api/v3/work_packages/10403"
                title: Ensure financing
              type:
                href: "/api/v3/types/1"
                title: Task
              status:
                href: "/api/v3/statuses/1"
                title: New
              project:
                href: "/api/v3/projects/918"
                title: RVC Test
        _links:
          self:
            href: "/api/v3/activity/1"
            title: Priority changed from High to Low
          workPackage:
            href: "/api/v3/work_packages/1"
            title: quis numquam qui voluptatum quia praesentium blanditiis nisi
          user:
            href: "/api/v3/users/1"
            title: John Sheppard - admin
          attachments:
            href: "/api/v3/activities/1/attachments"
          emojiReactions:
            href: "/api/v3/activities/1/emoji_reactions"
          addAttachment:
            href: "/api/v3/activities/1/attachments"
            method: post
          update:
            href: "/api/v3/activities/1"
            method: patch
        details:
        - format: markdown
          raw: Lorem ipsum dolor sit amet.
          html: "<p>Lorem ipsum dolor sit amet.</p>"
        comment:
          format: markdown
          raw: Lorem ipsum dolor sit amet.
          html: "<p>Lorem ipsum dolor sit amet.</p>"
        createdAt: '2014-05-21T08:51:20.721Z'
        updatedAt: '2014-05-21T09:14:02.929Z'
        version: 31
    ActivityCommentWriteModel:
      type: object
      properties:
        comment:
          type: object
          properties:
            raw:
              type: string
              description: The raw content of the comment
        internal:
          type: boolean
          description: |-
            Determines whether this comment is internal. This is only available to users
            with `add_internal_comments` permission. It defaults to `false`, if unset.
          default: false
      example:
        comment:
          raw: I think this is awesome!
    AttachmentModel:
      type: object
      required:
      - title
      - fileName
      - description
      - contentType
      - digest
      - createdAt
      properties:
        id:
          type: integer
          description: Attachment's id
          minimum: 1
        title:
          type: string
          description: The name of the file
        fileName:
          type: string
          description: The name of the uploaded file
        fileSize:
          type: integer
          description: The size of the uploaded file in Bytes
          minimum: 0
        description:
          allOf:
          - "$ref": "#/components/schemas/Formattable"
          - description: A user provided description of the file
        contentType:
          type: string
          description: The files MIME-Type as determined by the server
        digest:
          type: string
          description: A checksum for the files content
        createdAt:
          type: string
          format: date-time
          description: Time of creation
        _links:
          type: object
          required:
          - self
          - container
          - author
          - downloadLocation
          properties:
            delete:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Deletes this attachment

                  # Conditions

                  **Permission**: edit on attachment container or being the author for attachments without container
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This attachment

                  **Resource**: Attachment
            container:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The object (e.g. WorkPackage) housing the attachment

                  **Resource**: Anything
            author:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The user who uploaded the attachment

                  **Resource**: User
            downloadLocation:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Direct download link to the attachment

                  **Resource**: -
      example:
        _type: Attachment
        _links:
          self:
            href: "/api/v3/attachments/1"
          container:
            href: "/api/v3/work_packages/1"
          author:
            href: "/api/v3/users/1"
          staticDownloadLocation:
            href: "/api/v3/attachments/1/content"
          downloadLocation:
            href: "/some/remote/aws/url/image.png"
        id: 1
        fileName: cat.png
        filesize: 24
        description:
          format: plain
          raw: A picture of a cute cat
          html: "<p>A picture of a cute cat</p>"
        contentType: image/png
        digest:
          algorithm: md5
          hash: 64c26a8403cd796ea4cf913cda2ee4a9
        createdAt: '2014-05-21T08:51:20.396Z'
    Attachments_Model:
      allOf:
      - "$ref": "#/components/schemas/CollectionModel"
      - type: object
        required:
        - _links
        - _embedded
        properties:
          _links:
            type: object
            required:
            - self
            properties:
              self:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    The attachments collection

                    **Resource**: AttachmentsCollection
                  readOnly: true
          _embedded:
            type: object
            properties:
              elements:
                type: array
                readOnly: true
                items:
                  allOf:
                  - "$ref": "#/components/schemas/AttachmentModel"
                  - description: Collection of Attachments
    Available_AssigneesModel:
      allOf:
      - "$ref": "#/components/schemas/CollectionModel"
      - type: object
        required:
        - _links
        - _embedded
        properties:
          _links:
            type: object
            required:
            - self
            properties:
              self:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    The available assignees collection

                    **Resource**: AvailableAssigneesCollection
                  readOnly: true
          _embedded:
            type: object
            properties:
              elements:
                type: array
                readOnly: true
                items:
                  allOf:
                  - "$ref": "#/components/schemas/UserModel"
                  - description: Collection of Users
    Available_WatchersModel:
      type: object
      example:
        _links:
          self:
            href: "/api/v3/work_packages/1/available_watchers"
        total: 2
        count: 2
        _type: Collection
        _embedded:
          elements:
          - _type: User
            _links:
              self:
                href: "/api/v3/users/1"
                title: John Sheppard - j.sheppard
              lock:
                href: "/api/v3/users/1/lock"
                title: Set lock on j.sheppard
                method: POST
              delete:
                href: "/api/v3/users/1"
                title: Delete j.sheppard
                method: DELETE
            id: 1
            login: j.sheppard
            firstName: John
            lastName: Sheppard
            email: shep@mail.com
            avatar: https://example.org/users/1/avatar
            status: active
            createdAt: '2014-05-21T08:51:20.286Z'
            updatedAt: '2014-05-21T08:51:20.286Z'
          - _type: User
            _links:
              self:
                href: "/api/v3/users/2"
                title: Jim Sheppard - j.sheppard2
              lock:
                href: "/api/v3/users/2/lock"
                title: Set lock on j.sheppard2
                method: POST
              delete:
                href: "/api/v3/users/2"
                title: Delete j.sheppard2
                method: DELETE
            id: 2
            login: j.sheppard2
            firstName: Jim
            lastName: Sheppard
            email: shep@mail.net
            avatar: https://example.org/users/1/avatar
            status: active
            createdAt: '2014-05-21T08:51:20.286Z'
            updatedAt: '2014-05-21T08:51:20.286Z'
    Available_projects_for_queryModel:
      type: object
      example:
        _links:
          self:
            href: "/api/v3/queries/available_projects"
        _type: Collection
        total: 2
        count: 2
        _embedded:
          elements:
          - _type: Project
            _links:
              self:
                href: "/api/v3/projects/6"
                title: A project
              createWorkPackage:
                href: "/api/v3/projects/6/work_packages/form"
                method: post
              createWorkPackageImmediate:
                href: "/api/v3/projects/6/work_packages"
                method: post
              categories:
                href: "/api/v3/projects/6/categories"
              versions:
                href: "/api/v3/projects/6/versions"
            id: 6
            identifier: a_project
            name: A project
            description: Eveniet molestias omnis quis aut qui eum adipisci.
            createdAt: '2015-07-06T13:28:14+00:00'
            updatedAt: '2015-10-01T09:55:02+00:00'
            type: Customer Project
          - _type: Project
            _links:
              self:
                href: "/api/v3/projects/14"
                title: Another project
              createWorkPackage:
                href: "/api/v3/projects/14/work_packages/form"
                method: post
              createWorkPackageImmediate:
                href: "/api/v3/projects/14/work_packages"
                method: post
              categories:
                href: "/api/v3/projects/14/categories"
              versions:
                href: "/api/v3/projects/14/versions"
            id: 14
            identifier: another_project
            name: Another project
            description: ''
            createdAt: '2016-02-29T12:50:20+00:00'
            updatedAt: '2016-02-29T12:50:20+00:00'
            type:
    Available_projects_for_time_entriesModel:
      type: object
      example:
        _links:
          self:
            href: "/api/v3/time_entries/available_projects"
        _type: Collection
        total: 2
        count: 2
        _embedded:
          elements:
          - _type: Project...
          - _type: Project...
    Available_projects_for_versionsModel:
      type: object
      example:
        _links:
          self:
            href: "/api/v3/versions/available_projects"
        _type: Collection
        total: 2
        count: 2
        _embedded:
          elements:
          - _type: Project
            _links:
              self:
                href: "/api/v3/projects/6"
                title: A project
              editWorkPackage:
                href: "/api/v3/work_packages/{id}/form"
                templated: true
                method: post
              createWorkPackage:
                href: "/api/v3/projects/6/work_packages/form"
                method: post
              createWorkPackageImmediate:
                href: "/api/v3/projects/6/work_packages"
                method: post
              categories:
                href: "/api/v3/projects/6/categories"
              versions:
                href: "/api/v3/projects/6/versions"
            id: 6
            identifier: a_project
            name: A project
            description: Eveniet molestias omnis quis aut qui eum adipisci. Atque
              aut aut in exercitationem adipisci amet. Nisi asperiores quia ratione
              veritatis enim exercitationem magnam. Aut fuga architecto adipisci nihil.
              Et repellat pariatur. Aliquam et sed perferendis nostrum quaerat. Fugit
              doloremque voluptatem.
            createdAt: '2015-07-06T13:28:14+00:00'
            updatedAt: '2015-10-01T09:55:02+00:00'
            type: Customer Project
          - _type: Project
            _links:
              self:
                href: "/api/v3/projects/14"
                title: Another project
              createWorkPackage:
                href: "/api/v3/projects/14/work_packages/form"
                method: post
              createWorkPackageImmediate:
                href: "/api/v3/projects/14/work_packages"
                method: post
              categories:
                href: "/api/v3/projects/14/categories"
              versions:
                href: "/api/v3/projects/14/versions"
            id: 14
            identifier: another_project
            name: Another project
            description: ''
            createdAt: '2016-02-29T12:50:20+00:00'
            updatedAt: '2016-02-29T12:50:20+00:00'
            type:
    Available_projects_for_work_packageModel:
      type: object
      example:
        _links:
          self:
            href: "/api/v3/work_packages/5/available_projects"
        _type: Collection
        total: 2
        count: 2
        _embedded:
          elements:
          - _type: Project
            _links:
              self:
                href: "/api/v3/projects/6"
                title: A project
              editWorkPackage:
                href: "/api/v3/work_packages/{id}/form"
                templated: true
                method: post
              createWorkPackage:
                href: "/api/v3/projects/6/work_packages/form"
                method: post
              createWorkPackageImmediate:
                href: "/api/v3/projects/6/work_packages"
                method: post
              categories:
                href: "/api/v3/projects/6/categories"
              versions:
                href: "/api/v3/projects/6/versions"
            id: 6
            identifier: a_project
            name: A project
            description: Eveniet molestias omnis quis aut qui eum adipisci. Atque
              aut aut in exercitationem adipisci amet. Nisi asperiores quia ratione
              veritatis enim exercitationem magnam. Aut fuga architecto adipisci nihil.
              Et repellat pariatur. Aliquam et sed perferendis nostrum quaerat. Fugit
              doloremque voluptatem.
            createdAt: '2015-07-06T13:28:14+00:00'
            updatedAt: '2015-10-01T09:55:02+00:00'
            type: Customer Project
          - _type: Project
            _links:
              self:
                href: "/api/v3/projects/14"
                title: Another project
              createWorkPackage:
                href: "/api/v3/projects/14/work_packages/form"
                method: post
              createWorkPackageImmediate:
                href: "/api/v3/projects/14/work_packages"
                method: post
              categories:
                href: "/api/v3/projects/14/categories"
              versions:
                href: "/api/v3/projects/14/versions"
            id: 14
            identifier: another_project
            name: Another project
            description: ''
            createdAt: '2016-02-29T12:50:20+00:00'
            updatedAt: '2016-02-29T12:50:20+00:00'
            type:
    Available_relation_candidatesModel:
      type: object
      example:
        _links:
          self:
            href: "/api/v3/projects/14/work_packages"
        total: 2
        count: 2
        _type: Collection
        _embedded:
          elements:
          - _type: WorkPackage
            _links:
              self:
                href: "/api/v3/work_packages/1"
            id: 1
            subject: Skipped other properties for brevity
          - _type: WorkPackage
            _links:
              self:
                href: "/api/v3/work_packages/2"
            id: 2
            subject: Skipped other properties for brevity
    BudgetModel:
      type: object
      properties:
        _links:
          type: object
          required:
          - self
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This budget

                  **Resource**: Budget
                readOnly: true
      example:
        _type: Budget
        _links:
          self:
            href: "/api/v3/budgets/1"
            title: Q3 2015
        id: 1
        subject: Q3 2015
    Budgets_by_ProjectModel:
      type: object
      example:
        _links:
          self:
            href: "/api/v3/projects/1/budgets"
        _type: Collection
        total: 2
        count: 2
        _embedded:
          elements:
          - _type: Budget
            _links:
              self:
                href: "/api/v3/budgets/1"
                title: Q3 2015
            id: 1
            subject: Q3 2015
          - _type: Budget
            _links:
              self:
                href: "/api/v3/budgets/2"
                title: Q4 2015
            id: 2
            subject: Q4 2015
    Categories_by_ProjectModel:
      allOf:
      - "$ref": "#/components/schemas/CollectionModel"
      - type: object
        required:
        - _links
        - _embedded
        properties:
          _links:
            type: object
            required:
            - self
            properties:
              self:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    The categories collection

                    **Resource**: CategoriesCollection
                  readOnly: true
          _embedded:
            type: object
            properties:
              elements:
                type: array
                readOnly: true
                items:
                  allOf:
                  - "$ref": "#/components/schemas/CategoryModel"
                  - description: Collection of Categories
    CategoryModel:
      type: object
      properties:
        id:
          type: integer
          description: Category id
          readOnly: true
          exclusiveMinimum: 0
        name:
          type: string
          description: Category name
        _links:
          type: object
          required:
          - self
          - project
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This category

                  **Resource**: Category
                readOnly: true
            project:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The project of this category

                  **Resource**: Project
                readOnly: true
            defaultAssignee:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Default assignee for work packages of this category

                  **Resource**: User
                readOnly: true
      example:
        _links:
          self:
            href: "/api/v3/categories/10"
            title: Category with assignee
          project:
            href: "/api/v3/projects/11"
            title: Example project
          defaultAssignee:
            href: "/api/v3/users/42"
            title: John Sheppard
        _type: Category
        id: 10
        name: Foo
    CollectionLinks:
      type: object
      required:
      - self
      properties:
        self:
          allOf:
          - "$ref": "#/components/schemas/Link"
          - description: |-
              This collection resource.

              **Resource**: Collection
    CollectionModel:
      type: object
      required:
      - _type
      - total
      - count
      - _links
      properties:
        _type:
          type: string
          enum:
          - Collection
        total:
          type: integer
          description: The total amount of elements available in the collection.
          minimum: 0
        count:
          type: integer
          description: Actual amount of elements in this response.
          minimum: 0
        _links:
          "$ref": "#/components/schemas/CollectionLinks"
    ConfigurationModel:
      type: object
      properties:
        maximumAttachmentFileSize:
          type: integer
          description: The maximum allowed size of an attachment in Bytes
          readOnly: true
        hostName:
          type: string
          description: The host name configured for the system
          readOnly: true
        perPageOptions:
          type: array
          description: Page size steps to be offered in paginated list UI
          items:
            type: integer
        durationFormat:
          type: string
          description: The format used to display Work, Remaining Work, and Spent
            time durations
          readOnly: true
        activeFeatureFlags:
          type: array
          description: The list of all feature flags that are active
          items:
            type: string
    CustomActionModel:
      type: object
      properties:
        _type:
          type: string
          enum:
          - CustomAction
        name:
          type: string
          description: The name of the custom action
        description:
          type: string
          description: The description for the custom action
        _links:
          type: object
          required:
          - self
          - executeImmediately
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This custom action

                  **Resource**: CustomAction
            executeImmediately:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: Execute this custom action.
      examples:
      - _type: CustomAction
        name: Change project and type
        description: Changes project and type in one go
        _links:
          executeImmediately:
            href: "/api/v3/custom_actions/2/execute"
            title: Execute Change project and type
            method: post
          self:
            href: "/api/v3/custom_actions/2"
            title: Change project and type
    CustomOptionModel:
      type: object
      properties:
        id:
          type: integer
          description: The identifier
          readOnly: true
        value:
          type: string
          description: The value defined for this custom option
          readOnly: true
        _links:
          type: object
          required:
          - self
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This custom option.

                  **Resource**: CustomOption
                readOnly: true
      example:
        _links:
          self:
            href: "/api/v3/custom_options/1"
        _type: CustomOption
        value: Foo
    DayCollectionModel:
      allOf:
      - "$ref": "#/components/schemas/CollectionModel"
      - type: object
        required:
        - _links
        - _embedded
        properties:
          _links:
            type: object
            required:
            - self
            properties:
              self:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    This days collection

                    **Resource**: DayCollectionModel
          _embedded:
            type: object
            required:
            - elements
            properties:
              elements:
                type: array
                description: |-
                  The array of days. Each day has a name and a working status
                  indicating if it is a working or a non-working day.
                items:
                  "$ref": "#/components/schemas/DayModel"
      example:
        _type: Collection
        total: 5
        count: 5
        _links:
          self:
            href: /api/v3/days?filters=[{"interval":{"operator":"<>d","values":["2022-04-29","2022-05-03"]}}]
        _embedded:
          elements:
          - _type: Day
            date: '2022-04-29'
            name: Friday
            working: true
            _links:
              self:
                href: "/api/v3/days/2022-04-29"
              weekday:
                href: "/api/v3/days/week/5"
                title: Friday
          - _type: Day
            date: '2022-04-30'
            name: Saturday
            working: false
            _links:
              self:
                href: "/api/v3/days/2022-04-30"
              nonWorkingReasons:
              - href: "/api/v3/days/week/6"
                title: Saturday
              weekday:
                href: "/api/v3/days/week/6"
                title: Saturday
          - _type: Day
            date: '2022-05-01'
            name: Sunday (Labour day)
            working: false
            _links:
              self:
                href: "/api/v3/days/2022-05-01"
              nonWorkingReasons:
              - href: "/api/v3/days/week/7"
                title: Sunday
              - href: "/api/v3/days/non_working/2022-05-01"
                title: Labour day
              weekday:
                href: "/api/v3/days/week/7"
                title: Sunday
          - _type: Day
            date: '2022-05-02'
            name: Monday
            working: true
            _links:
              self:
                href: "/api/v3/days/2022-05-02"
              weekday:
                href: "/api/v3/days/week/1"
                title: Monday
          - _type: Day
            date: '2022-05-03'
            name: Tuesday
            working: true
            _links:
              self:
                href: "/api/v3/days/2022-05-03"
              weekday:
                href: "/api/v3/days/week/2"
                title: Tuesday
    DayModel:
      type: object
      required:
      - _type
      - date
      - name
      - working
      properties:
        _type:
          type: string
          enum:
          - Day
        date:
          type: string
          format: date
          description: Date of the day.
        name:
          type: string
          description: Descriptive name for the day.
        working:
          type: boolean
          description: "`true` for a working day, `false` otherwise."
        _links:
          type: object
          required:
          - self
          properties:
            self:
              "$ref": "#/components/schemas/Link"
            nonWorkingReasons:
              type: array
              description: |-
                A list of resources describing why this day is a non-working day.
                Linked resources can be `NonWorkingDay` and `WeekDay` resources.
                This property is absent for working days.
              items:
                "$ref": "#/components/schemas/Link"
            weekDay:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: The week day for this day.
      example:
        _type: Day
        date: '2022-12-25'
        name: Sunday (Christmas)
        working: false
        _links:
          self:
            href: "/api/v3/days/2022-12-25"
          nonWorkingReasons:
          - href: "/api/v3/days/week/7"
            title: Sunday
          - href: "/api/v3/days/non_working/2022-12-25"
            title: Christmas
          weekday:
            href: "/api/v3/days/week/7"
            title: Sunday
    Default_QueryModel:
      type: object
      example:
        _type: Query
        name: default
        filters:
        - _type: StatusQueryFilter
          name: Status
          _links:
            filter:
              href: "/api/v3/queries/filters/status"
              title: Status
            operator:
              href: "/api/v3/queries/operators/o"
              title: open
            schema:
              href: "/api/v3/queries/filter_instance_schemas/status"
            values: []
        public: false
        sums: false
        timelineVisible: false
        timelineZoomLevel: days
        timelineLabels: {}
        highlightingMode: inline
        timestamps:
        - P0D
        showHierarchies: true
        starred: false
        _embedded:
          results:
            _type: WorkPackageCollection
            total: 234
            count: 30
            pageSize: 2
            offset: 1
            _embedded:
              elements:
              - "<--- shortened for brevity --->"
            _links:
              self:
                href: "/api/v3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
              jumpTo:
                href: "/api/v3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=%7Boffset%7D&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
                templated: true
              changeSize:
                href: "/api/v3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=%7Bsize%7D&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
                templated: true
              createWorkPackage:
                href: "/api/v3/work_packages/form"
                method: post
              createWorkPackageImmediate:
                href: "/api/v3/work_packages"
                method: post
            highlightedAttributes: []
        _links:
          self:
            href: "/api/v3/queries/default"
            title: Default
          results:
            href: "/api/v3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
          columns:
          - href: "/api/v3/queries/columns/id"
            title: ID
          - href: "/api/v3/queries/columns/subject"
            title: Subject
          - href: "/api/v3/queries/columns/type"
            title: Type
          - href: "/api/v3/queries/columns/status"
            title: Status
          - href: "/api/v3/queries/columns/priority"
            title: Priority
          - href: "/api/v3/queries/columns/assignee"
            title: Assignee
          - href: "/api/v3/queries/columns/updated_at"
            title: Updated on
          highlightedAttributes: []
          groupBy:
            href:
            title:
          sortBy:
          - href: "/api/v3/queries/sort_bys/parent-desc"
            title: Parent (Descending)
          user:
            href: "/api/v3/users/1"
            title: OpenProject Admin
          project:
            href:
    Default_Query_for_ProjectModel:
      type: object
      example:
        _type: Query
        name: default
        filters:
        - _type: StatusQueryFilter
          name: Status
          _links:
            filter:
              href: "/api/v3/queries/filters/status"
              title: Status
            operator:
              href: "/api/v3/queries/operators/o"
              title: open
            schema:
              href: "/api/v3/queries/filter_instance_schemas/status"
            values: []
        public: false
        sums: false
        timelineVisible: false
        timelineZoomLevel: days
        showHierarchies: true
        starred: false
        _embedded:
          results:
            _type: WorkPackageCollection
            total: 234
            count: 30
            pageSize: 2
            offset: 1
            _embedded:
              elements:
              - "<--- shortened for brevity --->"
            _links:
              self:
                href: "/api/v3/projects/42/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
              jumpTo:
                href: "/api/v3/projects/42/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=%7Boffset%7D&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
                templated: true
              changeSize:
                href: "/api/v3/projects/42/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=%7Bsize%7D&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
                templated: true
              createWorkPackage:
                href: "/api/v3/work_packages/form"
                method: post
              createWorkPackageImmediate:
                href: "/api/v3/work_packages"
                method: post
        _links:
          self:
            href: "/api/v3/projects/42/queries/default"
            title: Default
          results:
            href: "/api/v3/projects/42/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
          columns:
          - href: "/api/v3/queries/columns/id"
            title: ID
          - href: "/api/v3/queries/columns/subject"
            title: Subject
          - href: "/api/v3/queries/columns/type"
            title: Type
          - href: "/api/v3/queries/columns/status"
            title: Status
          - href: "/api/v3/queries/columns/priority"
            title: Priority
          - href: "/api/v3/queries/columns/assignee"
            title: Assignee
          - href: "/api/v3/queries/columns/updated_at"
            title: Updated on
          groupBy:
            href:
            title:
          sortBy:
          - href: "/api/v3/queries/sort_bys/parent-desc"
            title: Parent (Descending)
          user:
            href: "/api/v3/users/1"
            title: OpenProject Admin
          project:
            href: "/api/v3/projects/42"
            title: Lorem ipsum project
    DocumentModel:
      type: object
      properties:
        id:
          type: integer
          description: Document's id
          readOnly: true
          exclusiveMinimum: 0
        title:
          type: string
          description: The title chosen for the collection of documents
          readOnly: true
        description:
          type: string
          description: A text describing the documents
          readOnly: true
        createdAt:
          type: string
          format: date-time
          description: The time the document was created at
          readOnly: true
        _links:
          type: object
          required:
          - self
          - project
          - attachments
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This document

                  **Resource**: Document
                readOnly: true
            project:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The project the document is in

                  **Resource**: Project
            attachments:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The attachments belonging to the document

                  **Resource**: []Attachment
      example:
        _type: Document
        id: 1
        title: Some other document
        description:
          format: markdown
          raw: Videlicet deserunt aequitas cognatus. Concedo quia est quia pariatur
            vorago vallum. Calco autem atavus accusamus conscendo cornu ulterius.
            Tam patria ago consectetur ventito sustineo nihil caecus. Supra officiis
            eos velociter somniculosus tonsor qui. Suffragium aduro arguo angustus
            cogito quia tolero vulnus. Supplanto sortitus cresco apud vestrum qui.
          html: "<p>Videlicet deserunt aequitas cognatus. Concedo quia est quia pariatur
            vorago vallum. Calco autem atavus accusamus conscendo cornu ulterius.
            Tam patria ago consectetur ventito sustineo nihil caecus. Supra officiis
            eos velociter somniculosus tonsor qui. Suffragium aduro arguo angustus
            cogito quia tolero vulnus. Supplanto sortitus cresco apud vestrum qui.</p>"
        createdAt: '2018-12-10T20:53:39.539Z'
        _links:
          attachments:
            href: "/api/v3/documents/1/attachments"
          addAttachment:
            href: "/api/v3/documents/1/attachments"
            method: post
          self:
            href: "/api/v3/documents/1"
            title: Some document
          project:
            href: "/api/v3/projects/19"
            title: Some project
        _embedded:
          project:
            _type: Project...
          attachments:
            _type: Collection
            total: 2
            count: 2
            _embedded...:
              elements: []
            _links:
              self:
                href: "/api/v3/documents/1/attachments"
    DocumentsModel:
      type: object
      example:
        _type: Collection
        total: 2
        count: 2
        pageSize: 30
        offset: 1
        _embedded:
          elements:
          - description:
              format: markdown
              raw: Videlicet deserunt aequitas cognatus. Concedo quia est quia pariatur
                vorago vallum. Calco autem atavus accusamus conscendo cornu ulterius.
                Tam patria ago consectetur ventito sustineo nihil caecus. Supra officiis
                eos velociter somniculosus tonsor qui. Suffragium aduro arguo angustus
                cogito quia tolero vulnus. Supplanto sortitus cresco apud vestrum
                qui.
              html: "<p>Videlicet deserunt aequitas cognatus. Concedo quia est quia
                pariatur vorago vallum. Calco autem atavus accusamus conscendo cornu
                ulterius. Tam patria ago consectetur ventito sustineo nihil caecus.
                Supra officiis eos velociter somniculosus tonsor qui. Suffragium aduro
                arguo angustus cogito quia tolero vulnus. Supplanto sortitus cresco
                apud vestrum qui.</p>"
            _type: Document
            id: 1
            title: Some other document
            createdAt: '2018-12-10T20:53:39.966Z'
            _links:
              attachments:
                href: "/api/v3/documents/1/attachments"
              addAttachment:
                href: "/api/v3/documents/1/attachments"
                method: post
              self:
                href: "/api/v3/documents/1"
                title: Some document
              project:
                href: "/api/v3/projects/19"
                title: Some project
          - description:
              format: markdown
              raw: Videlicet deserunt aequitas cognatus. Concedo quia est quia pariatur
                vorago vallum. Calco autem atavus accusamus conscendo cornu ulterius.
                Tam patria ago consectetur ventito sustineo nihil caecus. Supra officiis
                eos velociter somniculosus tonsor qui. Suffragium aduro arguo angustus
                cogito quia tolero vulnus. Supplanto sortitus cresco apud vestrum
                qui.
              html: "<p>Videlicet deserunt aequitas cognatus. Concedo quia est quia
                pariatur vorago vallum. Calco autem atavus accusamus conscendo cornu
                ulterius. Tam patria ago consectetur ventito sustineo nihil caecus.
                Supra officiis eos velociter somniculosus tonsor qui. Suffragium aduro
                arguo angustus cogito quia tolero vulnus. Supplanto sortitus cresco
                apud vestrum qui.</p>"
            _type: Document
            id: 2
            title: Some other document
            createdAt: '2018-12-10T20:55:54.886Z'
            _links:
              attachments:
                href: "/api/v3/documents/2/attachments"
              addAttachment:
                href: "/api/v3/documents/2/attachments"
                method: post
              self:
                href: "/api/v3/documents/2"
                title: Some other document
              project:
                href: "/api/v3/projects/29"
                title: Some other project
        _links:
          self:
            href: "/api/v3/documents?offset=1&pageSize=30"
          jumpTo:
            href: "/api/v3/documents?offset=%7Boffset%7D&pageSize=30"
            templated: true
          changeSize:
            href: "/api/v3/documents?offset=1&pageSize=%7Bsize%7D"
            templated: true
    ErrorResponse:
      type: object
      required:
      - _type
      - errorIdentifier
      - message
      properties:
        _embedded:
          type: object
          properties:
            details:
              type: object
              properties:
                attribute:
                  type: string
                  example: project
        _type:
          type: string
          enum:
          - Error
        errorIdentifier:
          type: string
          example: urn:openproject-org:api:v3:errors:PropertyConstraintViolation
        message:
          type: string
          example: Project can't be blank.
    Example_FormModel:
      type: object
      example:
        _links:
          self:
            href: "/api/v3/example/form"
          validate:
            href: "/api/v3/example/form"
            method: POST
          previewMarkup:
            href: "/api/v3/render/markdown"
            method: POST
          commit:
            href: "/api/v3/example"
            method: PATCH
        _type: Form
        _embedded:
          payload:
            _links:
              status:
                href: "/api/v3/statuses/1"
            _type: Example
            lockVersion: 5
            subject: An example title
          schema:
            _type: Schema
            _links:
              self:
                href: "/api/v3/example/schema"
            lockVersion:
              type: Integer
              writable: false
            subject:
              type: String
              minLength: 1
              maxLength: 255
            status:
              _links:
                allowedValues:
                - href: "/api/v3/statuses/1"
                  title: New
                - href: "/api/v3/statuses/2"
                  title: Closed
              type: Status
              _embedded:
                allowedValues:
                - _links:
                    self:
                      href: "/api/v3/statuses/1"
                  _type: Status
                  id: 1
                  name: New
                  position: 1
                  isDefault: true
                  isClosed: false
                  defaultDoneRatio: 0
                  createdAt: '2014-05-21T08:51:20.759Z'
                  updatedAt: '2014-05-21T09:12:00.237Z'
                - _links:
                    self:
                      href: "/api/v3/statuses/2"
                  _type: Status
                  id: 2
                  name: Closed
                  position: 2
                  isDefault: false
                  isClosed: true
                  defaultDoneRatio: 100
                  createdAt: '2014-05-21T08:51:20.759Z'
                  updatedAt: '2014-05-21T09:12:00.237Z'
          validationErrors:
            subject:
              _type: Error
              errorIdentifier: urn:openproject-org:api:v3:errors:BadExampleError
              message: For the purpose of this example we need a validation error.
                The remainder of the response pretends there were no errors.
    Example_SchemaModel:
      type: object
      example:
        _type: Schema
        _dependencies: []
        _links:
          self:
            href: "/api/v3/example/schema"
        lockVersion:
          name: Resource Version
          type: Integer
          writable: false
        subject:
          name: Subject
          type: String
          minLength: 1
          maxLength: 255
        status:
          _links:
            allowedValues:
            - href: "/api/v3/statuses/1"
              title: New
            - href: "/api/v3/statuses/2"
              title: Closed
          name: Status
          type: Status
          location: _links
          _embedded:
            allowedValues:
            - _links:
                self:
                  href: "/api/v3/statuses/1"
              _type: Status
              id: 1
              name: New
              position: 1
              isDefault: true
              isClosed: false
              defaultDoneRatio: 0
              createdAt: '2014-05-21T08:51:20.991Z'
              updatedAt: '2014-05-21T09:12:00.155Z'
            - _links:
                self:
                  href: "/api/v3/statuses/2"
              _type: Status
              id: 2
              name: Closed
              position: 2
              isDefault: false
              isClosed: true
              defaultDoneRatio: 100
              createdAt: '2014-05-21T08:51:20.991Z'
              updatedAt: '2014-05-21T09:12:00.155Z'
    FileLinkCollectionReadModel:
      allOf:
      - "$ref": "#/components/schemas/PaginatedCollectionModel"
      - type: object
        properties:
          _links:
            type: object
            properties:
              self:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    This file links collection

                    **Resource**: FileLinkCollectionReadModel
          _embedded:
            type: object
            properties:
              elements:
                type: array
                items:
                  "$ref": "#/components/schemas/FileLinkReadModel"
      example:
        _type: Collection
        total: 2
        count: 2
        pageSize: 30
        offset: 1
        _links:
          self:
            href: "/api/v3/work_packages/42/file_links"
          jumpTo:
            href: "/api/v3/work_packages/42/file_links?offset=%7Boffset%7D&pageSize=30"
            templated: true
          changeSize:
            href: "/api/v3/work_packages/42/file_links?offset=1&pageSize=%7Bsize%7D"
            templated: true
        _embedded:
          elements:
          - id: 1337
            _type: FileLink
            createdAt: '2021-12-20T13:37:00.211Z'
            updatedAt: '2021-12-20T13:37:00.211Z'
            originData:
              id: 5503
              name: logo.png
              mimeType: image/png
              size: 16042
              createdAt: '2021-12-19T09:42:10.170Z'
              lastModifiedAt: '2021-12-20T14:00:13.987Z'
              createdByName: Luke Skywalker
              lastModifiedByName: Anakin Skywalker
            _links:
              self:
                href: "/api/v3/work_package/17/file_links/1337"
                title: file link
              storage:
                href: "/api/v3/storage/42"
                title: storage
              container:
                href: "/api/v3/work_package/17"
                title: work package
              creator:
                href: "/api/v3/users/33"
                title: Obi-Wan Kenobi
              delete:
                href: "/api/v3/work_package/17/file_links/1337"
                method: delete
              originOpen:
                href: https://nextcloud.deathstar.rocks/index.php/f?fileid=5503
              staticOriginOpen:
                href: "/api/v3/work_package/17/file_links/1337/open"
          - _hint: File Link resource shortened for brevity
            id: 1338
    FileLinkCollectionWriteModel:
      allOf:
      - "$ref": "#/components/schemas/CollectionModel"
      - type: object
        required:
        - _embedded
        properties:
          _embedded:
            type: object
            required:
            - elements
            properties:
              elements:
                type: array
                items:
                  "$ref": "#/components/schemas/FileLinkWriteModel"
      example:
        _embedded:
          elements:
          - originData:
              id: 5503
              name: logo.png
              mimeType: image/png
              size: 16042
              createdAt: '2021-12-19T09:42:10.170Z'
              lastModifiedAt: '2021-12-20T14:00:13.987Z'
              createdByName: Luke Skywalker
              lastModifiedByName: Anakin Skywalker
            _links:
              storage:
                href: "/api/v3/storage/42"
          - _hint: File Link resource shortened for brevity
            id: 1338
    FileLinkOriginDataModel:
      type: object
      required:
      - id
      - name
      properties:
        id:
          type: string
          description: Linked file's id on the origin
        name:
          type: string
          description: Linked file's name on the origin
        mimeType:
          type: string
          minLength: 0
          description: |-
            MIME type of the linked file.

            To link a folder entity, the custom MIME type `application/x-op-directory` MUST be provided. Otherwise it defaults back to
            an unknown MIME type.
        size:
          type: integer
          minimum: 0
          description: file size on origin in bytes
        createdAt:
          type: string
          format: date-time
          description: Timestamp of the creation datetime of the file on the origin
        lastModifiedAt:
          type: string
          format: date-time
          description: Timestamp of the datetime of the last modification of the file
            on the origin
        createdByName:
          type: string
          description: Display name of the author that created the file on the origin
        lastModifiedByName:
          type: string
          description: Display name of the author that modified the file on the origin
            last
    FileLinkReadModel:
      type: object
      properties:
        id:
          type: integer
          description: File link id
        _type:
          type: string
          enum:
          - FileLink
        createdAt:
          type: string
          format: date-time
          description: Time of creation
        updatedAt:
          type: string
          format: date-time
          description: Time of the most recent change to the file link
        originData:
          "$ref": "#/components/schemas/FileLinkOriginDataModel"
        _embedded:
          type: object
          required:
          - storage
          - container
          properties:
            storage:
              "$ref": "#/components/schemas/StorageReadModel"
            container:
              "$ref": "#/components/schemas/WorkPackageModel"
        _links:
          type: object
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This file link.

                  **Resource**: FileLink
            storage:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The storage resource of the linked file.

                  **Resource**: Storage
            container:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The container the origin file is linked to.

                  Can be one of the following **Resources**:

                  - WorkPackage
            creator:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The creator of the file link.

                  **Resource**: User
            delete:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The uri to delete the file link.

                  **Resource**: N/A
            status:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The urn of the user specific file link status on its storage. Can be one of:

                  - urn:openproject-org:api:v3:file-links:permission:ViewAllowed
                  - urn:openproject-org:api:v3:file-links:permission:ViewNotAllowed
                  - urn:openproject-org:api:v3:file-links:NotFound
                  - urn:openproject-org:api:v3:file-links:Error

                  **Resource**: N/A
            originOpen:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The uri to open the origin file on the origin itself.

                  **Resource**: N/A
            staticOriginOpen:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  A static uri to open the origin file on the storage. Responds with a redirect.

                  **Resource**: N/A
            originOpenLocation:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The uri to open the location of origin file on the origin itself.

                  **Resource**: N/A
            staticOriginOpenLocation:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  A static uri to open the location of the origin file on the storage. Responds with a redirect.

                  **Resource**: N/A
            staticOriginDownload:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  A static uri to generate a new download URL from the storage. Responds with a redirect.

                  **Resource**: N/A
      example:
        id: 1337
        _type: FileLink
        createdAt: '2021-12-20T13:37:00.211Z'
        updatedAt: '2021-12-20T13:37:00.211Z'
        originData:
          id: 5503
          name: logo.png
          mimeType: image/png
          size: 16042
          createdAt: '2021-12-19T09:42:10.170Z'
          lastModifiedAt: '2021-12-20T14:00:13.987Z'
          createdByName: Luke Skywalker
          lastModifiedByName: Anakin Skywalker
        _embedded:
          storage:
            id: 1337
            _type: Storage
            name: It's no moon
            createdAt: '2021-12-20T13:37:00.211Z'
            updatedAt: '2021-12-20T13:37:00.211Z'
            _links:
              self:
                href: "/api/v3/storages/1337"
                title: It's no moon
              type:
                href: urn:openproject-org:api:v3:storages:nextcloud
                title: Nextcloud
              origin:
                href: https://nextcloud.deathstar.rocks/
          container:
            _hint: Work package resource shortened for brevity
            _type: WorkPackage
            id: 1528
            subject: Develop API
        _links:
          self:
            href: "/api/v3/work_package/17/file_links/1337"
          storage:
            href: "/api/v3/storage/42"
            title: It's no moon
          container:
            href: "/api/v3/work_package/17"
            title: Develop API
          creator:
            href: "/api/v3/users/33"
            title: Obi-Wan Kenobi
          delete:
            href: "/api/v3/work_package/17/file_links/1337"
          status:
            href: urn:openproject-org:api:v3:file-links:permission:ViewAllowed
            title: View allowed
          originOpen:
            href: https://nextcloud.deathstar.rocks/index.php/f/5503?openfile=1
          staticOriginOpen:
            href: "/api/v3/file_links/1337/open"
          originOpenLocation:
            href: https://nextcloud.deathstar.rocks/index.php/f/5503?openfile=0
          staticOriginOpenLocation:
            href: "/api/v3/file_links/1337/open?location=true"
          staticOriginDownload:
            href: "/api/v3/file_links/1337/download"
    FileLinkWriteModel:
      type: object
      required:
      - originData
      - _links
      properties:
        originData:
          "$ref": "#/components/schemas/FileLinkOriginDataModel"
        _links:
          oneOf:
          - type: object
            required:
            - storage
            properties:
              storage:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    The storage resource of the linked file.

                    **Resource**: Storage
          - type: object
            required:
            - storageUrl
            properties:
              storageUrl:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    The storage url the file link references to.

                    **Resource**: N/A
      example:
        originData:
          id: 5503
          name: logo.png
          mimeType: image/png
          size: 16042
          createdAt: '2021-12-19T09:42:10.170Z'
          lastModifiedAt: '2021-12-20T14:00:13.987Z'
          createdByName: Luke Skywalker
          lastModifiedByName: Anakin Skywalker
        _links:
          storageUrl:
            href: https://nextcloud.my-deathstar.org
    FileUploadForm:
      type: object
      properties:
        metadata:
          type: object
          properties:
            fileName:
              type: string
        file:
          type: string
          format: binary
    Formattable:
      type: object
      required:
      - format
      properties:
        format:
          type: string
          enum:
          - plain
          - markdown
          - custom
          readOnly: true
          description: Indicates the formatting language of the raw text
          example: markdown
        raw:
          type: string
          description: The raw text, as entered by the user
          example: I **am** formatted!
        html:
          type: string
          readOnly: true
          description: The text converted to HTML according to the format
          example: I <strong>am</strong> formatted!
      example:
        format: markdown
        raw: I am formatted!
        html: I am formatted!
    GridCollectionModel:
      allOf:
      - "$ref": "#/components/schemas/PaginatedCollectionModel"
      - type: object
        required:
        - _embedded
        properties:
          _embedded:
            type: object
            required:
            - elements
            properties:
              elements:
                type: array
                items:
                  "$ref": "#/components/schemas/GridReadModel"
    GridReadModel:
      type: object
      required:
      - _type
      - id
      - rowCount
      - columnCount
      - widgets
      - _links
      properties:
        _type:
          type: string
          enum:
          - Grid
        id:
          type: integer
          description: Grid's id
          minimum: 1
        rowCount:
          type: integer
          description: The number of rows the grid has
          minimum: 1
        columnCount:
          type: integer
          description: The number of columns the grid has
          minimum: 1
        widgets:
          type: array
          description: |-
            The set of `GridWidget`s selected for the grid.

            # Conditions

            - The widgets must not overlap.
          items:
            "$ref": "#/components/schemas/GridWidgetModel"
        createdAt:
          type: string
          format: date-time
          description: The time the grid was created.
        updatedAt:
          type: string
          format: date-time
          description: The time the grid was last updated.
        _links:
          type: object
          required:
          - self
          - scope
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This grid.

                  **Resource**: Grid
            attachments:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The attachment collection of this grid.

                  **Resource**: AttachmentCollection
            addAttachment:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: Link for adding an attachment to this grid.
            scope:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: The location where this grid is used, usually represented
                  as a relative URL.
            updateImmediately:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Directly perform edits on this grid.

                  # Conditions

                  **Permission**: depends on the page the grid is defined for
            update:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Validate edits on the grid via a form resource before committing

                  # Conditions

                  **Permission**: depends on the page the grid is defined for
            delete:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: Deletes this grid resource.
    GridWidgetModel:
      type: object
      required:
      - _type
      - id
      - identifier
      - startRow
      - endRow
      - startColumn
      - endColumn
      properties:
        _type:
          type: string
          enum:
          - GridWidget
        id:
          type:
          - integer
          - 'null'
          description: The grid widget's unique identifier. Can be null, if a new
            widget is created within a grid.
          minimum: 1
        identifier:
          type: string
          description: An alternative, human legible, and unique identifier.
        startRow:
          type: integer
          description: The index of the starting row of the widget. The row is inclusive.
          minimum: 1
        endRow:
          type: integer
          description: The index of the ending row of the widget. The row is exclusive.
          minimum: 1
        startColumn:
          type: integer
          description: The index of the starting column of the widget. The column
            is inclusive.
          minimum: 1
        endColumn:
          type: integer
          description: The index of the ending column of the widget. The column is
            exclusive.
          minimum: 1
        options:
          type: object
    GridWriteModel:
      type: object
      properties:
        rowCount:
          type: integer
          description: The number of rows the grid has
          minimum: 1
        columnCount:
          type: integer
          description: The number of columns the grid has
          minimum: 1
        widgets:
          type: array
          description: |-
            The set of `GridWidget`s selected for the grid.

            # Conditions

            - The widgets must not overlap.
          items:
            "$ref": "#/components/schemas/GridWidgetModel"
        _links:
          type: object
          properties:
            scope:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: The location where this grid is used, usually represented
                  as a relative URL.
    GroupCollectionModel:
      allOf:
      - "$ref": "#/components/schemas/CollectionModel"
      - type: object
        required:
        - _links
        - _embedded
        properties:
          _links:
            type: object
            required:
            - self
            properties:
              self:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    This group collection

                    **Resource**: Collection
          _embedded:
            type: object
            required:
            - elements
            properties:
              elements:
                type: array
                items:
                  "$ref": "#/components/schemas/GroupModel"
      example:
        _type: Collection
        total: 2
        count: 2
        _links:
          self:
            href: "/api/v3/groups"
        _embedded:
          elements:
          - _type: Group
            id: 1337
            name: Stormtroopers
            createdAt: '2022-09-23T11:06:36.300Z'
            updatedAt: '2022-09-23T11:06:36.300Z'
            _links:
              self:
                href: "/api/v3/groups/9"
                title: Stormtroopers
              delete:
                href: "/api/v3/group/9"
                method: delete
              memberships:
                href: /api/v3/memberships?filters=[{"principal":{"operator":"=","values":["9"]}}]
                title: Memberships
              updateImmediately:
                href: "/api/v3/group/9"
                method: patch
              members:
              - href: "/api/v3/users/363"
                title: ST-097E
              - href: "/api/v3/users/60"
                title: ST-C-334
          - _hint: Group resource shortened for brevity
            id: 1338
    GroupModel:
      allOf:
      - "$ref": "#/components/schemas/PrincipalModel"
      - type: object
        required:
        - _type
        - _embedded
        properties:
          _type:
            type: string
            enum:
            - Group
          _embedded:
            type: object
            properties:
              members:
                type: array
                description: Embedded list of members.
                items:
                - "$ref": "#/components/schemas/UserModel"
          _links:
            type: object
            properties:
              members:
                type: array
                items:
                  allOf:
                  - "$ref": "#/components/schemas/Link"
                  - description: |-
                      A member of the group

                      # Conditions:

                      - user has permission `manage_members` in any project

                      **Resource**: User
              delete:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    An href to delete the group.

                    # Conditions:

                    - `admin`
              updateImmediately:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    An href to update the group.

                    # Conditions:

                    - `admin`

                    **Resource**: Group
    GroupWriteModel:
      type: object
      properties:
        name:
          type: string
          description: The new group name.
        _links:
          type: object
          properties:
            members:
              type: array
              items:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    A new member for the group.

                    **Resource**: User
      example:
        name: Emperor's guard
        _links:
          members:
          - href: "/api/v3/users/42"
          - href: "/api/v3/users/43"
          - href: "/api/v3/users/44"
    HelpTextCollectionModel:
      allOf:
      - "$ref": "#/components/schemas/CollectionModel"
      - type: object
        required:
        - _links
        - _embedded
        properties:
          _links:
            type: object
            required:
            - self
            properties:
              self:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    This help text collection

                    **Resource**: HelpTextCollectionModel
          _embedded:
            type: object
            required:
            - elements
            properties:
              elements:
                type: array
                items:
                  "$ref": "#/components/schemas/HelpTextModel"
      example:
        total: 2
        count: 2
        _type: Collection
        _embedded:
          elements:
          - _type: HelpText
            _links:
              self:
                href: "/api/v3/help_texts/1"
            id: 1
            attribute: id
            attributeCaption: ID
            scope: WorkPackage
            helpText:
              format: markdown
              raw: Help text for id attribute.
              html: "<p>Help text for id attribute.</p>"
          - _type: HelpText
            _links:
              self:
                href: "/api/v3/help_texts/2"
            id: 2
            attribute: status
            attributeCaption: Status
            scope: WorkPackage
            helpText:
              format: markdown
              raw: Help text for status attribute.
              html: "<p>Help text for status attribute.</p>"
        _links:
          self:
            href: "/api/v3/help_texts"
    HelpTextModel:
      type: object
      required:
      - _type
      - id
      - attribute
      - scope
      - helpText
      - _links
      properties:
        _type:
          type: string
          enum:
          - HelpText
        id:
          type: integer
          format: int64
          minimum: 1
        attribute:
          type: string
          description: The attribute the help text is assigned to.
        scope:
          type: string
          enum:
          - WorkPackage
          - Project
        helpText:
          "$ref": "#/components/schemas/Formattable"
        _links:
          type: object
          required:
          - self
          - editText
          - attachments
          - addAttachment
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This help text resource.

                  **Resource**: HelpText
            editText:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Edit the help text entry.

                  **Resource**: text/html
            attachments:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The attachment collection of this help text.

                  **Resource**: AttachmentCollection
            addAttachment:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: Add an attachment to the help text.
      example:
        _type: HelpText
        id: 1
        attribute: id
        scope: WorkPackage
        helpText:
          format: markdown
          raw: Help text for id attribute.
          html: "<p>Help text for id attribute.</p>"
        _links:
          self:
            href: "/api/v3/help_texts/1"
          editText:
            href: "/admin/attribute_help_texts/1/edit"
            type: text/html
          attachments:
            href: "/api/v3/help_texts/1/attachments"
          addAttachments:
            href: "/api/v3/help_texts/1/attachments"
            method: post
    HierarchyItemCollectionModel:
      allOf:
      - "$ref": "#/components/schemas/CollectionModel"
      - type: object
        required:
        - _links
        - _embedded
        properties:
          _links:
            type: object
            required:
            - self
            properties:
              self:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    This hierarchy item collection

                    **Resource**: HierarchyItemCollectionModel
          _embedded:
            type: object
            required:
            - elements
            properties:
              elements:
                type: array
                items:
                  "$ref": "#/components/schemas/HierarchyItemReadModel"
    HierarchyItemReadModel:
      type: object
      properties:
        _type:
          type: string
          enum:
          - HierarchyItem
        id:
          type: integer
          description: Hierarchy item identifier
        label:
          type: string
          description: The label of the hierarchy item
        short:
          type: string
          description: The short name of the hierarchy item
        depth:
          type: integer
          description: The hierarchy depth. The root item has a depth of 0.
        _links:
          type: object
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This hierarchy item

                  **Resource**: HierarchyItem
            parent:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The hierarchy item that is the parent of the current hierarchy item

                  **Resource**: HierarchyItem
            children:
              type: array
              items:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    A hierarchy item that is a child of the current hierarchy item

                    **Resource**: HierarchyItem
    Link:
      type: object
      required:
      - href
      properties:
        href:
          type:
          - string
          - 'null'
          description: URL to the referenced resource (might be relative)
        title:
          type: string
          description: Representative label for the resource
        templated:
          type: boolean
          default: false
          description: If true the href contains parts that need to be replaced by
            the client
        method:
          type: string
          default: GET
          description: The HTTP verb to use when requesting the resource
        payload:
          type: object
          description: The payload to send in the request to achieve the desired result
        identifier:
          type: string
          description: An optional unique identifier to the link object
        type:
          type: string
          description: The MIME-Type of the returned resource.
      example:
        href: "/api/v3/work_packages"
        method: POST
    List_actionsModel:
      type: object
      example:
        _links:
          self:
            href: "/api/v3/actions"
        total: 2
        count: 2
        _type: Collection
        _embedded:
          elements:
          - _links:
              self:
                href: "/api/v3/actions/work_packages/create"
                title: Add work package
            _type: Action
            id: work_packages/create
            name: Add work package
            description: Creating a work package within a project including the uploading
              of attachments. Some attributes might not be selected, e.g version which
              requires a second permission
            modules:
            - work_packages
          - _links:
              self:
                href: "/api/v3/actions/work_packages/assign_versions"
                title: Assigning version
            _type: Action
            id: work_packages/assign_versions
            name: Assign version
            description: Assigning a work package to a version when creating/updating
              a work package. Only principals having this permission can assign a
              value to the version property of the work package resource.
            modules:
            - work_packages
            - versions
    List_available_parent_project_candidatesModel:
      allOf:
      - "$ref": "#/components/schemas/CollectionModel"
      - type: object
        required:
        - _links
        - _embedded
        properties:
          _links:
            type: object
            required:
            - self
            properties:
              self:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    The project collection

                    **Resource**: ProjectCollection
                  readOnly: true
          _embedded:
            type: object
            properties:
              elements:
                type: array
                readOnly: true
                items:
                  allOf:
                  - "$ref": "#/components/schemas/ProjectModel"
                  - description: Collection of projects
    List_capabilitiesModel:
      type: object
      example:
        _links:
          self:
            href: "/api/v3/capabilities"
          changeSize:
            href: "/api/v3/capabilities?pageSize={size}"
            templated: true
          jumpTo:
            href: "/api/v3/capabilities?offset={offset}"
            templated: true
        total: 4
        count: 4
        _type: Collection
        _embedded:
          elements:
          - _links:
              self:
                href: "/api/v3/capabilities/work_packages/create/p123-567"
              action:
                href: "/api/v3/actions/work_packages/create"
                title: Add work package
              context:
                href: "/api/v3/projects/123"
                title: A project
              principal:
                href: "/api/v3/users/567"
                title: Some user
            _type: Capability
            id: work_packages/create/p123-567
          - _links:
              self:
                href: "/api/v3/capabilities/work_packages/assignee/p123-567"
              action:
                href: "/api/v3/actions/work_packages/assignee"
              context:
                href: "/api/v3/projects/123"
                title: A project
              principal:
                href: "/api/v3/users/567"
                title: Some user
            _type: Capability
            id: work_packages/assignee/p123-567
          - _links:
              self:
                href: "/api/v3/capabilities/memberships/create/p345-821"
                title: Create members
              action:
                href: "/api/v3/actions/memberships/create"
              context:
                href: "/api/v3/projects/345"
                title: A project
              principal:
                href: "/api/v3/users/821"
                title: Some user
            _type: Capability
            id: memberships/create/p345-821
          - _links:
              self:
                href: "/api/v3/capabilities/users/delete/g-567"
                title: Delete user
              context:
                href: "/api/v3/capabilities/context/global"
                title: Global
              principal:
                href: "/api/v3/users/567"
                title: Some user
            _type: Capability
            id: users/delete/g-567
    List_of_NewsModel:
      type: object
      example:
        _type: Collection
        total: 78
        count: 2
        pageSize: 2
        offset: 1
        _embedded:
          elements:
          - _type: News
            id: 1
            title: asperiores possimus nam doloribus ab
            summary: Celebrer spiculum colo viscus claustrum atque. Id nulla culpa
              sumptus. Comparo crapula depopulo demonstro.
            description:
              format: markdown
              raw: Videlicet deserunt aequitas cognatus. Concedo quia est quia pariatur
                vorago vallum. Calco autem atavus accusamus conscendo cornu ulterius.
                Tam patria ago consectetur ventito sustineo nihil caecus. Supra officiis
                eos velociter somniculosus tonsor qui. Suffragium aduro arguo angustus
                cogito quia tolero vulnus. Supplanto sortitus cresco apud vestrum
                qui.
              html: "<p>Videlicet deserunt aequitas cognatus. Concedo quia est quia
                pariatur vorago vallum. Calco autem atavus accusamus conscendo cornu
                ulterius. Tam patria ago consectetur ventito sustineo nihil caecus.
                Supra officiis eos velociter somniculosus tonsor qui. Suffragium aduro
                arguo angustus cogito quia tolero vulnus. Supplanto sortitus cresco
                apud vestrum qui.</p>"
            createdAt: '2015-03-20T12:57:01.509Z'
            _links:
              self:
                href: "/api/v3/news/1"
                title: asperiores possimus nam doloribus ab
              project:
                href: "/api/v3/projects/1"
                title: Seeded Project
              author:
                href: "/api/v3/users/2"
                title: Peggie Feeney
              updateImmediately:
                href: api/v3/news/1
                method: patch
              delete:
                href: api/v3/news/1
                method: delete
          - _type: News
            id: 2
            title: terminatio tutamen. Officia adeptio sp
            summary: Consequatur sequi surculus creo tui aequitas.
            description:
              format: markdown
              raw: Amicitia alius cattus voluntarius. Virgo viduo terminatio tutamen.
                Officia adeptio spectaculum atavus nisi cum concido bis. Harum caecus
                auxilium sol theatrum eaque consequatur. Omnis aeger suus adipisci
                cicuta. Cur delicate alias curto cursim atqui talio fugiat.
              html: "<p>Amicitia alius cattus voluntarius. Virgo viduo terminatio
                tutamen. Officia adeptio spectaculum atavus nisi cum concido bis.
                Harum caecus auxilium sol theatrum eaque consequatur. Omnis aeger
                suus adipisci cicuta. Cur delicate alias curto cursim atqui talio
                fugiat.</p>"
            createdAt: '2015-03-20T12:57:01.509Z'
            _links:
              self:
                href: "/api/v3/news/2"
                title: terminatio tutamen. Officia adeptio sp
              project:
                href: "/api/v3/projects/1"
                title: Seeded Project
              author:
                href: "/api/v3/users/2"
                title: Peggie Feeney
              updateImmediately:
                href: api/v3/news/2
                method: patch
              delete:
                href: api/v3/news/2
                method: delete
        _links:
          self:
            href: "/api/v3/news?offset=1&pageSize=2"
          jumpTo:
            href: "/api/v3/news?offset=%7Boffset%7D&pageSize=2"
            templated: true
          changeSize:
            href: "/api/v3/news?offset=1&pageSize=%7Bsize%7D"
            templated: true
          nextByOffset:
            href: "/api/v3/news?offset=2&pageSize=2"
    List_projects_by_versionModel:
      type: object
      example:
        _links:
          self:
            href: "/api/v3/versions/2/projects"
        total: 1
        count: 1
        _type: Collection
        _embedded:
          elements:
          - _type: Project
            _links:
              self:
                href: "/api/v3/projects/1"
                title: Lorem
              categories:
                href: "/api/v3/projects/1/categories"
              versions:
                href: "/api/v3/projects/1/versions"
              status:
                href: "/api/v3/project_statuses/on_track"
                title: On track
            id: 1
            identifier: project_identifier
            name: Project example
            description:
              format: markdown
              raw: Lorem **ipsum** dolor sit amet
              html: "<p>Lorem <strong>ipsum</strong> dolor sit amet</p>"
            active: true
            statusExplanation:
              format: markdown
              raw: Everything **fine**
              html: "<p>Everything <strong>fine</strong></p>"
            createdAt: '2014-05-21T08:51:20.142Z'
            updatedAt: '2014-05-21T08:51:20.142Z'
    MeetingModel:
      type: object
      required:
      - title
      properties:
        id:
          type: integer
          description: Identifier of this meeting
          readOnly: true
          exclusiveMinimum: 0
        title:
          type: string
          description: The meeting's title
        _links:
          type: object
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This meeting

                  **Resource**: Meeting
                readOnly: true
            author:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The user having created the meeting

                  **Resource**: User
                readOnly: true
            project:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The project the meeting is in

                  **Resource**: Project
            attachments:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: "The attachment collection of this grid.\n\n**Resource**:
                  AttachmentCollection           "
            addAttachment:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Attach a file to the meeting

                  # Conditions

                  **Permission**: edit meeting
                readOnly: true
      example:
        _type: Meeting
        id: 72
        lockVersion: 5
        title: A meeting
        startTime: '2014-05-21T08:00:00.000Z'
        endTime: '2014-05-21T10:00:00.000Z'
        duration: 120
        createdAt: '2014-05-21T08:51:20.396Z'
        updatedAt: '2014-05-21T09:14:02.776Z'
        _embedded:
          project:
            _type: Project...
            id: 12
          author:
            _type: User...
            id: 2
        _links:
          addAttachment:
            href: "/api/v3/meetings/72/attachments"
            method: post
          attachments:
            href: "/api/v3/meetings/72/attachments"
          project:
            href: "/api/v3/projects/12"
            title: some project
          author:
            href: "/api/v3/users/2"
            title: Peggie Feeney
          self:
            href: "/api/v3/meetings/72"
    MarkdownModel:
      type: string
      format: html
      example: <p>Hello world! <a href="http://example.com">This</a> <strong>is</strong>
        markdown!</p>
    MembershipCollectionModel:
      allOf:
      - "$ref": "#/components/schemas/PaginatedCollectionModel"
      - type: object
        required:
        - _embedded
        properties:
          _embedded:
            type: object
            required:
            - elements
            properties:
              elements:
                type: array
                items:
                  "$ref": "#/components/schemas/MembershipReadModel"
    MembershipFormModel:
      type: object
      required:
      - _type
      - _embedded
      - _links
      properties:
        _type:
          type: string
          enum:
          - Form
        _embedded:
          type: object
          required:
          - payload
          - schema
          - validationError
          properties:
            payload:
              "$ref": "#/components/schemas/MembershipWriteModel"
            schema:
              "$ref": "#/components/schemas/MembershipSchemaModel"
            validationError:
              type: object
              properties:
                base:
                  "$ref": "#/components/schemas/ErrorResponse"
                principal:
                  "$ref": "#/components/schemas/ErrorResponse"
                roles:
                  "$ref": "#/components/schemas/ErrorResponse"
        _links:
          type: object
          required:
          - self
          - validate
          - commit
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This form request.

                  **Resource**: Form
            validate:
              type: array
              items:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: The endpoint to validate the membership payload.
            commit:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The endpoint to create the membership with the same payload, as sent to the form.

                  **Resource**: Membership
    MembershipReadModel:
      type: object
      required:
      - _type
      - id
      - createdAt
      - updatedAt
      - _links
      properties:
        _type:
          type: string
          enum:
          - Membership
        id:
          type: integer
          description: The membership's id
          minimum: 1
        createdAt:
          type: string
          format: date-time
          description: The time the membership was created.
        updatedAt:
          type: string
          format: date-time
          description: The time the membership was last updated.
        _embedded:
          type: object
          properties:
            project:
              "$ref": "#/components/schemas/ProjectModel"
            principal:
              anyOf:
              - "$ref": "#/components/schemas/UserModel"
              - "$ref": "#/components/schemas/GroupModel"
            roles:
              type: array
              items:
                "$ref": "#/components/schemas/RoleModel"
        _links:
          type: object
          required:
          - self
          - schema
          - project
          - principal
          - roles
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This membership.

                  **Resource**: Membership
            schema:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This membership schema.

                  **Resource**: Schema
            update:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The endpoint for updating the membership.

                  # Conditions

                  **Permission**: manage_members
            updateImmediately:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The endpoint for updating the membership without form validation.

                  # Conditions

                  **Permission**: manage_members
            project:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The project the membership is related to.

                  **Resource**: Project
            principal:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The principal the membership is related to.

                  **Resource**: Principal
            roles:
              type: array
              items:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    A role the principal has.

                    **Resource**: Role
    MembershipSchemaModel:
      allOf:
      - "$ref": "#/components/schemas/SchemaModel"
      - type: object
        required:
        - id
        - createdAt
        - updatedAt
        - notificationMessage
        - project
        - principal
        - roles
        properties:
          id:
            "$ref": "#/components/schemas/SchemaPropertyModel"
          createdAt:
            "$ref": "#/components/schemas/SchemaPropertyModel"
          updatedAt:
            "$ref": "#/components/schemas/SchemaPropertyModel"
          notificationMessage:
            "$ref": "#/components/schemas/SchemaPropertyModel"
          project:
            "$ref": "#/components/schemas/SchemaPropertyModel"
          principal:
            "$ref": "#/components/schemas/SchemaPropertyModel"
          roles:
            "$ref": "#/components/schemas/SchemaPropertyModel"
    MembershipWriteModel:
      type: object
      required:
      - _links
      properties:
        _links:
          type: object
          properties:
            principal:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The principal that is to get a membership.

                  **Resource**: Principal
            roles:
              type: array
              items:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    A role the principal has.

                    **Resource**: Role
            project:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The project that is to get a membership. If no project is given, the principal's membership is supposed
                  to be global.

                  **Resource**: Project
        _meta:
          type: object
          properties:
            notificationMessage:
              allOf:
              - "$ref": "#/components/schemas/Formattable"
              - description: A customised notification message, which will overwrite
                  the standard notification.
            sendNotification:
              type: boolean
              description: Set to false, if no notification should get sent.
              default: true
    NewsCreateModel:
      type: object
      properties:
        title:
          type: string
          description: The headline of the news
          readOnly: true
        summary:
          type: string
          description: A short summary
          readOnly: true
        description:
          allOf:
          - "$ref": "#/components/schemas/Formattable"
          - description: The main body of the news with all the details
        _links:
          type: object
          required:
          - project
          properties:
            project:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The project the news is situated in

                  **Resource**: Project
      example:
        title: asperiores possimus nam doloribus ab
        summary: Celebrer spiculum colo viscus claustrum atque. Id nulla culpa sumptus.
          Comparo crapula depopulo demonstro.
        description:
          raw: "**Videlicet deserunt aequitas cognatus**. Concedo quia est quia pariatur
            vorago vallum. Calco autem atavus accusamus conscendo cornu ulterius.
            Tam patria ago consectetur ventito sustineo nihil caecus. Supra officiis
            eos velociter somniculosus tonsor qui. Suffragium aduro arguo angustus
            cogito quia tolero vulnus. Supplanto sortitus cresco apud vestrum qui."
        _links:
          project:
            href: "/api/v3/projects/1"
    NewsModel:
      type: object
      properties:
        id:
          type: integer
          description: News' id
          readOnly: true
          exclusiveMinimum: 0
        title:
          type: string
          description: The headline of the news
          readOnly: true
        summary:
          type: string
          description: A short summary
          readOnly: true
        description:
          type: string
          description: The main body of the news with all the details
          readOnly: true
        createdAt:
          type: string
          format: date-time
          description: The time the news was created at
          readOnly: true
        _links:
          type: object
          required:
          - self
          - project
          - author
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This news

                  **Resource**: News
                readOnly: true
            project:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The project the news is situated in

                  **Resource**: Project
            author:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The user having created the news

                  **Resource**: User
                readOnly: true
            updateImmediately:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Directly perform edits on the news

                  **Permission** manage news
            delete:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Delete the news

                  **Permission** manage news
      example:
        _type: News
        id: 1
        title: asperiores possimus nam doloribus ab
        summary: Celebrer spiculum colo viscus claustrum atque. Id nulla culpa sumptus.
          Comparo crapula depopulo demonstro.
        description:
          format: markdown
          raw: Videlicet deserunt aequitas cognatus. Concedo quia est quia pariatur
            vorago vallum. Calco autem atavus accusamus conscendo cornu ulterius.
            Tam patria ago consectetur ventito sustineo nihil caecus. Supra officiis
            eos velociter somniculosus tonsor qui. Suffragium aduro arguo angustus
            cogito quia tolero vulnus. Supplanto sortitus cresco apud vestrum qui.
          html: "<p>Videlicet deserunt aequitas cognatus. Concedo quia est quia pariatur
            vorago vallum. Calco autem atavus accusamus conscendo cornu ulterius.
            Tam patria ago consectetur ventito sustineo nihil caecus. Supra officiis
            eos velociter somniculosus tonsor qui. Suffragium aduro arguo angustus
            cogito quia tolero vulnus. Supplanto sortitus cresco apud vestrum qui.</p>"
        createdAt: '2015-03-20T12:57:01.908Z'
        _links:
          self:
            href: "/api/v3/news/1"
            title: asperiores possimus nam doloribus ab
          project:
            href: "/api/v3/projects/1"
            title: A project
          author:
            href: "/api/v3/users/2"
            title: Peggie Feeney
          updateImmediately:
            href: api/v3/news/1
            method: patch
          delete:
            href: api/v3/news/1
            method: delete
        _embedded:
          project:
            _type: Project...
          author:
            _type: User...
    NonWorkingDayCollectionModel:
      allOf:
      - "$ref": "#/components/schemas/CollectionModel"
      - type: object
        required:
        - _links
        - _embedded
        properties:
          _links:
            type: object
            required:
            - self
            properties:
              self:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    This non working days collection

                    **Resource**: NonWorkingDayCollectionModel
          _embedded:
            type: object
            required:
            - elements
            properties:
              elements:
                type: array
                description: The array of non working days. Each day has a name and
                  a date.
                items:
                  "$ref": "#/components/schemas/NonWorkingDayModel"
      example:
        _type: Collection
        total: 2
        count: 2
        _links:
          self:
            href: /api/v3/non_working?filters=[{"interval":{"operator":"<>d","values":["2022-04-29","2022-12-24"]}}]
        _embedded:
          elements:
          - _type: NonWorkingDay
            date: '2022-12-24'
            name: Christmas Evening
            _links:
              self:
                href: "/api/v3/days/non_working/2022-04-24"
              weekday:
                href: "/api/v3/days/week/6"
                title: Saturday
          - _type: NonWorkingDay
            date: '2022-05-01'
            name: Labour day
            _links:
              self:
                href: "/api/v3/days/non_working/2022-05-01"
              weekday:
                href: "/api/v3/days/week/7"
                title: Sunday
    NonWorkingDayModel:
      type: object
      required:
      - _type
      - date
      - name
      properties:
        _type:
          type: string
          enum:
          - NonWorkingDay
        date:
          type: string
          format: date
          description: Date of the non-working day.
        name:
          type: string
          description: Descriptive name for the non-working day.
        _links:
          type: object
          required:
          - self
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This non-working day.

                  **Resource**: NonWorkingDay
      example:
        _type: NonWorkingDay
        date: '2022-12-25'
        name: Christmas
        _links:
          self:
            href: "/api/v3/days/non_working/2022-12-25"
            title: Christmas
    NotificationCollectionModel:
      allOf:
      - "$ref": "#/components/schemas/CollectionModel"
      - type: object
        required:
        - _links
        - _embedded
        properties:
          _links:
            type: object
            required:
            - self
            properties:
              self:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    This notification collection

                    **Resource**: NotificationCollectionModel
              jumpTo:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    The notification collection at another offset

                    **Resource**: NotificationCollectionModel
              changeSize:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    The notification collection with another size

                    **Resource**: NotificationCollectionModel
          _embedded:
            type: object
            required:
            - elements
            - detailsSchemas
            properties:
              elements:
                type: array
                items:
                  "$ref": "#/components/schemas/NotificationModel"
              detailsSchemas:
                type: array
                items:
                  "$ref": "#/components/schemas/SchemaModel"
    NotificationModel:
      type: object
      properties:
        _type:
          type: string
          enum:
          - Notification
        id:
          type: integer
          description: Notification id
          minimum: 1
        reason:
          type: string
          description: The reason for the notification
          enum:
          - assigned
          - commented
          - created
          - dateAlert
          - mentioned
          - prioritized
          - processed
          - responsible
          - subscribed
          - scheduled
          - watched
        readIAN:
          type: boolean
          description: Whether the notification is marked as read
        details:
          type: array
          items:
            oneOf:
            - "$ref": "#/components/schemas/ValuesPropertyModel"
          description: A list of objects including detailed information about the
            notification.
        createdAt:
          type: string
          format: date-time
          description: The time the notification was created at
        updatedAt:
          type: string
          format: date-time
          description: The time the notification was last updated
        _embedded:
          type: object
          required:
          - project
          - resource
          properties:
            actor:
              "$ref": "#/components/schemas/UserModel"
            project:
              "$ref": "#/components/schemas/ProjectModel"
            activity:
              "$ref": "#/components/schemas/ActivityModel"
            resource:
              oneOf:
              - "$ref": "#/components/schemas/WorkPackageModel"
        _links:
          type: object
          required:
          - self
          - project
          - actor
          - activity
          - resource
          - details
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This notification

                  **Resource**: Notification
            readIAN:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: Request to mark the notification as read. Only available
                  if the notification is currently unread.
            unreadIAN:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: Request to mark the notification as unread. Only available
                  if the notification is currently read.
            project:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The project the notification originated in

                  **Resource**: Project
            actor:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The user that caused the notification. This might be null in
                  case no user triggered the notification.

                  **Resource**: User
            resource:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The linked resource of the notification, if any.

                  **Resource**: Polymorphic
            activity:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The journal activity, if the notification originated from a journal entry. This might be null in
                  case no activity triggered the notification.

                  **Resource**: Activity
            details:
              type: array
              items:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    A list of objects including detailed information about the notification. The contents of
                    and type of this can vary widely between different notification reasons.

                    **Resource**: Polymorphic (e.g. Values::Property)
    OAuthApplicationReadModel:
      type: object
      required:
      - id
      - _type
      - name
      - clientId
      - confidential
      - _link
      properties:
        id:
          type: integer
          minimum: 1
        _type:
          type: string
          enum:
          - OAuthApplication
        name:
          type: string
          description: The name of the OAuth 2 application
        clientId:
          type: string
          description: OAuth 2 client id
        clientSecret:
          type: string
          description: OAuth 2 client secret. This is only returned when creating
            a new OAuth application.
        confidential:
          type: boolean
          description: true, if OAuth 2 credentials are confidential, false, if no
            secret is stored
        createdAt:
          type: string
          format: date-time
          description: The time the OAuth 2 Application was created at
        updatedAt:
          type: string
          format: date-time
          description: The time the OAuth 2 Application was last updated
        scopes:
          type: array
          description: An array of the scopes of the OAuth 2 Application
          items:
            type: string
        _links:
          type: object
          required:
          - self
          - owner
          - redirectUri
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This OAuth application

                  **Resource**: OAuthApplication
            owner:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The user that created the OAuth application.

                  **Resource**: User
            integration:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The resource that integrates this OAuth application into itself. Currently, only `Storage` resources are
                  able to create and maintain own OAuth application.

                  **Resource**: Storage
            redirectUri:
              type: array
              items:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    A redirect URI of the OAuth application

                    **Resource**: N/A
      example:
        id: 1337
        _type: OAuthApplication
        name: Vader's secure OAuth app
        clientId: O5h6WObhMg1Z8IcLHRE3_LMh4jJYmmca2V6OTFSv8DA
        confidential: true
        createdAt: '2022-12-07T12:56:42.626Z'
        updatedAt: '2022-12-07T12:56:42.626Z'
        scopes:
        - api_v3
        _links:
          self:
            href: "/api/v3/oauth_applications/1337"
          owner:
            href: "/api/v3/users/13"
            title: Darth Vader
          integration:
            href: "/api/v3/storages/42"
            title: Death Star Cloud
          redirectUri:
          - href: https://death-star.cloud.tools/index.php/apps/integration_openproject/oauth-redirect
    OAuthClientCredentialsReadModel:
      type: object
      required:
      - id
      - _type
      - clientId
      - confidential
      - _links
      properties:
        id:
          type: integer
          minimum: 1
        _type:
          type: string
          enum:
          - OAuthClientCredentials
        clientId:
          type: string
          description: OAuth 2 client id
        confidential:
          type: boolean
          description: true, if OAuth 2 credentials are confidential, false, if no
            secret is stored
        createdAt:
          type: string
          format: date-time
          description: The time the OAuth client credentials were created at
        updatedAt:
          type: string
          format: date-time
          description: The time the OAuth client credentials were last updated
        _links:
          type: object
          required:
          - self
          - integration
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This OAuth Client Credentials object

                  **Resource**: OAuthClientCredentials
            integration:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The resource that integrates this OAuth client credentials. Currently, only `Storage` resources are
                  able to contain OAuth client credentials.

                  **Resource**: Storage
      example:
        id: 1337
        _type: OAuthClientCredentials
        clientId: O5h6WObhMg1Z8IcLHRE3_LMh4jJYmmca2V6OTFSv8DA
        confidential: true
        createdAt: '2022-12-07T12:56:42.836Z'
        updatedAt: '2022-12-07T12:56:42.836Z'
        _link:
          self:
            href: "/api/v3/oauth_client_credentials/1337"
          integration:
            href: "/api/v3/storages/42"
            title: Death Star Cloud
    OAuthClientCredentialsWriteModel:
      type: object
      required:
      - clientId
      - clientSecret
      properties:
        clientId:
          type: string
          description: OAuth 2 client id
        clientSecret:
          type: string
          description: OAuth 2 client secret
      example:
        clientId: O5h6WObhMg1Z8IcLHRE3_LMh4jJYmmca2V6OTFSv8DA
        clientSecret: LSk52mn4jmtSYTgH0NzDj-u2z5LMpT8bsS0BouwJQQw
    OffsetPaginatedCollectionLinks:
      allOf:
      - "$ref": "#/components/schemas/CollectionLinks"
      - type: object
        required:
        - jumpTo
        - changeSize
        properties:
          jumpTo:
            allOf:
            - "$ref": "#/components/schemas/Link"
            - description: A templated link to jump to a given offset.
          changeSize:
            allOf:
            - "$ref": "#/components/schemas/Link"
            - description: A templated link to change the current page size.
          previousByOffset:
            allOf:
            - "$ref": "#/components/schemas/Link"
            - description: |-
                A link to the previous page of the collection.

                # Conditions
                - The collection is not on the first page.
          nextByOffset:
            allOf:
            - "$ref": "#/components/schemas/Link"
            - description: |-
                A link to the next page of the collection.

                # Conditions
                - The collection is not on the last page.
    OffsetPaginatedCollectionModel:
      allOf:
      - "$ref": "#/components/schemas/CollectionModel"
      - type: object
        required:
        - pageSize
        - offset
        - _links
        properties:
          pageSize:
            type: integer
            description: |-
              The amount of elements per page. If not set by the request this value defaults to the server's system
              settings.
            minimum: 0
          offset:
            type: integer
            description: The page offset indicating on which page the element collection
              starts.
            minimum: 0
          _links:
            "$ref": "#/components/schemas/OffsetPaginatedCollectionLinks"
    PaginatedCollectionModel:
      allOf:
      - "$ref": "#/components/schemas/CollectionModel"
      - type: object
        required:
        - pageSize
        - offset
        properties:
          pageSize:
            type: integer
            description: Amount of elements that a response will hold.
            minimum: 0
          offset:
            type: integer
            description: The page number that is requested from paginated collection.
            minimum: 1
          _links:
            type: object
            required:
            - jumpTo
            - changeSize
            properties:
              jumpTo:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    Templated link to another page offset.

                    **Resource**: Collection
              changeSize:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    Templated link for another page size.

                    **Resource**: Collection
    PlaceholderUserCollectionModel:
      allOf:
      - "$ref": "#/components/schemas/CollectionModel"
      - type: object
        required:
        - _links
        - _embedded
        properties:
          _links:
            type: object
            required:
            - self
            properties:
              self:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    This placeholder user collection

                    **Resource**: Collection
          _embedded:
            type: object
            required:
            - elements
            properties:
              elements:
                type: array
                items:
                  "$ref": "#/components/schemas/PlaceholderUserModel"
      example:
        _type: Collection
        total: 2
        count: 2
        _links:
          self:
            href: "/api/v3/placeholder_users"
        _embedded:
          elements:
          - _hint: PlaceholderUser resource shortened for brevity
            _type: PlaceholderUser
            id: 1337
          - _hint: PlaceholderUser resource shortened for brevity
            _type: PlaceholderUser
            id: 1338
    PlaceholderUserCreateModel:
      type: object
      properties:
        name:
          type: string
          description: The new name of the placeholder user to be created.
    PlaceholderUserModel:
      allOf:
      - "$ref": "#/components/schemas/PrincipalModel"
      - type: object
        required:
        - _type
        properties:
          _type:
            type: string
            enum:
            - PlaceholderUser
          status:
            type: string
            description: |-
              The current activation status of the placeholder user.

              # Conditions

              - User has `manage_placeholder_user` permission globally
          _links:
            type: object
            required:
            - showUser
            properties:
              showUser:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: A relative path to show the placeholder user in the
                    web application.
              delete:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    An href to delete the placeholder user.

                    # Conditions:

                    - `manage_placeholder_user`
              updateImmediately:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    An href to update the placeholder user.

                    # Conditions:

                    - `manage_placeholder_user`

                    **Resource**: PlaceholderUser
    Plain_TextModel:
      type: string
      format: html
      example: "<p>Hello world! This *is* plain text!</p>"
    PostModel:
      type: object
      required:
      - subject
      properties:
        id:
          type: integer
          description: Identifier of this post
          readOnly: true
          exclusiveMinimum: 0
        subject:
          type: string
          description: The post's subject
        _links:
          type: object
          properties:
            addAttachment:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Attach a file to the post

                  # Conditions

                  **Permission**: edit messages
                readOnly: true
      example:
        _type: Post
        id: 1
        subject: A post with a subject
        _embedded:
          project:
            _type: Project...
        _links:
          self:
            href: "/api/v3/posts/1"
          attachments:
            href: "/api/v3/posts/1/attachments"
          addAttachment:
            href: "/api/v3/posts/1/attachments"
            method: post
          project:
            href: "/api/v3/projects/1"
            title: A project with a title
    PrincipalCollectionModel:
      allOf:
      - "$ref": "#/components/schemas/OffsetPaginatedCollectionModel"
      - type: object
        required:
        - _embedded
        properties:
          _embedded:
            type: object
            required:
            - elements
            properties:
              elements:
                type: array
                items:
                  anyOf:
                  - "$ref": "#/components/schemas/UserModel"
                  - "$ref": "#/components/schemas/PlaceholderUserModel"
                  - "$ref": "#/components/schemas/GroupModel"
      example:
        _type: Collection
        total: 3
        count: 3
        _links:
          self:
            href: "/api/v3/principals"
        _embedded:
          elements:
          - _hint: User resource shortened for brevity
            _type: User
            id: 1337
          - _hint: Group resource shortened for brevity
            _type: Group
            id: 1338
          - _hint: PlaceholderUser resource shortened for brevity
            _type: PlaceholderUser
            id: 1339
    PrincipalModel:
      type: object
      required:
      - _type
      - id
      - name
      - _links
      properties:
        _type:
          type: string
          enum:
          - User
          - Group
          - PlaceholderUser
        id:
          type: integer
          description: The principal's unique identifier.
          minimum: 1
        name:
          type: string
          description: The principal's display name, layout depends on instance settings.
        createdAt:
          type: string
          format: date-time
          description: Time of creation
        updatedAt:
          type: string
          format: date-time
          description: Time of the most recent change to the principal
        _links:
          type: object
          required:
          - self
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This principal resource.

                  **Resource**: User|Group|PlaceholderUser
            memberships:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  An href to the collection of the principal's memberships.

                  # Conditions:

                  - user has permission `view_members` or `manage_members` in any project

                  **Resource**: Collection
    PriorityCollectionModel:
      allOf:
      - "$ref": "#/components/schemas/CollectionModel"
      - type: object
        required:
        - _links
        - _embedded
        properties:
          _links:
            type: object
            required:
            - self
            properties:
              self:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - properties:
                    self:
                      allOf:
                      - "$ref": "#/components/schemas/Link"
                      - description: |-
                          This priority collection

                          **Resource**: PriorityCollectionModel
                readOnly: true
          _embedded:
            type: object
            required:
            - elements
            properties:
              elements:
                type: array
                items:
                  "$ref": "#/components/schemas/PriorityModel"
    PriorityModel:
      type: object
      properties:
        id:
          type: integer
          description: Priority id
          readOnly: true
          exclusiveMinimum: 0
        name:
          type: string
          description: Priority name
          readOnly: true
          minLength: 1
        position:
          type: integer
          description: Sort index of the priority
          readOnly: true
          exclusiveMinimum: 0
        isDefault:
          type: boolean
          description: Indicates whether this is the default value
          readOnly: true
        isActive:
          type: boolean
          description: Indicates whether the priority is available
        _links:
          type: object
          required:
          - self
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This priority

                  **Resource**: Priority
                readOnly: true
      example:
        _type: Priority
        _links:
          self:
            href: "/api/v3/priorities/1"
            title: Low
        id: 1
        name: Low
        position: 1
        isDefault: false
        isActive: true
    ProjectCollectionModel:
      allOf:
      - "$ref": "#/components/schemas/OffsetPaginatedCollectionModel"
      - type: object
        required:
        - _links
        - _embedded
        properties:
          _links:
            allOf:
            - "$ref": "#/components/schemas/OffsetPaginatedCollectionLinks"
            - type: object
              properties:
                representations:
                  type: array
                  items:
                    allOf:
                    - "$ref": "#/components/schemas/Link"
                    - description: A project collection representation in a specific
                        file format.
          _embedded:
            type: object
            required:
            - elements
            properties:
              elements:
                type: array
                items:
                  "$ref": "#/components/schemas/ProjectModel"
    ProjectModel:
      type: object
      properties:
        _type:
          type: string
          enum:
          - Project
        id:
          type: integer
          description: Projects' id
          minimum: 1
        identifier:
          type: string
        name:
          type: string
        active:
          type: boolean
          description: Indicates whether the project is currently active or already
            archived
        statusExplanation:
          allOf:
          - "$ref": "#/components/schemas/Formattable"
          - description: A text detailing and explaining why the project has the reported
              status
        public:
          type: boolean
          description: Indicates whether the project is accessible for everybody
        description:
          "$ref": "#/components/schemas/Formattable"
        createdAt:
          type: string
          format: date-time
          description: Time of creation. Can be writable by admins with the `apiv3_write_readonly_attributes`
            setting enabled.
        updatedAt:
          type: string
          format: date-time
          description: Time of the most recent change to the project
        _links:
          type: object
          required:
          - self
          - categories
          - types
          - versions
          - memberships
          - workPackages
          properties:
            update:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Form endpoint that aids in updating this project

                  # Conditions

                  **Permission**: edit project
            updateImmediately:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Directly update this project

                  # Conditions

                  **Permission**: edit project
            delete:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Delete this project

                  # Conditions

                  **Permission**: admin
            createWorkPackage:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Form endpoint that aids in preparing and creating a work package

                  # Conditions

                  **Permission**: add work packages
            createWorkPackageImmediately:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Directly creates a work package in the project

                  # Conditions

                  **Permission**: add work packages
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This project

                  **Resource**: Project
            categories:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Categories available in this project

                  **Resource**: Collection
            types:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Types available in this project

                  **Resource**: Collection

                  # Conditions

                  **Permission**: view work packages or manage types
            versions:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Versions available in this project

                  **Resource**: Collection

                  # Conditions

                  **Permission**: view work packages or manage versions
            memberships:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Memberships in the  project

                  **Resource**: Collection

                  # Conditions

                  **Permission**: view members
            workPackages:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Work Packages of this project

                  **Resource**: Collection
            parent:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Parent project of the project

                  **Resource**: Project

                  # Conditions

                  **Permission** edit project
            status:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Denotes the status of the project, so whether the project is on track, at risk or is having trouble.

                  **Resource**: ProjectStatus

                  # Conditions

                  **Permission** edit project
            storages:
              type: array
              items:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    The link to a storage that is active for this project.

                    **Resource**: Storage

                    # Conditions

                    **Permission**: view_file_links
            projectStorages:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The project storage collection of this project.

                  **Resource**: Collection

                  # Conditions

                  **Permission**: view_file_links
            ancestors:
              type: array
              items:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    The link to an ancestor project.

                    **Resource**: Project
    ProjectPhaseModel:
      type: object
      required:
      - _type
      - id
      - name
      - active
      - createdAt
      - updatedAt
      properties:
        _type:
          type: string
          enum:
          - ProjectPhase
        id:
          type: integer
          description: The project phase's id
          minimum: 1
        name:
          type: string
        active:
          type: boolean
        createdAt:
          type: string
          format: date-time
          description: Time of creation
        updatedAt:
          type: string
          format: date-time
          description: Time of the most recent change to the project phase
        _links:
          type: object
          required:
          - self
          - definition
          - project
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This project phase.

                  **Resource**: ProjectPhase
            definition:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The definition this phase relies on.

                  **Resource**: ProjectPhaseDefinition
            project:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The project resource, that is the container of this phase.

                  **Resource**: Project
      example:
        _type: ProjectPhase
        id: 1337
        title: Initiating
        active: true
        createdAt: '2023-01-20T14:30:00.368Z'
        updatedAt: '2023-05-23T11:57:48.618Z'
        _links:
          self:
            href: "/api/v3/project_phases/23"
          definition:
            title: Initiating
            href: "/api/v3/project_definitions/11"
          project:
            title: Death Star 3.0
            href: "/api/v3/projects/11"
    ProjectPhaseDefinitionModel:
      type: object
      required:
      - _type
      - id
      - name
      - startGate
      - finishGate
      - createdAt
      - updatedAt
      properties:
        _type:
          type: string
          enum:
          - ProjectPhaseDefinition
        id:
          type: integer
          description: The project phase definition's id
          minimum: 1
        name:
          type: string
        startGate:
          type: boolean
        startGateName:
          type: string
        finishGate:
          type: boolean
        finishGateName:
          type: string
        createdAt:
          type: string
          format: date-time
          description: Time of creation
        updatedAt:
          type: string
          format: date-time
          description: Time of the most recent change to the project phase definition
        _links:
          type: object
          required:
          - self
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This project phase definition.

                  **Resource**: ProjectPhaseDefinition
      example:
        _type: ProjectPhaseDefinition
        id: 1337
        title: Initiating
        startGate: true
        startGateName: Before Initiating
        finishGate: true
        finishGateName:
        createdAt: '2023-01-20T14:30:00.368Z'
        updatedAt: '2023-05-23T11:57:48.618Z'
        _links:
          self:
            href: "/api/v3/project_phase_definitions/23"
    ProjectPhaseDefinitionCollectionModel:
      allOf:
      - "$ref": "#/components/schemas/OffsetPaginatedCollectionModel"
      - type: object
        required:
        - _links
        - _embedded
        properties:
          _links:
            type: object
            required:
            - self
            properties:
              self:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    This file links collection

                    **Resource**: ProjectPhaseDefinitionCollectionModel
          _embedded:
            type: object
            required:
            - elements
            properties:
              elements:
                type: array
                items:
                  "$ref": "#/components/schemas/ProjectPhaseDefinitionModel"
      example:
        _type: Collection
        total: 2
        count: 2
        _links:
          self:
            href: "/api/v3/project_phase_definitions"
        _embedded:
          elements:
          - id: 14
            name: Initiating
            _type: ProjectPhaseDefinition
            _hint: project phase definition resource shortened for brevity
          - id: 15
            name: Executing
            _type: ProjectPhaseDefinition
            _hint: project phase definition resource shortened for brevity
    ProjectStorageCollectionModel:
      allOf:
      - "$ref": "#/components/schemas/CollectionModel"
      - type: object
        required:
        - _links
        - _embedded
        properties:
          _links:
            type: object
            required:
            - self
            properties:
              self:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    This file links collection

                    **Resource**: ProjectStorageCollectionModel
          _embedded:
            type: object
            required:
            - elements
            properties:
              elements:
                type: array
                items:
                  "$ref": "#/components/schemas/ProjectStorageModel"
      example:
        _type: Collection
        total: 2
        count: 2
        _links:
          self:
            href: "/api/v3/project_storages?filters=%5B%7B%22storage%22%3A%7B%22operator%22%3A%22%3D%22%2C%22values%22%3A%5B%2281%22%5D%7D%7D%5D"
        _embedded:
          elements:
          - id: 1337
            _type: ProjectStorage
            _hint: project storage resource shortened for brevity
          - id: 1338
            _type: ProjectStorage
            _hint: File Link resource shortened for brevity
    ProjectStorageModel:
      type: object
      required:
      - _type
      - id
      - projectFolderMode
      - createdAt
      - updatedAt
      properties:
        _type:
          type: string
          enum:
          - ProjectStorage
        id:
          type: integer
          description: The project storage's id
          minimum: 1
        projectFolderMode:
          type: string
          enum:
          - inactive
          - manual
        createdAt:
          type: string
          format: date-time
          description: Time of creation
        updatedAt:
          type: string
          format: date-time
          description: Time of the most recent change to the project storage
        _links:
          type: object
          required:
          - self
          - creator
          - storage
          - project
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This project storage.

                  **Resource**: ProjectStorage
            creator:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The user who created the project storage.

                  **Resource**: User
            storage:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The storage resource, that is linked to a project with this project storage.

                  **Resource**: Storage
            project:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The project resource, that is linked to a storage with this project storage.

                  **Resource**: Project
            projectFolder:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The directory on the storage that is used as a project folder.

                  **Resource**: StorageFile

                  # Conditions

                  Only provided, if the `projectFolderMode` is `manual` or `automatic`.
            open:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  A link to OpenProject strorage.

                  # Conditions

                  If the storage has not been configured(oauth client is missing, for instance), then the link is null.
            openWithConnectionEnsured:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  A link to OpenProject storage with making sure user has access to it.

                  **Deprecated:** Use `open` instead, which returns a link that will ensure the user's connection to the storage
                  as well, but properly works for all kinds of storage configurations.
      example:
        _type: ProjectStorage
        id: 1337
        projectFolderMode: manual
        createdAt: '2023-01-20T14:30:00.368Z'
        updatedAt: '2023-05-23T11:57:48.618Z'
        _links:
          self:
            href: "/api/v3/project_storages/23"
          projectFolder:
            href: "/api/v3/storages/81/files/30"
          creator:
            title: Darth Vader
            href: "/api/v3/users/3"
          project:
            title: Death Star 3.0
            href: "/api/v3/projects/11"
          storage:
            title: Palpatine's Data Vault
            href: "/api/v3/storages/81"
          open:
            href: "/api/v3/storages/81/open"
          openWithConnectionEnsured:
            href: "/api/v3/storages/81/open"
    Projects_schemaModel:
      type: object
      example:
        _type: Schema
        _dependencies: []
        id:
          type: Integer
          name: ID
          required: true
          hasDefault: false
          writable: false
        name:
          type: String
          name: Name
          required: true
          hasDefault: false
          writable: true
          minLength: 1
          maxLength: 255
        identifier:
          type: String
          name: Identifier
          required: true
          hasDefault: false
          writable: true
          minLength: 1
          maxLength: 100
        description:
          type: Formattable
          name: Description
          required: false
          hasDefault: false
          writable: true
        public:
          type: Boolean
          name: Public
          required: true
          hasDefault: false
          writable: true
        active:
          type: Boolean
          name: Active
          required: true
          hasDefault: true
          writable: true
        status:
          type: ProjectStatus
          name: Status
          required: false
          hasDefault: true
          writable: true
          _links:
            allowedValues:
            - href: "/api/v3/project_statuses/on_track"
              title: On track
            - href: "/api/v3/project_statuses/at_risk"
              title: At risk
            - href: "/api/v3/project_statuses/off_track"
              title: Off track
            - href: "/api/v3/project_statuses/on_pause"
              title: On pause
        statusExplanation:
          type: Formattable
          name: Status explanation
          required: false
          hasDefault: false
          writable: true
        parent:
          type: Project
          name: Subproject of
          required: false
          hasDefault: false
          writable: true
          location: _links
          visibility: default
          _links: {}
        createdAt:
          type: DateTime
          name: Created on
          required: true
          hasDefault: false
          writable: false
        updatedAt:
          type: DateTime
          name: Updated on
          required: true
          hasDefault: false
          writable: false
        customField30:
          type: Integer
          name: Integer project custom field
          required: false
          hasDefault: false
          writable: true
          visibility: default
        customField31:
          type: CustomOption
          name: List project custom field
          required: false
          hasDefault: false
          writable: true
          location: _links
          visibility: default
          _links: {}
        customField32:
          type: Version
          name: Version project custom field
          required: false
          hasDefault: false
          writable: true
          location: _links
          visibility: default
          _links: {}
        customField34:
          type: Boolean
          name: Boolean project custom field
          required: false
          hasDefault: false
          writable: true
          visibility: default
        customField35:
          type: String
          name: Text project custom field
          required: true
          hasDefault: false
          writable: true
          visibility: default
        _links:
          self:
            href: "/api/v3/projects/schema"
    QueriesModel:
      type: object
      example:
        _links:
          self:
            href: "/api/v3/queries"
        total: 1
        count: 1
        _type: Collection
        _embedded:
          elements:
          - _type: Query
            id: 9
            name: fdsfdsfdsf
            createdAt: '2015-03-20T12:56:56.858Z'
            updatedAt: '2015-05-20T18:16:53.887Z'
            filters:
            - _type: StatusQueryFilter
              name: Status
              _links:
                filter:
                  href: "/api/v3/queries/filters/status"
                  title: Status
                operator:
                  href: "/api/v3/queries/operators/o"
                  title: open
                schema:
                  href: "/api/v3/queries/filter_instance_schemas/status"
                values: []
            - _type: DueDateQueryFilter
              name: Finish date
              values:
              - '1'
              _links:
                filter:
                  href: "/api/v3/queries/filters/dueDate"
                  title: Finish date
                operator:
                  href: "/api/v3/queries/operators/<t+"
                  title: in less than
                schema:
                  href: "/api/v3/queries/filter_instance_schemas/dueDate"
            public: false
            sums: false
            starred: true
            projections:
            - _type: Query::TableProjection
            - _type: Query::TeamPlannerProjection
              _links:
                rows:
                - href: "/api/v3/users/1"
                  title: Bob Bobbit
            - _type: Query::CalendarProjection
            _embedded:
              results:
                _type: WorkPackageCollection
                total: 234
                count: 30
                pageSize: 30
                offset: 1
                _embedded:
                  elements:
                  - "<--- shortened for brevity --->"
                _links:
                  self:
                    href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
                  jumpTo:
                    href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=%7Boffset%7D&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
                    templated: true
                  changeSize:
                    href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=%7Bsize%7D&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
                    templated: true
                  createWorkPackage:
                    href: "/api/v3/work_packages/form"
                    method: post
                  createWorkPackageImmediate:
                    href: "/api/v3/work_packages"
                    method: post
            _links:
              self:
                href: "/api/v3/queries/9"
                title: fdsfdsfdsf
              results:
                href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
              columns:
              - href: "/api/v3/queries/columns/id"
                title: ID
              - href: "/api/v3/queries/columns/subject"
                title: Subject
              - href: "/api/v3/queries/columns/type"
                title: Type
              - href: "/api/v3/queries/columns/status"
                title: Status
              - href: "/api/v3/queries/columns/priority"
                title: Priority
              - href: "/api/v3/queries/columns/assignee"
                title: Assignee
              - href: "/api/v3/queries/columns/updated_at"
                title: Updated on
              groupBy:
                href:
                title:
              sortBy:
              - href: "/api/v3/queries/sort_bys/parent-desc"
                title: Parent (Descending)
              user:
                href: "/api/v3/users/1"
                title: OpenProject Admin
              project:
                href: "/api/v3/projects/3"
                title: copy
    QueryModel:
      type: object
      required:
      - createdAt
      - updatedAt
      properties:
        id:
          type: integer
          description: Query id
          readOnly: true
          exclusiveMinimum: 0
        name:
          type: string
          description: Query name
          readOnly: true
        filters:
          type: array
          description: A set of QueryFilters which will be applied to the work packages
            to determine the resulting work packages
          readOnly: false
          items:
            "$ref": "#/components/schemas/Query_Filter_Instance_SchemaModel"
        sums:
          type: boolean
          description: Should sums (of supported properties) be shown?
          readOnly: true
        timelineVisible:
          type: boolean
          description: Should the timeline mode be shown?
          readOnly: true
          deprecated: true
        timelineLabels:
          type: array
          description: Which labels are shown in the timeline, empty when default
          readOnly: true
          deprecated: true
          items:
            type: string
        timelineZoomLevel:
          type: string
          description: Which zoom level should the timeline be rendered in?
          readOnly: true
          deprecated: true
        timestamps:
          type: array
          description: Timestamps to filter by when showing changed attributes on
            work packages.
          readOnly: false
        highlightingMode:
          type: string
          description: Which highlighting mode should the table have?
          readOnly: true
          deprecated: true
        showHierarchies:
          type: boolean
          description: Should the hierarchy mode be enabled?
          readOnly: true
          deprecated: true
        hidden:
          type: boolean
          description: Should the query be hidden from the query list?
          readOnly: true
          deprecated: true
        public:
          type: boolean
          description: Can users besides the owner see the query?
          readOnly: true
        starred:
          type: boolean
          description: Should the query be highlighted to the user?
          readOnly: true
        createdAt:
          type: string
          format: date-time
          description: Time of creation
          readOnly: true
        updatedAt:
          type: string
          format: date-time
          description: Time of the most recent change to the query
          readOnly: true
        _links:
          type: object
          properties:
            star:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Elevates the query to the status of 'starred'

                  # Conditions

                  **Permission**: save queries for own queries, manage public queries for public queries; Only present if query is not yet starred
                readOnly: true
            unstar:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Removes the 'starred' status

                  # Conditions

                  **Permission**: save queries for own queries, manage public queries for public queries; Only present if query is starred
                readOnly: true
            update:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Use the Form based process to verify the query before persisting

                  # Conditions

                  **Permission**: view work packages
                readOnly: true
            updateImmediately:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Persist the query without using a Form based process for guidance

                  # Conditions

                  **Permission**: save queries for own queries, manage public queries for public queries;
                readOnly: true
    Query_ColumnModel:
      type: object
      required:
      - id
      - name
      properties:
        id:
          type: string
          description: Query column id
          readOnly: true
        name:
          type: string
          description: Query column name
      example:
        _type: QueryColumn::Property
        id: priority
        name: Priority
        _links:
          self:
            href: "/api/v3/queries/columns/priority"
            title: Priority
    Query_Create_Form:
      type: object
      properties:
        name:
          type: string
          description: Query name.
      example:
        name: New query name
    Query_FilterModel:
      type: object
      required:
      - id
      properties:
        id:
          type: string
          description: QueryFilter id
      example:
        _type: QueryFilter
        id: status
        _links:
          self:
            href: "/api/v3/queries/filters/status"
            title: Status
    Query_Filter_Instance_SchemaModel:
      type: object
      required:
      - name
      - filter
      properties:
        name:
          type: string
          description: Describes the name attribute
          readOnly: true
        filter:
          type: string
          description: QuerySortBy name
        _links:
          type: object
          required:
          - self
          - filter
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This QueryFilterInstanceSchema (same as for schema)

                  **Resource**: QueryFilterInstanceSchema
                readOnly: true
            filter:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The filter for which this schema is specific

                  **Resource**: Filter
                readOnly: true
      example:
        _type: QueryFilterInstanceSchema
        _dependencies:
        - _type: SchemaDependency
          'on': operator
          dependencies:
            "/api/v3/queries/operators/=":
              values:
                type: "[]User"
                name: Values
                required: true
                hasDefault: false
                writable: true
                _links: {}
            "/api/v3/queries/operators/!":
              values:
                type: "[]User"
                name: Values
                required: true
                hasDefault: false
                writable: true
                _links: {}
        name:
          type: String
          name: Name
          required: true
          hasDefault: true
          writable: false
        filter:
          type: QueryFilter
          name: Filter
          required: true
          hasDefault: false
          writable: true
          _links: {}
        _links:
          self:
            href: "/api/v3/queries/filter_instance_schemas/author"
          filter:
            href: "/api/v3/queries/filters/author"
            title: Author
    Query_Filter_Instance_SchemasModel:
      type: object
      example:
        _type: Collection
        total: 2
        count: 2
        _embedded:
          elements:
          - _type: QueryFilterInstanceSchema
            _dependencies:
            - _type: SchemaDependency
              'on': operator
              dependencies:
                "/api/v3/queries/operators/=":
                  values:
                    type: "[]User"
                    name: Values
                    required: true
                    hasDefault: false
                    writable: true
                    _links: {}
                "/api/v3/queries/operators/!":
                  values:
                    type: "[]User"
                    name: Values
                    required: true
                    hasDefault: false
                    writable: true
                    _links: {}
                "/api/v3/queries/operators/!*": {}
                "/api/v3/queries/operators/*": {}
            name:
              type: String
              name: Name
              required: true
              hasDefault: true
              writable: false
            filter:
              type: QueryFilter
              name: Filter
              required: true
              hasDefault: false
              writable: true
              _links: {}
            _links:
              self:
                href: "/api/v3/queries/filter_instance_schemas/assignee"
              filter:
                href: "/api/v3/queries/filters/assignee"
                title: Assignee
          - _type: QueryFilterInstanceSchema
            _dependencies:
            - _type: SchemaDependency
              'on': operator
              dependencies:
                "/api/v3/queries/operators/=":
                  values:
                    type: "[]User"
                    name: Values
                    required: true
                    hasDefault: false
                    writable: true
                    _links: {}
                "/api/v3/queries/operators/!":
                  values:
                    type: "[]User"
                    name: Values
                    required: true
                    hasDefault: false
                    writable: true
                    _links: {}
            name:
              type: String
              name: Name
              required: true
              hasDefault: true
              writable: false
            filter:
              type: QueryFilter
              name: Filter
              required: true
              hasDefault: false
              writable: true
              _links: {}
            _links:
              self:
                href: "/api/v3/queries/filter_instance_schemas/author"
              filter:
                href: "/api/v3/queries/filters/author"
                title: Author
        _links:
          self:
            href: "/api/v3/queries/filter_instance_schemas"
    Query_Filter_Instance_Schemas_For_ProjectModel:
      type: object
      example:
        _type: Collection
        total: 2
        count: 2
        _embedded:
          elements:
          - _type: QueryFilterInstanceSchema
            _dependencies:
            - _type: SchemaDependency
              'on': operator
              dependencies:
                "/api/v3/queries/operators/=":
                  values:
                    type: "[]User"
                    name: Values
                    required: true
                    hasDefault: false
                    writable: true
                    _links: {}
                "/api/v3/queries/operators/!":
                  values:
                    type: "[]User"
                    name: Values
                    required: true
                    hasDefault: false
                    writable: true
                    _links: {}
                "/api/v3/queries/operators/!*": {}
                "/api/v3/queries/operators/*": {}
            name:
              type: String
              name: Name
              required: true
              hasDefault: true
              writable: false
            filter:
              type: QueryFilter
              name: Filter
              required: true
              hasDefault: false
              writable: true
              _links: {}
            _links:
              self:
                href: "/api/v3/queries/filter_instance_schemas/assignee"
              filter:
                href: "/api/v3/queries/filters/assignee"
                title: Assignee
          - _type: QueryFilterInstanceSchema
            _dependencies:
            - _type: SchemaDependency
              'on': operator
              dependencies:
                "/api/v3/queries/operators/=":
                  values:
                    type: "[]User"
                    name: Values
                    required: true
                    hasDefault: false
                    writable: true
                    _links: {}
                "/api/v3/queries/operators/!":
                  values:
                    type: "[]User"
                    name: Values
                    required: true
                    hasDefault: false
                    writable: true
                    _links: {}
            name:
              type: String
              name: Name
              required: true
              hasDefault: true
              writable: false
            filter:
              type: QueryFilter
              name: Filter
              required: true
              hasDefault: false
              writable: true
              _links: {}
            _links:
              self:
                href: "/api/v3/queries/filter_instance_schemas/author"
              filter:
                href: "/api/v3/queries/filters/author"
                title: Author
        _links:
          self:
            href: "/api/v3/projects/42/queries/filter_instance_schemas"
    Query_OperatorModel:
      type: object
      required:
      - id
      - name
      properties:
        id:
          type: string
          description: Query operator id
          readOnly: true
        name:
          type: string
          description: Query operator name
      example:
        _type: QueryOperator
        id: "!"
        name: is not
        _links:
          self:
            href: "/api/v3/queries/operators/!"
            title: is not
    Query_Sort_ByModel:
      type: object
      required:
      - id
      - name
      properties:
        id:
          type: string
          description: QuerySortBy id
          readOnly: true
        name:
          type: string
          description: QuerySortBy name
      example:
        _type: QuerySortBy
        id: status-asc
        name: Status (Ascending)
        _links:
          self:
            href: "/api/v3/queries/sort_bys/status-asc"
            title: Status (Ascending)
          column:
            href: "/api/v3/queries/columns/status"
            title: Status
          direction:
            href: urn:openproject-org:api:v3:queries:directions:asc
            title: Ascending
    Query_Update_Form:
      type: object
      properties:
        name:
          type: string
          description: Query name.
      example:
        name: Updated query name
    RelationCollectionModel:
      allOf:
      - "$ref": "#/components/schemas/CollectionModel"
      - type: object
        required:
        - _links
        - _embedded
        properties:
          _links:
            type: object
            required:
            - self
            properties:
              self:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    This relation collection

                    **Resource**: RelationCollectionReadModel
          _embedded:
            type: object
            required:
            - elements
            properties:
              elements:
                type: array
                items:
                  "$ref": "#/components/schemas/RelationReadModel"
    RelationReadModel:
      type: object
      properties:
        _type:
          type: string
          enum:
          - Relation
        id:
          type: integer
          description: Relation ID
        name:
          type: string
          description: The internationalised name of this type of relation
        type:
          type: string
          description: The relation type.
          enum:
          - relates
          - duplicates
          - duplicated
          - blocks
          - blocked
          - precedes
          - follows
          - includes
          - partof
          - requires
          - required
        reverseType:
          type: string
          description: The type of relation from the perspective of the related work
            package.
          enum:
          - relates
          - duplicates
          - duplicated
          - blocks
          - blocked
          - precedes
          - follows
          - includes
          - partof
          - requires
          - required
        description:
          type:
          - string
          - 'null'
          description: A descriptive text for the relation.
        lag:
          type:
          - integer
          - 'null'
          description: The lag in days between closing of `from` and start of `to`
          minimum: 0
        _embedded:
          type: object
          properties:
            from:
              "$ref": "#/components/schemas/WorkPackageModel"
            to:
              "$ref": "#/components/schemas/WorkPackageModel"
        _links:
          type: object
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This relation

                  **Resource**: Relation

                  # Conditions

                  **Permission**: view work packages
            updateImmediately:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Updates the relation between two work packages

                  # Conditions

                  **Permission**: manage work package relations
            delete:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Destroys the relation between the two work packages

                  # Conditions

                  **Permission**: manage work package relations
            from:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The emanating work package

                  **Resource**: WorkPackage

                  # Conditions

                  **Permission**: view work packages
            to:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The work package the relation ends in

                  **Resource**: WorkPackage

                  # Conditions

                  **Permission**: view work packages
    RelationWriteModel:
      type: object
      required:
      - _links
      - type
      properties:
        type:
          type: string
          description: The relation type.
          enum:
          - relates
          - duplicates
          - duplicated
          - blocks
          - blocked
          - precedes
          - follows
          - includes
          - partof
          - requires
          - required
        description:
          type:
          - string
          - 'null'
          description: A descriptive text for the relation.
        lag:
          type:
          - integer
          - 'null'
          description: The lag in days between closing of `from` and start of `to`
          minimum: 0
        _links:
          type: object
          properties:
            to:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The work package the relation ends in. Only available on relation creation, not on update.

                  **Resource**: WorkPackage

                  # Conditions

                  **Permission**: view work packages
    ReminderModel:
      type: object
      properties:
        id:
          type: integer
          description: Reminder id
          readOnly: true
          minimum: 1
        note:
          type: string
          description: The note of the reminder
        remindAt:
          type: string
          format: date-time
          description: The date and time when the reminder is due
        _links:
          required:
          - creator
          - remindable
          type: object
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This reminder

                  **Resource**: Reminder
            creator:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The person that created the reminder

                  **Resource**: User
            remindable:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The resource that the reminder is associated with

                  **Resource**: WorkPackage
    RevisionModel:
      type: object
      required:
      - identifier
      - formattedIdentifier
      - authorName
      - message
      - createdAt
      properties:
        id:
          type: integer
          description: Revision's id, assigned by OpenProject
          readOnly: true
          exclusiveMinimum: 0
        identifier:
          type: string
          description: The raw SCM identifier of the revision (e.g. full SHA hash)
          readOnly: true
        formattedIdentifier:
          type: string
          description: The SCM identifier of the revision, formatted (e.g. shortened
            unambiguous SHA hash). May be identical to identifier in many cases
          readOnly: true
        authorName:
          type: string
          description: The name of the author that committed this revision. Note that
            this name is retrieved from the repository and does not identify a user
            in OpenProject.
          readOnly: true
        message:
          allOf:
          - "$ref": "#/components/schemas/Formattable"
          - description: The commit message of the revision
            readOnly: true
        createdAt:
          type: string
          format: date-time
          description: The time this revision was committed to the repository
        _links:
          type: object
          required:
          - self
          - project
          - showRevision
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This revision

                  **Resource**: Revision
                readOnly: true
            project:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The project to which the revision belongs

                  **Resource**: Project
                readOnly: true
            author:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The user that added this revision, if the authorName was mapped to a user in OpenProject

                  **Resource**: User
                readOnly: true
            showRevision:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  A URL to the repository view (outside APIv3) showing this revision

                  **Resource**: -
                readOnly: true
      example:
        _type: Revision
        _links:
          self:
            href: "/api/v3/revisions/1"
          project:
            href: "/api/v3/projects/1"
          author:
            href: "/api/v3/users/1"
          showRevision:
            href: "/projects/identifier/repository/revision/11f4b07"
        id: 1
        identifier: 11f4b07dff4f4ce9548a52b7d002daca7cd63ec6
        formattedIdentifier: 11f4b07
        authorName: Some Developer
        message:
          format: plain
          raw: |-
            This revision provides new features

            An elaborate description
          html: "<p>This revision provides new features<br/><br/>An elaborate description</p>"
        createdAt: '2015-07-21T13:36:59.859Z'
    RevisionsModel:
      type: object
      example:
        _links:
          self:
            href: "/api/v3/work_packages/42/revisions"
        total: 2
        count: 2
        _type: Collection
        _embedded:
          elements:
          - _type: Revision
            _links:
              self:
                href: "/api/v3/revisions/13"
              project:
                href: "/api/v3/projects/1"
                title: A Test Project
              author:
                href: "/api/v3/users/1"
                title: John Sheppard - j.sheppard
              showRevision:
                href: "/projects/identifier/repository/revision/11f4b07"
            id: 13
            identifier: 11f4b07dff4f4ce9548a52b7d002daca7cd63ec6
            formattedIdentifier: 11f4b07
            authorName: John Sheppard
            message:
              format: plain
              raw: |-
                This revision provides new features

                An elaborate description
              html: "<p>This revision provides new features<br/><br/>An elaborate
                description</p>"
            createdAt: '2015-07-21T13:36:59.201Z'
          - _type: Revision
            _links:
              self:
                href: "/api/v3/revisions/14"
              project:
                href: "/api/v3/projects/1"
                title: A Test Project
              author:
                href: "/api/v3/users/2"
                title: Jim Sheppard - j.sheppard
              showRevision:
                href: "/projects/identifier/repository/revision/029ed72a"
            id: 13
            identifier: '029ed72a3b7b7c4ab332b1f6eaa6576e7c946059'
            formattedIdentifier: '029ed72a'
            authorName: j1msheppard
            message:
              format: plain
              raw: |-
                This revision fixes some stuff

                More information here
              html: "<p>This revision fixes some stuff<br/><br/>More information here</p>"
            createdAt: '2015-06-30T08:47:00.548Z'
    RoleModel:
      type: object
      required:
      - name
      properties:
        _type:
          type: string
          enum:
          - Role
        id:
          type: integer
          description: Role id
          readOnly: true
          minimum: 1
        name:
          type: string
          description: Role name
        _links:
          type: object
          required:
          - self
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This role

                  **Resource**: Role
                readOnly: true
      example:
        _type: Role
        id: 3
        name: Manager
        _links:
          self:
            href: "/api/v3/roles/3"
            title: Manager
    RolesModel:
      type: object
      example:
        _type: Collection
        total: 5
        count: 5
        _embedded:
          elements:
          - _type: Role
            id: 3
            name: Manager
            _links:
              self:
                href: "/api/v3/roles/3"
                title: Manager
          - _type: Role
            id: 2
            name: Anonymous
            _links:
              self:
                href: "/api/v3/roles/2"
                title: Anonymous
          - _type: Role
            id: 5
            name: Reader
            _links:
              self:
                href: "/api/v3/roles/5"
                title: Reader
          - _type: Role
            id: 4
            name: Member
            _links:
              self:
                href: "/api/v3/roles/4"
                title: Member
          - _type: Role
            id: 1
            name: Non member
            _links:
              self:
                href: "/api/v3/roles/1"
                title: Non member
        _links:
          self:
            href: "/api/v3/roles"
    RootModel:
      type: object
      required:
      - _type
      - instanceName
      - _links
      properties:
        _type:
          type: string
          enum:
          - Root
        instanceName:
          type: string
          description: The name of the OpenProject instance
        coreVersion:
          type: string
          description: |-
            The OpenProject core version number for the instance

            # Conditions

            **Permission** requires admin privileges
        _links:
          type: object
          required:
          - self
          - configuration
          - memberships
          - priorities
          - relations
          - statuses
          - time_entries
          - types
          - user
          - userPreferences
          - workPackages
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This root information object.

                  **Resource**: Root
            configuration:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The configuration resource.

                  **Resource**: Configuration
            memberships:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The collection of memberships.

                  **Resource**: Collection
            priorities:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The collection of priorities.

                  **Resource**: Collection
            relations:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The collection of relations.

                  **Resource**: Collection
            statuses:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The collection of statuses.

                  **Resource**: Collection
            time_entries:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The collection of time entries.

                  **Resource**: Collection
            types:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The collection of types.

                  **Resource**: Collection
            user:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The current user resource.

                  **Resource**: User
            userPreferences:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The current user preferences resource.

                  **Resource**: UserPreferences
            workPackages:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The work package collection.

                  **Resource**: Collection
      example:
        _type: Root
        instanceName: OpenProject
        coreVersion: 12.1.0
        _links:
          self:
            href: "/api/v3"
          configuration:
            href: "/api/v3/configuration"
          memberships:
            href: "/api/v3/memberships"
          priorities:
            href: "/api/v3/priorities"
          relations:
            href: "/api/v3/relations"
          statuses:
            href: "/api/v3/statuses"
          time_entries:
            href: "/api/v3/time_entries"
          types:
            href: "/api/v3/types"
          user:
            href: "/api/v3/users/3"
            title: Anakin Skywalker
          userPreferences:
            href: "/api/v3/users/3/preferences"
          workPackages:
            href: "/api/v3/work_packages"
    SchemaModel:
      type: object
      required:
      - _type
      - _links
      properties:
        _type:
          type: string
          enum:
          - Schema
        _dependencies:
          type: array
          description: A list of dependencies between one property's value and another
            property
          items:
            type: string
        _links:
          type: object
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This schema

                  **Resource**: Schema
    SchemaPropertyModel:
      type: object
      required:
      - type
      - name
      - required
      - hasDefault
      - writable
      properties:
        type:
          type: string
          description: The resource type for this property.
        name:
          type: string
          description: The name of the property.
        required:
          type: boolean
          description: Indicates, if the property is required for submitting a request
            of this schema.
        hasDefault:
          type: boolean
          description: Indicates, if the property has a default.
        writable:
          type: boolean
          description: Indicates, if the property is writable when sending a request
            of this schema.
        object:
          type: object
          description: Additional options for the property.
        location:
          type: string
          description: Defines the json path where the property is located in the
            payload.
          default: ''
        _links:
          type: object
          description: Useful links for this property (e.g. an endpoint to fetch allowed
            values)
    Schema_For_Global_QueriesModel:
      type: object
      example:
        _type: Schema
        _dependencies: []
        id:
          type: Integer
          name: ID
          required: true
          hasDefault: false
          writable: false
        name:
          type: String
          name: Name
          required: true
          hasDefault: false
          writable: true
          minLength: 1
          maxLength: 255
        createdAt:
          type: DateTime
          name: Created on
          required: true
          hasDefault: false
          writable: false
        updatedAt:
          type: DateTime
          name: Updated on
          required: true
          hasDefault: false
          writable: false
        user:
          type: User
          name: User
          required: true
          hasDefault: true
          writable: false
        project:
          type: Project
          name: Project
          required: false
          hasDefault: false
          writable: true
          location: _links
          _links: {}
        public:
          type: Boolean
          name: Public
          required: false
          hasDefault: true
          writable: true
        sums:
          type: Boolean
          name: Sums
          required: false
          hasDefault: true
          writable: true
        timelineVisible:
          type: Boolean
          name: Timeline visible
          required: false
          hasDefault: true
          writable: true
          deprecated: true
        timelineZoomLevel:
          type: String
          name: Timeline zoom level
          required: false
          hasDefault: true
          writable: true
          deprecated: true
        timelineLabels:
          type: QueryTimelineLabels
          name: Timeline labels
          required: false
          hasDefault: true
          writable: true
          deprecated: true
        timestamps:
          type: "[]Timestamp"
          name: Timestamps
          required: false
          hasDefault: true
          writable: true
        highlightingMode:
          type: String
          name: Highlighting mode
          required: false
          hasDefault: true
          writable: true
          deprecated: true
        highlightedAttributes:
          type: "[]QueryColumn"
          name: Highlighted attributes
          required: false
          hasDefault: true
          writable: true
          location: _links
          deprecated: true
        showHierarchies:
          type: Boolean
          name: Show hierarchies
          required: false
          hasDefault: true
          writable: true
          deprecated: true
        starred:
          type: Boolean
          name: Starred
          required: false
          hasDefault: true
          writable: true
        columns:
          type: "[]QueryColumn"
          name: Columns
          required: false
          hasDefault: true
          writable: true
          location: _links
          _links: {}
        filters:
          type: "[]QueryFilterInstance"
          name: Filters
          required: false
          writable: true
          hasDefault: true
          location: _links
          _links:
            allowedValuesSchemas:
              href: "/api/v3/queries/filter_instance_schemas"
        groupBy:
          type: "[]QueryGroupBy"
          name: Group results by
          required: false
          hasDefault: false
          writable: true
          _links: {}
        sortBy:
          type: "[]QuerySortBy"
          name: Sort by
          required: false
          hasDefault: true
          writable: true
          _links: {}
        results:
          type: WorkPackageCollection
          name: Results
          required: false
          hasDefault: false
          writable: false
        _embedded:
          filtersSchemas:
            _type: Collection
            total: 20
            count: 20
            _embedded:
              elements:
              - _type: QueryFilterInstanceSchema
                _dependencies:
                - _type: SchemaDependency
                  'on': operator
                  dependencies:
                    "/api/v3/queries/operators/=":
                      values:
                        type: "[]User"
                        name: Values
                        required: true
                        hasDefault: false
                        writable: true
                        _links: {}
                    "/api/v3/queries/operators/!":
                      values:
                        type: "[]User"
                        name: Values
                        required: true
                        hasDefault: false
                        writable: true
                        _links: {}
                    "/api/v3/queries/operators/!*": {}
                    "/api/v3/queries/operators/*": {}
                name:
                  type: String
                  name: Name
                  required: true
                  hasDefault: true
                  writable: false
                filter:
                  type: QueryFilter
                  name: Filter
                  required: true
                  hasDefault: false
                  writable: true
                  _links: {}
                _links:
                  self:
                    href: "/api/v3/queries/filter_instance_schemas/assignee"
                  filter:
                    href: "/api/v3/queries/filters/assignee"
                    title: Assignee
              - _type: QueryFilterInstanceSchema
                _dependencies:
                - _type: SchemaDependency
                  'on': operator
                  dependencies:
                    "/api/v3/queries/operators/=":
                      values:
                        type: "[]User"
                        name: Values
                        required: true
                        hasDefault: false
                        writable: true
                        _links: {}
                    "/api/v3/queries/operators/!":
                      values:
                        type: "[]User"
                        name: Values
                        required: true
                        hasDefault: false
                        writable: true
                        _links: {}
                name:
                  type: String
                  name: Name
                  required: true
                  hasDefault: true
                  writable: false
                filter:
                  type: QueryFilter
                  name: Filter
                  required: true
                  hasDefault: false
                  writable: true
                  _links: {}
                _links:
                  self:
                    href: "/api/v3/queries/filter_instance_schemas/author"
                  filter:
                    href: "/api/v3/queries/filters/author"
                    title: Author
            _links:
              self:
                href: "/api/v3/queries/filter_instance_schemas"
        _links:
          self:
            href: "/api/v3/queries/schema"
    Schema_For_Project_QueriesModel:
      type: object
      example:
        _type: Schema
        _dependencies: []
        id:
          type: Integer
          name: ID
          required: true
          hasDefault: false
          writable: false
        name:
          type: String
          name: Name
          required: true
          hasDefault: false
          writable: true
          minLength: 1
          maxLength: 255
        createdAt:
          type: DateTime
          name: Created on
          required: true
          hasDefault: false
          writable: false
        updatedAt:
          type: DateTime
          name: Updated on
          required: true
          hasDefault: false
          writable: false
        user:
          type: User
          name: User
          required: true
          hasDefault: true
          writable: false
        project:
          type: Project
          name: Project
          required: false
          hasDefault: false
          writable: true
          _links: {}
        public:
          type: Boolean
          name: Public
          required: false
          hasDefault: true
          writable: true
        sums:
          type: Boolean
          name: Sums
          required: false
          hasDefault: true
          writable: true
        timelineVisible:
          type: Boolean
          name: Timeline visible
          required: false
          hasDefault: true
          writable: true
        timelineZoomLevel:
          type: String
          name: Timeline zoom level
          required: false
          hasDefault: true
          writable: true
        showHierarchies:
          type: Boolean
          name: Show hierarchies
          required: false
          hasDefault: true
          writable: true
        starred:
          type: Boolean
          name: Starred
          required: false
          hasDefault: true
          writable: true
        columns:
          type: "[]QueryColumn"
          name: Columns
          required: false
          hasDefault: true
          writable: true
          _links: {}
        filters:
          type: "[]QueryFilterInstance"
          name: Filters
          required: false
          writable: true
          hasDefault: true
          _links:
            allowedValuesSchemas:
              href: "/api/v3/projects/42/queries/filter_instance_schemas"
        groupBy:
          type: "[]QueryGroupBy"
          name: Group results by
          required: false
          hasDefault: false
          writable: true
          _links: {}
        sortBy:
          type: "[]QuerySortBy"
          name: Sort by
          required: false
          hasDefault: true
          writable: true
          _links: {}
        results:
          type: WorkPackageCollection
          name: Results
          required: false
          hasDefault: false
          writable: false
        _embedded:
          filtersSchemas:
            _type: Collection
            total: 20
            count: 20
            _embedded:
              elements:
              - _type: QueryFilterInstanceSchema
                _dependencies:
                - _type: SchemaDependency
                  'on': operator
                  dependencies:
                    "/api/v3/queries/operators/=":
                      values:
                        type: "[]User"
                        name: Values
                        required: true
                        hasDefault: false
                        writable: true
                        _links: {}
                    "/api/v3/queries/operators/!":
                      values:
                        type: "[]User"
                        name: Values
                        required: true
                        hasDefault: false
                        writable: true
                        _links: {}
                    "/api/v3/queries/operators/!*": {}
                    "/api/v3/queries/operators/*": {}
                name:
                  type: String
                  name: Name
                  required: true
                  hasDefault: true
                  writable: false
                filter:
                  type: QueryFilter
                  name: Filter
                  required: true
                  hasDefault: false
                  writable: true
                  _links: {}
                _links:
                  self:
                    href: "/api/v3/queries/filter_instance_schemas/assignee"
                  filter:
                    href: "/api/v3/queries/filters/assignee"
                    title: Assignee
              - _type: QueryFilterInstanceSchema
                _dependencies:
                - _type: SchemaDependency
                  'on': operator
                  dependencies:
                    "/api/v3/queries/operators/=":
                      values:
                        type: "[]User"
                        name: Values
                        required: true
                        hasDefault: false
                        writable: true
                        _links: {}
                    "/api/v3/queries/operators/!":
                      values:
                        type: "[]User"
                        name: Values
                        required: true
                        hasDefault: false
                        writable: true
                        _links: {}
                name:
                  type: String
                  name: Name
                  required: true
                  hasDefault: true
                  writable: false
                filter:
                  type: QueryFilter
                  name: Filter
                  required: true
                  hasDefault: false
                  writable: true
                  _links: {}
                _links:
                  self:
                    href: "/api/v3/queries/filter_instance_schemas/author"
                  filter:
                    href: "/api/v3/queries/filters/author"
                    title: Author
            _links:
              self:
                href: "/api/v3/projects/42/queries/filter_instance_schemas"
        _links:
          self:
            href: "/api/v3/projects/42/queries/schema"
    Star_QueryModel:
      type: object
      example:
        _type: Query
        id: 9
        name: fdsfdsfdsf
        createdAt: '2015-03-20T12:56:56.085Z'
        updatedAt: '2015-05-20T18:16:53.619Z'
        filters:
        - _type: StatusQueryFilter
          name: Status
          _links:
            filter:
              href: "/api/v3/queries/filters/status"
              title: Status
            operator:
              href: "/api/v3/queries/operators/o"
              title: open
            schema:
              href: "/api/v3/queries/filter_instance_schemas/status"
            values: []
        - _type: DueDateQueryFilter
          name: Finish date
          values:
          - '1'
          _links:
            filter:
              href: "/api/v3/queries/filters/dueDate"
              title: Finish date
            operator:
              href: "/api/v3/queries/operators/<t+"
              title: in less than
            schema:
              href: "/api/v3/queries/filter_instance_schemas/dueDate"
        public: false
        sums: false
        starred: true
        _embedded:
          results:
            _type: WorkPackageCollection
            total: 234
            count: 30
            pageSize: 2
            offset: 1
            _embedded:
              elements:
              - "<--- shortened for brevity --->"
            _links:
              self:
                href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
              jumpTo:
                href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=%7Boffset%7D&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
                templated: true
              changeSize:
                href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=%7Bsize%7D&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
                templated: true
              createWorkPackage:
                href: "/api/v3/work_packages/form"
                method: post
              createWorkPackageImmediate:
                href: "/api/v3/work_packages"
                method: post
        _links:
          self:
            href: "/api/v3/queries/9"
            title: fdsfdsfdsf
          results:
            href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
          columns:
          - href: "/api/v3/queries/columns/id"
            title: ID
          - href: "/api/v3/queries/columns/subject"
            title: Subject
          - href: "/api/v3/queries/columns/type"
            title: Type
          - href: "/api/v3/queries/columns/status"
            title: Status
          - href: "/api/v3/queries/columns/priority"
            title: Priority
          - href: "/api/v3/queries/columns/assignee"
            title: Assignee
          - href: "/api/v3/queries/columns/updated_at"
            title: Updated on
          groupBy:
            href:
            title:
          sortBy:
          - href: "/api/v3/queries/sort_bys/parent-desc"
            title: Parent (Descending)
          user:
            href: "/api/v3/users/1"
            title: OpenProject Admin
          project:
            href: "/api/v3/projects/3"
            title: copy
    StatusCollectionModel:
      allOf:
      - "$ref": "#/components/schemas/CollectionModel"
      - type: object
        required:
        - _embedded
        properties:
          _embedded:
            type: object
            required:
            - elements
            properties:
              elements:
                type: array
                items:
                  "$ref": "#/components/schemas/StatusModel"
    StatusModel:
      type: object
      properties:
        _type:
          type: string
          enum:
          - Status
        id:
          type: integer
          description: Status id
          minimum: 1
        name:
          type: string
          description: Status name
        isClosed:
          type: boolean
          description: Indicates, whether work package of this status are considered
            closed
        color:
          type: string
          format: hex-code
          description: The color of the status
        isDefault:
          type: boolean
          description: True, if this status is the default status for new work packages
        isReadonly:
          type: boolean
          description: Indicates, whether work package of this status are readonly
        excludedFromTotals:
          type: boolean
          description: |-
            Indicates, whether work package of this status are excluded from totals of `Work`, `Remaining work`, and
            `% Complete` in a hierarchy.
        defaultDoneRatio:
          type: integer
          description: The percentageDone being applied when changing to this status
          minimum: 0
          maximum: 100
        position:
          type: integer
          description: Sort index of the status
        _links:
          type: object
          required:
          - self
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This status

                  **Resource**: Status
    StorageCollectionModel:
      allOf:
      - "$ref": "#/components/schemas/CollectionModel"
      - type: object
        required:
        - _links
        - _embedded
        properties:
          _links:
            type: object
            required:
            - self
            properties:
              self:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    This storage collection

                    **Resource**: StorageCollectionReadModel
          _embedded:
            type: object
            required:
            - elements
            properties:
              elements:
                type: array
                items:
                  "$ref": "#/components/schemas/StorageReadModel"
    StorageFileModel:
      allOf:
      - "$ref": "#/components/schemas/FileLinkOriginDataModel"
      - type: object
        required:
        - _type
        - location
        - _links
        properties:
          _type:
            type: string
            enum:
            - StorageFile
          location:
            type: string
            description: Location identification for file in storage
          _links:
            type: object
            required:
            - self
            properties:
              self:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    Not provided

                    **Resource**: urn:openproject-org:api:v3:storages:storage_file:no_link_provided
      example:
        id: 42
        name: readme.md
        _type: StorageFile
        location: "/readme.md"
        _links:
          self:
            href: urn:openproject-org:api:v3:storages:storage_file:no_link_provided
    StorageFilesModel:
      type: object
      required:
      - _type
      - files
      - parent
      - ancestors
      - _links
      properties:
        _type:
          type: string
          enum:
          - StorageFiles
        files:
          type: array
          items:
            "$ref": "#/components/schemas/StorageFileModel"
          description: List of files provided by the selected storage.
        parent:
          allOf:
          - "$ref": "#/components/schemas/StorageFileModel"
          - description: File of the currently selected parent directory.
        ancestors:
          type: array
          items:
            "$ref": "#/components/schemas/StorageFileModel"
          description: List of ancestors of the parent directory. Can be empty, if
            parent directory was root directory.
        _links:
          type: object
          required:
          - self
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Not provided

                  **Resource**: urn:openproject-org:api:v3:storages:storage_file:no_link_provided
      example:
        _type: StorageFiles
        files:
        - id: 42
          name: readme.md
          _type: StorageFile
          location: "/readme.md"
          mimeType: text/markdown
          size: 4096
          createdAt: '2021-12-19T09:42:10.170Z'
          lastModifiedAt: '2021-12-20T14:00:13.987Z'
          createdByName: Luke Skywalker
          lastModifiedByName: Anakin Skywalker
          _links:
            self:
              href: urn:openproject-org:api:v3:storages:storage_file:no_link_provided
        - id: 43
          name: readme.pdf
          _type: StorageFile
          location: "/readme.pdf"
          mimeType: application/pdf
          size: 2048
          createdAt: '2021-12-19T09:42:10.170Z'
          lastModifiedAt: '2021-12-20T14:00:13.987Z'
          createdByName: Luke Skywalker
          lastModifiedByName: Anakin Skywalker
          _links:
            self:
              href: urn:openproject-org:api:v3:storages:storage_file:no_link_provided
        parent:
          id: 41
          name: "/"
          location: "/"
          mimeType: application/x-op-directory
          size: 6144
          createdAt: '2021-12-20T09:42:10.170Z'
          lastModifiedAt: '2021-12-21T14:00:13.987Z'
          createdByName: Luke Skywalker
          lastModifiedByName: Anakin Skywalker
          _links:
            self:
              href: urn:openproject-org:api:v3:storages:storage_file:no_link_provided
        ancestors: []
        _links:
          self:
            href: urn:openproject-org:api:v3:storages:storage_file:no_link_provided
    StorageFolderWriteModel:
      type: object
      required:
      - name
      - parentId
      properties:
        name:
          type: string
          description: Name of the folder to be created
        parentId:
          type: string
          description: Unique identifier of the parent folder in which the new folder
            should be created in
    StorageFileUploadPreparationModel:
      type: object
      required:
      - projectId
      - fileName
      - parent
      properties:
        projectId:
          type: integer
          description: The project identifier, from where a user starts uploading
            a file.
          minimum: 1
        fileName:
          type: string
          description: The file name.
        parent:
          type: string
          description: |-
            The directory to which the file is to be uploaded. For root directories, the value `/` must
            be provided.
    StorageFileUploadLinkModel:
      type: object
      required:
      - _type
      - _links
      properties:
        _type:
          type: string
          enum:
          - UploadLink
        _links:
          type: object
          required:
          - self
          - destination
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The resource link of the upload link resource.

                  As the upload link is a temporal object, and cannot be retrieved again, the
                  self link usually is `urn:openproject-org:api:v3:storages:upload_link:no_link_provided`.

                  **Resource**: UploadLink
            destination:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The direct upload link.

                  **Resource**: N/A
    StorageReadModel:
      type: object
      required:
      - id
      - _type
      - name
      - _links
      properties:
        id:
          type: integer
          description: Storage id
        _type:
          type: string
          enum:
          - Storage
        name:
          type: string
          description: Storage name
        storageAudience:
          type: string
          description: |-
            The audience that the storage expects in tokens for requests to it,
            usually the storage's client ID at the identity provider.

            This is only required for authentication through single-sign-on and so far
            only supported for provider type Nextcloud.
        tenantId:
          type: string
          description: |-
            The tenant id of a file storage of type OneDrive/SharePoint.

            Ignored if the provider type is not OneDrive/SharePoint.
        driveId:
          type: string
          description: |-
            The drive id of a file storage of type OneDrive/SharePoint.

            Ignored if the provider type is not OneDrive/SharePoint.
        hasApplicationPassword:
          type: boolean
          description: |-
            Whether the storage has the application password to use for the Nextcloud storage.

            Ignored if the provider type is not Nextcloud.
        createdAt:
          type: string
          format: date-time
          description: Time of creation
        updatedAt:
          type: string
          format: date-time
          description: Time of the most recent change to the storage
        configured:
          type: boolean
          description: Indication, if the storage is fully configured
        _embedded:
          type: object
          properties:
            oauthApplication:
              "$ref": "#/components/schemas/OAuthApplicationReadModel"
            oauthClientCredentials:
              "$ref": "#/components/schemas/OAuthClientCredentialsReadModel"
        _links:
          type: object
          required:
          - self
          - type
          - open
          - authorizationState
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This storage resource. Contains the user defined storage name as title.

                  **Resource**: Storage
            type:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The urn of the storage type. Currently Nextcloud and OneDrive storages are supported.

                  - urn:openproject-org:api:v3:storages:Nextcloud
                  - urn:openproject-org:api:v3:storages:OneDrive

                  **Resource**: N/A
            authenticationMethod:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The urn of the authentication method. Currently only Nextcloud storages support this setting.

                  - urn:openproject-org:api:v3:storages:authenticationMethod:TwoWayOAuth2 (default)
                  - urn:openproject-org:api:v3:storages:authenticationMethod:OAuth2SSO

                  **Resource**: N/A
            origin:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Web URI of the storage instance. This link is ignored, if the storage is hosted in a cloud and has no own
                  URL, like file storages of type OneDrive/SharePoint.

                  **Resource**: N/A
            open:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  URI of the file storage location, from where the user usually starts browsing files.

                  **Resource**: N/A
            authorizationState:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The urn of the storage connection state. Can be one of:

                  - urn:openproject-org:api:v3:storages:authorization:Connected
                  - urn:openproject-org:api:v3:storages:authorization:FailedAuthorization
                  - urn:openproject-org:api:v3:storages:authorization:Error

                  **Resource**: N/A
            authorize:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The link to the starting point of the authorization cycle for a configured storage provider.

                  # Conditions

                  `authorizationState` is:

                  - urn:openproject-org:api:v3:storages:authorization:FailedAuthorization

                  **Resource**: N/A
            oauthApplication:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The OAuth 2 provider application linked to the storage.

                  # Conditions

                  - User has role `admin`

                  **Resource**: OAuthApplication
            oauthClientCredentials:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The OAuth 2 credentials resource linked to the storage.

                  # Conditions

                  - User has role `admin`

                  **Resource**: OAuthClientCredentials
    StorageWriteModel:
      type: object
      properties:
        name:
          type: string
          description: Storage name, if not provided, falls back to a default.
        storageAudience:
          type: string
          description: |-
            The audience that the storage expects in tokens for requests to it,
            usually the storage's client ID at the identity provider.

            This is only required for authentication through single-sign-on and so far
            only supported for provider type Nextcloud.
        applicationPassword:
          type:
          - string
          - 'null'
          description: |-
            The application password to use for the Nextcloud storage. Ignored if the provider type is not Nextcloud.

            If a string is provided, the password is set and automatic management is enabled for the storage.
            If null is provided, the password is unset and automatic management is disabled for the storage.
        _links:
          type: object
          required:
          - origin
          - type
          properties:
            origin:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The storage's host URL.

                  **Resource**: N/A
            type:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The urn of the storage type. Currently Nextcloud and OneDrive storages are supported.

                  - urn:openproject-org:api:v3:storages:Nextcloud
                  - urn:openproject-org:api:v3:storages:OneDrive

                  **Resource**: N/A
            authenticationMethod:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The urn of the authentication method. Currently only Nextcloud storages support this setting.

                  - urn:openproject-org:api:v3:storages:authenticationMethod:TwoWayOAuth2 (default)
                  - urn:openproject-org:api:v3:storages:authenticationMethod:OAuth2SSO

                  **Resource**: N/A
      example:
        name: Coruscant
        applicationPassword: qJ_VLNReW@sd-Edz2hyC
        _links:
          origin:
            href: https://nextcloud.deathstar.rocks
          type:
            href: urn:openproject-org:api:v3:storages:Nextcloud
    TimeEntryActivityModel:
      type: object
      required:
      - _type
      - id
      - name
      - position
      - default
      - _embedded
      - _links
      properties:
        _type:
          type: string
          enum:
          - TimeEntriesActivity
        id:
          type: integer
          description: Time entry id
          minimum: 1
        name:
          type: string
          description: The human readable name chosen for this activity
        position:
          type: integer
          description: The rank the activity has in a list of activities
        default:
          type: boolean
          description: Flag to signal whether this activity is the default activity
        _embedded:
          type: object
          required:
          - projects
          properties:
            projects:
              type: array
              items:
                "$ref": "#/components/schemas/ProjectModel"
        _links:
          type: object
          required:
          - self
          - projects
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This time entry activity

                  **Resource**: TimeEntriesActivity
            projects:
              type: array
              items:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    One of the projects the time entry is active in.

                    **Resource**: Project
      examples:
      - _type: TimeEntriesActivity
        id: 18
        name: Management
        position: 8
        default: false
        _embedded:
          projects: []
        _links:
          self:
            href: "/api/v3/time_entries/activities/18"
            title: Management
          projects:
          - href: "/api/v3/projects/death_star_v2"
            title: DeathStarV2
          - href: "/api/v3/projects/star_killer_base"
            title: StarKillerBase
    TimeEntryCollectionModel:
      type: object
      allOf:
      - "$ref": "#/components/schemas/CollectionModel"
      - type: object
        required:
        - _links
        - _embedded
        properties:
          _links:
            type: object
            required:
            - self
            properties:
              self:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    This time entry collection

                    **Resource**: TimeEntryCollectionModel
          _embedded:
            type: object
            required:
            - elements
            properties:
              elements:
                type: array
                items:
                  "$ref": "#/components/schemas/TimeEntryModel"
      examples:
      - _type: Collection
        total: 39
        count: 2
        pageSize: 2
        offset: 1
        _embedded:
          elements:
          - _type: TimeEntry
            id: 5
            comment:
              format: plain
              raw: Some comment
              html: "<p>Some comment</p>"
            spentOn: '2015-03-20'
            hours: PT5H
            startTime: '2015-03-20T10:00:00.000Z'
            endTime: '2015-03-20T15:00:00.000Z'
            createdAt: '2015-03-20T12:56:56.803Z'
            updatedAt: '2015-03-20T12:56:56.803Z'
            _links:
              self:
                href: "/api/v3/time_entries/1"
              updateImmediately:
                href: "/api/v3/time_entries/1"
                method: patch
              delete:
                href: "/api/v3/time_entries/1"
                method: delete
              project:
                href: "/api/v3/projects/1"
                title: Some project
              workPackage:
                href: "/api/v3/work_packages/1"
                title: Some work package
              user:
                href: "/api/v3/users/2"
                title: Some user
              activity:
                href: "/api/v3/time_entries/activities/18"
                title: Some time entry activity
          - _type: TimeEntry
            id: 10
            comment:
              format: plain
              raw: Another comment
              html: "<p>Another comment</p>"
            spentOn: '2015-03-21'
            hours: PT7H
            startTime: '2015-03-20T15:00:00.000Z'
            endTime: '2015-03-20T22:00:00.000Z'
            createdAt: '2015-03-20T12:56:56.569Z'
            updatedAt: '2015-03-20T12:56:56.371Z'
            _links:
              self:
                href: "/api/v3/time_entries/2"
              project:
                href: "/api/v3/projects/42"
                title: Some other project
              workPackage:
                href: "/api/v3/work_packages/541"
                title: Some other work package
              user:
                href: "/api/v3/users/6"
                title: Some other project
              activity:
                href: "/api/v3/time_entries/activities/14"
                title: some other time entry activity
        _links:
          self:
            href: "/api/v3/time_entries?offset=1&pageSize=2"
          jumpTo:
            href: "/api/v3/time_entries?offset=%7Boffset%7D&pageSize=2"
            templated: true
          changeSize:
            href: "/api/v3/time_entries?offset=1&pageSize=%7Bsize%7D"
            templated: true
          nextByOffset:
            href: "/api/v3/time_entries?offset=2&pageSize=2"
          createTimeEntry:
            href: "/api/v3/time_entries/form"
            method: post
          createTimeEntryImmediately:
            href: "/api/v3/time_entries"
            method: post
    TimeEntryModel:
      type: object
      properties:
        id:
          type: integer
          description: The id of the time entry
          minimum: 1
        comment:
          type: string
          description: A comment to the time entry
        spentOn:
          type: string
          format: date
          description: The date the expenditure is booked for
        hours:
          type: string
          format: duration
          description: The time quantifying the expenditure
        approvedHours:
          type: string
          format: duration
          description: The approved time quantifying the expenditure
        ongoing:
          type: boolean
          description: Whether the time entry is actively tracking time
        fromThKeyin:
          type: boolean
          description: From TH keyin or not
        createdAt:
          type: string
          format: date-time
          description: The time the time entry was created
        startTime:
          type:
          - string
          - 'null'
          format: date-time
          description: |-
            The time the time entry was started, or null if the time entry does not have a start time.

            The time is returned as UTC time, if presented to the user it should be converted to the user's timezone.

            This field is only available if the global `allow_tracking_start_and_end_times` setting is enabled.
        endTime:
          type:
          - string
          - 'null'
          format: date-time
          description: |-
            The time the time entry was ended, or null if the time entry does not have a start time.

            The time is returned as UTC time, if presented to the user it should be converted to the user's timezone.

            This field is only available if the global `allow_tracking_start_and_end_times` setting is enabled.
        updatedAt:
          type: string
          format: date-time
          description: The time the time entry was last updated
        _links:
          type: object
          required:
          - self
          - project
          - user
          - activity
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This time entry

                  **Resource**: TimeEntry
            updateImmediately:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Directly perform edits on this time entry

                  # Conditions

                  **Permission**: 'edit time entries' or 'edit own time entries' if the time entry belongs to the user
            update:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Form endpoint that aids in preparing and performing edits on a TimeEntry

                  # Conditions

                  **Permission**: 'edit time entries' or 'edit own time entries' if the time entry belongs to the user
            delete:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Delete this time entry

                  # Conditions

                  **Permission**: 'edit time entries' or 'edit own time entries' if the time entry belongs to the user
            schema:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The time entry schema

                  **Resource**: Schema
            project:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The project the time entry is bundled in. The project might be different from the work package's project once the workPackage is moved.

                  **Resource**: Project
            workPackage:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The work package the time entry is created on

                  **Resource**: WorkPackage
            user:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The user the time entry tracks expenditures for

                  **Resource**: User
            activity:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The time entry activity the time entry is categorized as

                  **Resource**: TimeEntriesActivity
      examples:
      - _type: TimeEntry
        id: 42
        comment:
          format: plain
          raw: The force shall set me free.
          html: "<p>The force shall set me free.</p>"
        spentOn: '2023-01-11'
        hours: PT4H
        startTime: '2023-01-11T09:58:00.000Z'
        endTime: '2023-01-11T13:58:00.000Z'
        createdAt: '2023-01-11T13:58:24.927Z'
        updatedAt: '2023-01-11T13:58:24.927Z'
        _links:
          self:
            href: "/api/v3/time_entries/42"
          updateImmediately:
            href: "/api/v3/time_entries/42"
            method: patch
          update:
            href: "/api/v3/time_entries/42/form"
            method: post
          delete:
            href: "/api/v3/time_entries/42"
            method: delete
          schema:
            href: "/api/v3/time_entries/schema"
          project:
            href: "/api/v3/projects/11"
            title: DeathStarV2
          workPackage:
            href: "/api/v3/work_packages/77"
            title: Build new hangar
          user:
            href: "/api/v3/users/3"
            title: Darth Vader
          activity:
            href: "/api/v3/time_entries/activities/1"
            title: Management
    TypeModel:
      type: object
      properties:
        id:
          type: integer
          description: Type id
          readOnly: true
          exclusiveMinimum: 0
        name:
          type: string
          description: Type name
          readOnly: true
        color:
          type: string
          description: The color used to represent this type
          readOnly: true
        position:
          type: integer
          description: Sort index of the type
          readOnly: true
        isDefault:
          type: boolean
          description: Is this type active by default in new projects?
          readOnly: true
        isMilestone:
          type: boolean
          description: Do work packages of this type represent a milestone?
          readOnly: true
        createdAt:
          type: string
          format: date-time
          description: Time of creation
          readOnly: true
        updatedAt:
          type: string
          format: date-time
          description: Time of the most recent change to the user
        _links:
          type: object
          required:
          - self
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This type

                  **Resource**: Type
                readOnly: true
      example:
        _links:
          self:
            href: "/api/v3/types/1"
        _type: Type
        id: 1
        name: Bug
        color: "#ff0000"
        position: 1
        isDefault: true
        isMilestone: false
        createdAt: '2014-05-21T08:51:20.624Z'
        updatedAt: '2014-05-21T08:51:20.624Z'
    TypesModel:
      type: object
      example:
        _links:
          self:
            href: "/api/v3/types"
        total: 2
        count: 2
        _type: Collection
        _embedded:
          elements:
          - _links:
              self:
                href: "/api/v3/types/1"
            _type: Type
            id: 1
            name: Bug
            color: "#ff0000"
            position: 1
            isDefault: true
            isMilestone: false
            createdAt: '2014-05-21T08:51:20.429Z'
            updatedAt: '2014-05-21T08:51:20.429Z'
          - _links:
              self:
                href: "/api/v3/types/2"
            _type: Type
            id: 2
            name: Feature
            color: "#888"
            position: 2
            isDefault: false
            isMilestone: false
            createdAt: '2014-05-21T08:51:20.429Z'
            updatedAt: '2014-05-21T08:51:20.429Z'
    Types_by_ProjectModel:
      allOf:
      - "$ref": "#/components/schemas/CollectionModel"
      - type: object
        required:
        - _links
        - _embedded
        properties:
          _links:
            type: object
            required:
            - self
            properties:
              self:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    The types collection

                    **Resource**: TypesCollection
                  readOnly: true
          _embedded:
            type: object
            properties:
              elements:
                type: array
                readOnly: true
                items:
                  allOf:
                  - "$ref": "#/components/schemas/TypeModel"
                  - description: Collection of Types
    Unstar_QueryModel:
      type: object
      example:
        _type: Query
        id: 9
        name: fdsfdsfdsf
        createdAt: '2015-03-20T12:56:56.257Z'
        updatedAt: '2015-05-20T18:16:53.953Z'
        filters:
        - _type: StatusQueryFilter
          name: Status
          _links:
            filter:
              href: "/api/v3/queries/filters/status"
              title: Status
            operator:
              href: "/api/v3/queries/operators/o"
              title: open
            schema:
              href: "/api/v3/queries/filter_instance_schemas/status"
            values: []
        - _type: DueDateQueryFilter
          name: Finish date
          values:
          - '1'
          _links:
            filter:
              href: "/api/v3/queries/filters/dueDate"
              title: Finish date
            operator:
              href: "/api/v3/queries/operators/<t+"
              title: in less than
            schema:
              href: "/api/v3/queries/filter_instance_schemas/dueDate"
        public: false
        sums: false
        starred: false
        _embedded:
          results:
            _type: WorkPackageCollection
            total: 234
            count: 30
            pageSize: 2
            offset: 1
            _embedded:
              elements:
              - "<--- shortened for brevity --->"
            _links:
              self:
                href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
              jumpTo:
                href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=%7Boffset%7D&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
                templated: true
              changeSize:
                href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=%7Bsize%7D&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
                templated: true
              createWorkPackage:
                href: "/api/v3/work_packages/form"
                method: post
              createWorkPackageImmediate:
                href: "/api/v3/work_packages"
                method: post
        _links:
          self:
            href: "/api/v3/queries/9"
            title: fdsfdsfdsf
          results:
            href: "/api/v3/projects/3/work_packages?filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22o%22%2C%22values%22%3A%5B%5D%7D%7D%2C%7B%22dueDate%22%3A%7B%22operator%22%3A%22%3Ct%2B%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D&offset=1&pageSize=2&sortBy=%5B%5B%22parent%22%2C%22desc%22%5D%5D"
          columns:
          - href: "/api/v3/queries/columns/id"
            title: ID
          - href: "/api/v3/queries/columns/subject"
            title: Subject
          - href: "/api/v3/queries/columns/type"
            title: Type
          - href: "/api/v3/queries/columns/status"
            title: Status
          - href: "/api/v3/queries/columns/priority"
            title: Priority
          - href: "/api/v3/queries/columns/assignee"
            title: Assignee
          - href: "/api/v3/queries/columns/updated_at"
            title: Updated on
          groupBy:
            href:
            title:
          sortBy:
          - href: "/api/v3/queries/sort_bys/parent-desc"
            title: Parent (Descending)
          user:
            href: "/api/v3/users/1"
            title: OpenProject Admin
          project:
            href: "/api/v3/projects/3"
            title: copy
    UserCollectionModel:
      allOf:
      - "$ref": "#/components/schemas/CollectionModel"
      - type: object
        required:
        - _links
        - _embedded
        properties:
          _links:
            type: object
            required:
            - self
            properties:
              self:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    This user collection

                    **Resource**: Collection
          _embedded:
            type: object
            required:
            - elements
            properties:
              elements:
                type: array
                items:
                  "$ref": "#/components/schemas/UserModel"
      example:
        _type: Collection
        total: 2
        count: 2
        _links:
          self:
            href: "/api/v3/users"
        _embedded:
          elements:
          - _hint: User resource shortened for brevity
            _type: User
            id: 1337
          - _hint: User resource shortened for brevity
            _type: User
            id: 1338
    UserCreateModel:
      type: object
      required:
      - admin
      - email
      - login
      - firstName
      - lastName
      - language
      properties:
        admin:
          type: boolean
        email:
          type: string
          maxLength: 60
        login:
          type: string
          maxLength: 256
        password:
          type: string
          description: |-
            The users password.

            *Conditions:*

            Only writable on creation, not on update.
        firstName:
          type: string
          maxLength: 30
        lastName:
          type: string
          maxLength: 30
        status:
          type: string
          description: |-
            The current activation status of the user.

            *Conditions:*

            Only writable on creation, not on update.
        language:
          type: string
      example:
        login: j.sheppard
        password: idestroyedsouvereign
        firstName: John
        lastName: Sheppard
        email: shep@mail.com
        admin: true
        status: active
        language: en
    UserModel:
      allOf:
      - "$ref": "#/components/schemas/PrincipalModel"
      - type: object
        required:
        - _type
        - avatar
        properties:
          _type:
            type: string
            enum:
            - User
          avatar:
            type: string
            format: uri
            description: URL to user's avatar
          login:
            type: string
            description: |-
              The user's login name

              # Conditions

              - User is self, or `create_user` or `manage_user` permission globally
            maxLength: 256
          firstName:
            type: string
            description: |-
              The user's first name

              # Conditions

              - User is self, or `create_user` or `manage_user` permission globally
            maxLength: 30
          lastName:
            type: string
            description: |-
              The user's last name

              # Conditions

              - User is self, or `create_user` or `manage_user` permission globally
            maxLength: 30
          email:
            type: string
            description: |-
              The user's email address

              # Conditions

              - E-Mail address not hidden
              - User is not a new record
              - User is self, or `create_user` or `manage_user` permission globally
            maxLength: 60
          admin:
            type: boolean
            description: |-
              Flag indicating whether or not the user is an admin

              # Conditions

              - `admin`
          status:
            type: string
            description: |-
              The current activation status of the user.

              # Conditions

              - User is self, or `create_user` or `manage_user` permission globally
          language:
            type: string
            description: |-
              User's language | ISO 639-1 format

              # Conditions

              - User is self, or `create_user` or `manage_user` permission globally
          identityUrl:
            type:
            - string
            - 'null'
            description: |-
              User's identity_url for OmniAuth authentication.
              **Deprecated:** It will be removed in the near future.

              # Conditions

              - User is self, or `create_user` or `manage_user` permission globally
            deprecated: true
          createdAt:
            type: string
            format: date-time
            description: Time of creation
          updatedAt:
            type: string
            format: date-time
            description: Time of the most recent change to the user
          _links:
            type: object
            properties:
              showUser:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    A relative path to show the user in the web application.

                    # Condition

                    - User is not a new record
                    - User is not `locked`
              updateImmediately:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    A link to update the user resource.

                    # Conditions

                    - `admin`
              lock:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    Restrict the user from logging in and performing any actions.

                    # Conditions

                    - User is not locked
                    - `admin`
              unlock:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    Allow a locked user to login and act again.

                    # Conditions

                    - User is not locked
                    - `admin`
              delete:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    Permanently remove a user from the instance

                    # Conditions

                    either:
                      - `admin`
                      - Setting `users_deletable_by_admin` is set
                    or:
                      - User is self
                      - Setting `users_deletable_by_self` is set
              authSource:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    Permanently remove a user from the instance

                    # Conditions

                    - LDAP authentication configured
                    - `admin`
    UserPreferencesModel:
      type: object
      example:
        _links:
          self:
            href: "/api/v3/my_preferences"
          user:
            href: "/api/v3/users/1"
            title: John Sheppard
          updateImmediately:
            href: "/api/v3/users/3/preferences"
            method: patch
        _type: UserPreferences
        commentSortDescending: true
        disableKeyboardShortcuts: false
        timeZone: Europe/Berlin
        warnOnLeavingUnsaved: true
        notifications:
        - watched: false
          involved: true
          mentioned: false
          shared: true
          newsAdded: false,
          newsCommented: false
          documentAdded: false
          forumMessages: false
          wikiPageAdded: false
          wikiPageUpdated: false
          membershipAdded: false
          membershipUpdated: false
          workPackageCommented: false
          workPackageProcessed: false
          workPackagePrioritized: false
          workPackageScheduled: false
          _links:
            project:
              href:
    ValuesPropertyModel:
      type: object
      required:
      - _type
      - property
      - value
      - _links
      properties:
        _type:
          type: string
          enum:
          - Values::Property
        property:
          type: string
          description: The key of the key - value pair represented by the Values::Property
        value:
          type: string
          description: The value of the key - value pair represented by the Values::Property
        _links:
          type: object
          required:
          - self
          - schema
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This key - value pair.

                  **Resource**: Storage
            schema:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The schema describing the key - value pair.

                  **Resource**: Schema
    VersionModel:
      type: object
      required:
      - name
      - status
      - sharing
      - createdAt
      - updatedAt
      properties:
        id:
          type: integer
          description: Version id
          readOnly: true
          exclusiveMinimum: 0
        name:
          type: string
          description: Version name
        description:
          allOf:
          - "$ref": "#/components/schemas/Formattable"
          - {}
        startDate:
          type: string
          format: date
        endDate:
          type: string
          format: date
        status:
          type: string
          description: The current status of the version
        sharing:
          type: string
          description: The current status of the version
        createdAt:
          type: string
          format: date-time
          description: Time of creation
          readOnly: true
        updatedAt:
          type: string
          format: date-time
          description: Time of the most recent change to the version
          readOnly: true
        _links:
          type: object
          required:
          - self
          - availableInProjects
          properties:
            update:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Form endpoint that aids in preparing and performing edits on the version

                  # Conditions

                  **Permission**: manage versions
                readOnly: true
            updateImmediately:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Directly perform edits on the version

                  # Conditions

                  **Permission**: manage versions
                readOnly: true
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This version

                  **Resource**: Version
                readOnly: true
            definingProject:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The project to which the version belongs

                  **Resource**: Project
                readOnly: true
            availableInProjects:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Projects where this version can be used

                  **Resource**: Projects
                readOnly: true
      example:
        _links:
          self:
            href: "/api/v3/versions/11"
          update:
            href: "/api/v3/versions/11/form"
            method: POST
          updateImmediately:
            href: "/api/v3/versions/11"
            method: PATCH
          definingProject:
            href: "/api/v3/projects/11"
          availableInProjects:
            href: "/api/v3/versions/11/projects"
          customField4:
            href: "/api/v3/custom_options/5"
            title: Custom field option
        _type: Version
        id: 11
        name: v3.0 Alpha
        description:
          format: plain
          raw: This version has a description
          html: This version has a description
        startDate: '2014-11-20'
        endDate:
        status: open
        sharing: system
        customField14: '1234567890'
    Version_schemaModel:
      type: object
      example:
        _type: Schema
        _dependencies: []
        id:
          type: Integer
          name: ID
          required: true
          hasDefault: false
          writable: false
        name:
          type: String
          name: Name
          required: true
          hasDefault: false
          writable: true
          minLength: 1
          maxLength: 60
        description:
          type: Formattable
          name: Description
          required: false
          hasDefault: false
          writable: true
        startDate:
          type: Date
          name: Start date
          required: false
          hasDefault: false
          writable: true
        endDate:
          type: Date
          name: Finish date
          required: false
          hasDefault: false
          writable: false
        status:
          type: String
          name: Status
          required: true
          hasDefault: false
          writable: true
          visibility: default
          _links: {}
        sharing:
          type: String
          name: Sharing
          required: true
          hasDefault: false
          writable: true
          visibility: default
          _links: {}
        createdAt:
          type: DateTime
          name: Created on
          required: true
          hasDefault: false
          writable: false
        updatedAt:
          type: DateTime
          name: Updated on
          required: true
          hasDefault: false
          writable: false
        definingProject:
          type: Project
          name: Project
          required: true
          hasDefault: false
          writable: true
          _links: {}
        customField14:
          type: String
          name: text CF
          required: false
          hasDefault: false
          writable: true
          visibility: default
        customField40:
          type: CustomOption
          name: List CF
          required: false
          hasDefault: false
          writable: true
          location: _links
          visibility: default
          _links: {}
        _links:
          self:
            href: "/api/v3/versions/schema"
    VersionsModel:
      type: object
      example:
        _links:
          self:
            href: "/api/v3/versions"
        total: 3
        count: 3
        _type: Collection
        _embedded:
          elements:
          - _links:
              self:
                href: "/api/v3/versions/11"
              definingProject:
                href: "/api/v3/projects/12"
              availableInProjects:
                href: "/api/v3/versions/11/projects"
            _type: Version
            id: 11
            name: v3.0 Alpha
            description:
              format: plain
              raw: This version has a description
              html: This version has a description
            startDate: '2014-11-20'
            endDate:
            status: Open
          - _links:
              self:
                href: "/api/v3/versions/12"
              definingProject:
                href: "/api/v3/projects/11"
              availableInProjects:
                href: "/api/v3/versions/12/projects"
            _type: Version
            id: 12
            name: v2.0
            description:
              format: plain
              raw: ''
              html: ''
            startDate:
            endDate:
            status: Closed
          - _links:
              self:
                href: "/api/v3/versions/10"
              definingProject:
                href: "/api/v3/projects/13"
              availableInProjects:
                href: "/api/v3/versions/13/projects"
            _type: Version
            id: 10
            name: v1.0
            description:
              format: plain
              raw: ''
              html: ''
            startDate:
            endDate:
            status: Open
    Versions_by_ProjectModel:
      allOf:
      - "$ref": "#/components/schemas/CollectionModel"
      - type: object
        required:
        - _links
        - _embedded
        properties:
          _links:
            type: object
            required:
            - self
            properties:
              self:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    The versions collection

                    **Resource**: VersionsCollection
                  readOnly: true
          _embedded:
            type: object
            properties:
              elements:
                type: array
                readOnly: true
                items:
                  allOf:
                  - "$ref": "#/components/schemas/VersionModel"
                  - description: Collection of Versions
    View_actionModel:
      type: object
      example:
        _links:
          self:
            href: "/api/v3/actions/work_packages/create"
            title: Add work package
        _type: Action
        id: work_packages/create
        name: Add work package
        description: Creating a work package within a project including the uploading
          of attachments. Some attributes might not be selected, e.g version which
          requires a second permission
        modules:
        - work_packages
    View_capabilitiesModel:
      type: object
      example:
        _links:
          self:
            href: "/api/v3/capabilities/work_packages/create/p123-567"
          action:
            href: "/api/v3/actions/work_packages/create"
            title: Add work package
          context:
            href: "/api/v3/projects/123"
            title: A project
          principal:
            href: "/api/v3/users/567"
            title: Some user
        _type: Capability
        id: work_packages/create/p123-567
    View_global_contextModel:
      type: object
      example:
        _links:
          self:
            href: "/api/v3/capabilities/context/global"
        _type: CapabilityContext::Global
        id: global
    View_project_statusModel:
      type: object
      example:
        _type: ProjectStatus
        id: on_track
        name: On track
        _links:
          self:
            href: "/api/v3/project_statuses/on_track"
    View_time_entry_schemaModel:
      type: object
      example:
        _type: Schema
        _dependencies: []
        id:
          type: Integer
          name: ID
          required: true
          hasDefault: false
          writable: false
          options: {}
        createdAt:
          type: DateTime
          name: Created on
          required: true
          hasDefault: false
          writable: false
          options: {}
        updatedAt:
          type: DateTime
          name: Updated on
          required: true
          hasDefault: false
          writable: false
          options: {}
        spentOn:
          type: Date
          name: Date
          required: true
          hasDefault: false
          writable: true
          options: {}
        hours:
          type: Duration
          name: Hours
          required: true
          hasDefault: false
          writable: true
          options: {}
        user:
          type: User
          name: User
          required: true
          hasDefault: false
          writable: false
          options: {}
        workPackage:
          type: WorkPackage
          name: Work package
          required: false
          hasDefault: false
          writable: true
          location: _links
          _links: {}
        project:
          type: Project
          name: Project
          required: false
          hasDefault: false
          writable: true
          location: _links
          _links: {}
        activity:
          type: TimeEntriesActivity
          name: Activity
          required: true
          hasDefault: true
          writable: true
          location: _links
          _links: {}
        customField29:
          type: String
          name: sfsdfsdfsdfsdfdsf
          required: false
          hasDefault: false
          writable: true
          options:
            rtl:
        _links:
          self:
            href: "/api/v3/time_entries/schema"
    View_user_schemaModel:
      type: object
      example:
        _type: Schema
        _dependencies: []
        id:
          type: Integer
          name: ID
          required: true
          hasDefault: false
          writable: false
          options: {}
        login:
          type: String
          name: Username
          required: true
          hasDefault: false
          writable: true
          minLength: 1
          maxLength: 255
          options: {}
        admin:
          type: Boolean
          name: Administrator
          required: false
          hasDefault: false
          writable: true
          options: {}
        mail:
          type: String
          name: Email
          required: true
          hasDefault: false
          writable: true
          minLength: 1
          maxLength: 255
          options: {}
        firstName:
          type: String
          name: First name
          required: true
          hasDefault: false
          writable: false
          minLength: 1
          maxLength: 255
          options: {}
        lastName:
          type: String
          name: Last name
          required: true
          hasDefault: false
          writable: false
          minLength: 1
          maxLength: 255
          options: {}
        avatar:
          type: String
          name: Avatar
          required: false
          hasDefault: false
          writable: false
          options: {}
        status:
          type: String
          name: Status
          required: false
          hasDefault: false
          writable: true
          options: {}
        identityUrl:
          type: String
          name: Identity url
          required: false
          hasDefault: false
          writable: true
          options: {}
        language:
          type: String
          name: Language
          required: false
          hasDefault: false
          writable: true
          options: {}
        password:
          type: Password
          name: Password
          required: false
          hasDefault: false
          writable: false
          options: {}
        createdAt:
          type: DateTime
          name: Created on
          required: true
          hasDefault: false
          writable: false
          options: {}
        updatedAt:
          type: DateTime
          name: Updated on
          required: true
          hasDefault: false
          writable: false
          options: {}
        customField1:
          type: String
          name: User String CF
          required: false
          hasDefault: false
          writable: true
        customField2:
          type: CustomOption
          name: User List cf
          required: false
          hasDefault: false
          writable: true
          location: _links
        _links:
          self:
            href: "/api/v3/users/schema"
    WatchersModel:
      allOf:
      - "$ref": "#/components/schemas/CollectionModel"
      - type: object
        required:
        - _links
        - _embedded
        properties:
          _links:
            type: object
            required:
            - self
            properties:
              self:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    The watcher list

                    **Resource**: WatchersModel
                  readOnly: true
          _embedded:
            type: object
            properties:
              elements:
                type: array
                readOnly: true
                items:
                  allOf:
                  - "$ref": "#/components/schemas/UserModel"
                  - description: Collection of Users
      example:
        _links:
          self:
            href: "/api/v3/work_packages/14/watchers"
        total: 2
        count: 2
        _type: Collection
        _embedded:
          elements:
          - _type: User
            _links:
              self:
                href: "/api/v3/users/1"
                title: John Sheppard - j.sheppard
              showUser:
                href: "/users/1"
                type: text/html
              lock:
                href: "/api/v3/users/1/lock"
                title: Set lock on j.sheppard
                method: POST
              delete:
                href: "/api/v3/users/1"
                title: Delete j.sheppard
                method: DELETE
            id: 1
            login: j.sheppard
            firstName: John
            lastName: Sheppard
            mail: shep@mail.com
            avatar: https://example.org/users/1/avatar
            status: active
            createdAt: '2014-05-21T08:51:20.396Z'
            updatedAt: '2014-05-21T08:51:20.396Z'
          - _type: User
            _links:
              self:
                href: "/api/v3/users/2"
                title: Jim Sheppard - j.sheppard2
              lock:
                href: "/api/v3/users/2/lock"
                title: Set lock on j.sheppard2
                method: POST
              delete:
                href: "/api/v3/users/2"
                title: Delete j.sheppard2
                method: DELETE
            id: 2
            login: j.sheppard2
            firstName: Jim
            lastName: Sheppard
            mail: shep@mail.net
            avatar: https://example.org/users/1/avatar
            status: active
            createdAt: '2014-05-21T08:51:20.396Z'
            updatedAt: '2014-05-21T08:51:20.396Z'
    WeekDayCollectionModel:
      allOf:
      - "$ref": "#/components/schemas/CollectionModel"
      - type: object
        required:
        - _links
        - _embedded
        properties:
          _links:
            type: object
            required:
            - self
            properties:
              self:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    This week days collection

                    **Resource**: WeekDayCollectionModel
          _embedded:
            type: object
            required:
            - elements
            properties:
              elements:
                type: array
                description: The array of week days.
                minItems: 7
                maxItems: 7
                items:
                  "$ref": "#/components/schemas/WeekDayModel"
      example:
        _type: Collection
        total: 7
        count: 7
        _links:
          self:
            href: "/api/v3/days/week"
        _embedded:
          elements:
          - _type: WeekDay
            day: 1
            name: Monday
            working: true
            _links:
              self:
                href: "/api/v3/days/week/1"
                title: Monday
          - _type: WeekDay
            day: 2
            name: Tuesday
            working: true
            _links:
              self:
                href: "/api/v3/days/week/2"
                title: Tuesday
          - _type: WeekDay
            day: 3
            name: Wednesday
            working: true
            _links:
              self:
                href: "/api/v3/days/week/3"
                title: Wednesday
          - _type: WeekDay
            day: 4
            name: Thursday
            working: true
            _links:
              self:
                href: "/api/v3/days/week/4"
                title: Thursday
          - _type: WeekDay
            day: 5
            name: Friday
            working: true
            _links:
              self:
                href: "/api/v3/days/week/5"
                title: Friday
          - _type: WeekDay
            day: 6
            name: Saturday
            working: false
            _links:
              self:
                href: "/api/v3/days/week/6"
                title: Saturday
          - _type: WeekDay
            day: 7
            name: Sunday
            working: false
            _links:
              self:
                href: "/api/v3/days/week/7"
                title: Sunday
    WeekDayCollectionWriteModel:
      type: object
      required:
      - _type
      - _embedded
      properties:
        _type:
          type: string
          enum:
          - Collection
        _embedded:
          type: object
          required:
          - elements
          properties:
            elements:
              type: array
              description: The array of week days.
              minItems: 1
              maxItems: 7
              items:
                allOf:
                - "$ref": "#/components/schemas/WeekDayWriteModel"
                - type: object
                  required:
                  - _links
                  properties:
                    _links:
                      allOf:
                      - "$ref": "#/components/schemas/WeekDaySelfLinkModel"
      example:
        _type: Collection
        _embedded:
          elements:
          - _type: WeekDay
            working: true
            _links:
              self:
                href: "/api/v3/days/week/1"
          - _type: WeekDay
            working: true
            _links:
              self:
                href: "/api/v3/days/week/2"
          - _type: WeekDay
            working: true
            _links:
              self:
                href: "/api/v3/days/week/4"
          - _type: WeekDay
            working: false
            _links:
              self:
                href: "/api/v3/days/week/6"
          - _type: WeekDay
            working: false
            _links:
              self:
                href: "/api/v3/days/week/7"
    WeekDayModel:
      type: object
      required:
      - _type
      - day
      - name
      - working
      properties:
        _type:
          type: string
          enum:
          - WeekDay
        day:
          type: integer
          description: The week day from 1 to 7. 1 is Monday. 7 is Sunday.
          readOnly: true
          minimum: 1
          maximum: 7
        name:
          type: string
          description: The week day name.
        working:
          type: boolean
          description: "`true` for a working week day, `false` otherwise."
        _links:
          allOf:
          - "$ref": "#/components/schemas/WeekDaySelfLinkModel"
      example:
        _type: WeekDay
        day: 5
        name: Friday
        working: false
        _links:
          self:
            href: "/api/v3/day/week/5"
            title: Friday
    WeekDaySelfLinkModel:
      type: object
      description: Identify a particular week day by its href.
      properties:
        self:
          allOf:
          - "$ref": "#/components/schemas/Link"
          - description: |-
              This week day resource link.

              **Resource**: WeekDay
            readOnly: true
      example:
        self:
          href: "/api/v3/days/week/3"
          title: Wednesday
    WeekDayWriteModel:
      type: object
      description: Describes a week day as a working day or a non-working day (weekend).
      required:
      - _type
      - working
      properties:
        _type:
          type: string
          enum:
          - WeekDay
        working:
          type: boolean
          description: "`true` for a working day. `false` for a weekend day."
      example:
        _type: WeekDay
        working: false
    Wiki_PageModel:
      type: object
      required:
      - title
      properties:
        id:
          type: integer
          description: Identifier of this wiki page
          readOnly: true
          exclusiveMinimum: 0
        title:
          type: string
          description: The wiki page's title
        _links:
          type: object
          properties:
            addAttachment:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Attach a file to the wiki page

                  # Conditions

                  **Permission**: edit wiki page
                readOnly: true
      example:
        _type: WikiPage
        id: 72
        title: A wiki page with a name
        _embedded:
          project:
            _type: Project...
            id: 12
        _links:
          self:
            href: "/api/v3/wiki_pages/72"
          attachments:
            href: "/api/v3/wiki_pages/72/attachments"
          addAttachment:
            href: "/api/v3/wiki_pages/72/attachments"
            method: post
          project:
            href: "/api/v3/projects/12"
            title: some project
    WorkPackageModel:
      type: object
      required:
      - subject
      - _links
      properties:
        id:
          type: integer
          description: Work package id
          readOnly: true
          minimum: 1
        lockVersion:
          type: integer
          description: The version of the item as used for optimistic locking
          readOnly: true
        subject:
          type: string
          description: Work package subject
        _type:
          type: string
          enum:
          - WorkPackage
          readOnly: true
        description:
          allOf:
          - "$ref": "#/components/schemas/Formattable"
          - description: The work package description
        scheduleManually:
          type: boolean
          description: |-
            Uses manual scheduling mode when true (default). Uses automatic scheduling
            mode when false. Can be automatic only when predecessors or children are
            present.
        readonly:
          type: boolean
          description: If true, the work package is in a readonly status so with the
            exception of the status, no other property can be altered.
        startDate:
          type: string
          format: date
          description: Scheduled beginning of a work package
        dueDate:
          type: string
          format: date
          description: Scheduled end of a work package
        date:
          type: string
          format: date
          description: Date on which a milestone is achieved
        derivedStartDate:
          type: string
          format: date
          description: Similar to start date but is not set by a client but rather
            deduced by the work packages' descendants. If manual scheduleManually
            is active, the two dates can deviate.
          readOnly: true
        derivedDueDate:
          type: string
          format: date
          description: Similar to due date but is not set by a client but rather deduced
            by the work packages' descendants. If manual scheduleManually is active,
            the two dates can deviate.
          readOnly: true
        duration:
          type: string
          format: duration
          description: |-
            **(NOT IMPLEMENTED)** The amount of time in hours the work package needs to be completed.
            Not available for milestone type of work packages.
          readOnly: true
        estimatedTime:
          type: string
          format: duration
          description: Time a work package likely needs to be completed excluding
            its descendants
        derivedEstimatedTime:
          type: string
          format: duration
          description: Time a work package likely needs to be completed including
            its descendants
          readOnly: true
        ignoreNonWorkingDays:
          type: boolean
          description: |-
            **(NOT IMPLEMENTED)** When scheduling, whether or not to ignore the non working days being defined.
            A work package with the flag set to true will be allowed to be scheduled to a non working day.
          readOnly: true
        spentTime:
          type: string
          format: duration
          description: |-
            The time booked for this work package by users working on it

            # Conditions

            **Permission** view time entries
          readOnly: true
        percentageDone:
          type: integer
          description: Amount of total completion for a work package
          minimum: 0
          maximum: 100
        derivedPercentageDone:
          type: integer
          description: Amount of total completion for a work package derived from
            itself and its descendant work packages
          readOnly: true
          minimum: 0
          maximum: 100
        createdAt:
          type: string
          format: date-time
          description: Time of creation. Can be writable by admins with the `apiv3_write_readonly_attributes`
            setting enabled.
          readOnly: true
        updatedAt:
          type: string
          format: date-time
          description: Time of the most recent change to the work package.
          readOnly: true
        _links:
          type: object
          required:
          - self
          - schema
          - ancestors
          - attachments
          - author
          - children
          - priority
          - project
          - status
          - type
          properties:
            addComment:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Post comment to WP

                  # Conditions

                  **Permission**: add work package notes
                readOnly: true
            addRelation:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Adds a relation to this work package.

                  # Conditions

                  **Permission**: manage wp relations
                readOnly: true
            addWatcher:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Add any user to WP watchers

                  # Conditions

                  **Permission**: add watcher
                readOnly: true
            customActions:
              type: array
              readOnly: true
              items:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    A predefined action that can be applied to the work package.

                    **Resource**: CustomAction
                  readOnly: true
            previewMarkup:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: Post markup (in markdown) here to receive an HTML-rendered
                  response
                readOnly: true
            removeWatcher:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Remove any user from WP watchers

                  # Conditions

                  **Permission**: delete watcher
                readOnly: true
            delete:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Delete this work package

                  # Conditions

                  **Permission**: delete_work_packages
                readOnly: true
            logTime:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Create time entries on the work package

                  # Conditions

                  **Permission**: log_time or log_own_time
                readOnly: true
            move:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Link to page for moving this work package

                  # Conditions

                  **Permission**: move_work_packages
                readOnly: true
            copy:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Link to page for copying this work package

                  # Conditions

                  **Permission**: add_work_packages
                readOnly: true
            unwatch:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Remove current user from WP watchers

                  # Conditions

                  logged in; watching
                readOnly: true
            update:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Form endpoint that aids in preparing and performing edits on a work package

                  # Conditions

                  **Permission**: edit work package
                readOnly: true
            updateImmediately:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Directly perform edits on a work package

                  # Conditions

                  **Permission**: edit work package
                readOnly: true
            watch:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Add current user to WP watchers

                  # Conditions

                  logged in; not watching
                readOnly: true
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This work package

                  **Resource**: WorkPackage
                readOnly: true
            schema:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The schema of this work package

                  **Resource**: Schema
                readOnly: true
            ancestors:
              type: array
              readOnly: true
              items:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    A visible ancestor work package of the current work package.

                    **Resource**: WorkPackage

                    # Conditions

                    **Permission** view work packages
                  readOnly: true
            attachments:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The files attached to this work package

                  **Resource**: Collection

                  # Conditions

                  - **Setting**: deactivate_work_package_attachments set to false in related project
            addAttachment:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Attach a file to the work package

                  # Conditions

                  - **Permission**: edit work package
                readOnly: true
            prepareAttachment:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Attach a file to the work package

                  # Conditions

                  - **Setting**: direct uploads enabled
                readOnly: true
            author:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The person that created the work package

                  **Resource**: User
                readOnly: true
            assignee:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The person that is intended to work on the work package

                  **Resource**: User
            availableWatchers:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  All users that can be added to the work package as watchers.

                  **Resource**: User

                  # Conditions

                  **Permission** add work package watchers
                readOnly: true
            budget:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The budget this work package is associated to

                  **Resource**: Budget

                  # Conditions

                  **Permission** view cost objects
            category:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The category of the work package

                  **Resource**: Category
            children:
              type: array
              readOnly: true
              items:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    A visible child work package of the current work package.

                    **Resource**: WorkPackage

                    # Conditions

                    **Permission** view work packages
                  readOnly: true
            addFileLink:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Add a file link to the work package

                  # Conditions

                  **Permission**: manage_file_links
            fileLinks:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Gets the file link collection of this work package

                  # Conditions

                  **Permission**: view_file_links
            parent:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Parent work package

                  **Resource**: WorkPackage
            priority:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The priority of the work package

                  **Resource**: Priority
            project:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The project to which the work package belongs

                  **Resource**: Project
            projectPhase:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The project phase to which the work package belongs

                  **Resource**: ProjectPhase
            projectPhaseDefinition:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The definition of the project phase the work package belongs to

                  **Resource**: ProjectPhaseDefinition
            responsible:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The person that is responsible for the overall outcome

                  **Resource**: User
            relations:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Relations this work package is involved in

                  **Resource**: Relation

                  # Conditions

                  **Permission** view work packages
                readOnly: true
            revisions:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Revisions that are referencing the work package

                  **Resource**: Revision

                  # Conditions

                  **Permission** view changesets
                readOnly: true
            status:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The current status of the work package

                  **Resource**: Status
            timeEntries:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  All time entries logged on the work package. Please note that this is a link to an HTML resource for now and as such, the link is subject to change.

                  **Resource**: N/A

                  # Conditions

                  **Permission** view time entries
                readOnly: true
            type:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The type of the work package

                  **Resource**: Type
            version:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The version associated to the work package

                  **Resource**: Version
            watchers:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  All users that are currently watching this work package

                  **Resource**: Collection

                  # Conditions

                  **Permission** view work package watchers
                readOnly: true
      example:
        _type: WorkPackage
        _links:
          self:
            href: "/api/v3/work_packages/1528"
            title: Develop API
          schema:
            href: "/api/v3/work_packages/schemas/11-2"
          update:
            href: "/api/v3/work_packages/1528"
            method: patch
            title: Update Develop API
          delete:
            href: "/work_packages/bulk?ids=1528"
            method: delete
            title: Delete Develop API
          logTime:
            href: "/work_packages/1528/time_entries/new"
            type: text/html
            title: Log time on Develop API
          move:
            href: "/work_packages/1528/move/new"
            type: text/html
            title: Move Develop API
          attachments:
            href: "/api/v3/work_packages/1528/attachments"
          addAttachment:
            href: "/api/v3/work_packages/1528/attachments"
            method: post
          author:
            href: "/api/v3/users/1"
            title: OpenProject Admin - admin
          customActions:
          - href: "/api/v3/work_packages/1528/custom_actions/153/execute"
            method: post
            title: Reset
          - href: "/api/v3/work_packages/1528/custom_actions/94/execute"
            method: post
            title: Forward to accounting
          responsible:
            href: "/api/v3/users/23"
            title: Laron Leuschke - Alaina5788
          relations:
            href: "/api/v3/work_packages/1528/relations"
            title: Show relations
          revisions:
            href: "/api/v3/work_packages/1528/revisions"
          assignee:
            href: "/api/v3/users/11"
            title: Emmie Okuneva - Adele5450
          priority:
            href: "/api/v3/priorities/2"
            title: Normal
          project:
            href: "/api/v3/projects/1"
            title: A Test Project
          status:
            href: "/api/v3/statuses/1"
            title: New
          type:
            href: "/api/v3/types/1"
            title: A Type
          version:
            href: "/api/v3/versions/1"
            title: Version 1
          availableWatchers:
            href: "/api/v3/work_packages/1528/available_watchers"
          watch:
            href: "/api/v3/work_packages/1528/watchers"
            method: post
            payload:
              user:
                href: "/api/v3/users/1"
          addWatcher:
            href: "/api/v3/work_packages/1528/watchers"
            method: post
            payload:
              user:
                href: "/api/v3/users/{user_id}"
            templated: true
          removeWatcher:
            href: "/api/v3/work_packages/1528/watchers/{user_id}"
            method: delete
            templated: true
          addRelation:
            href: "/api/v3/relations"
            method: post
            title: Add relation
          changeParent:
            href: "/api/v3/work_packages/694"
            method: patch
            title: Change parent of Bug in OpenProject
          addComment:
            href: "/api/v3/work_packages/1528/activities"
            method: post
            title: Add comment
          parent:
            href: "/api/v3/work_packages/1298"
            title: nisi eligendi officiis eos delectus quis voluptas dolores
          category:
            href: "/api/v3/categories/1298"
            title: eligend isi
          children:
          - href: "/api/v3/work_packages/1529"
            title: Write API documentation
          ancestors:
          - href: "/api/v3/work_packages/1290"
            title: Root node of hierarchy
          - href: "/api/v3/work_packages/1291"
            title: Intermediate node of hierarchy
          - href: "/api/v3/work_packages/1298"
            title: nisi eligendi officiis eos delectus quis voluptas dolores
          timeEntries:
            href: "/work_packages/1528/time_entries"
            type: text/html
            title: Time entries
          watchers:
            href: "/api/v3/work_packages/1528/watchers"
          customField3:
            href: api/v3/users/14
        id: 1528
        subject: Develop API
        description:
          format: markdown
          raw: Develop super cool OpenProject API.
          html: "<p>Develop super cool OpenProject API.</p>"
        scheduleManually: false
        readonly: false
        startDate:
        dueDate:
        derivedStartDate:
        derivedDueDate:
        estimatedTime: PT2H
        derivedEstimatedTime: PT10H
        percentageDone: 0
        customField1: Foo
        customField2: 42
        createdAt: '2014-08-29T12:40:53.373Z'
        updatedAt: '2014-08-29T12:44:41.981Z'
    WorkPackageFormModel:
      type: object
      description: |-
        The work package creation form. This object is returned, whenever a work package form endpoint is called. It contains
        an allowed payload definition, the full schema and any validation errors on the current request body.
      properties:
        _type:
          type: string
          enum:
          - Form
        _embedded:
          type: object
          properties:
            payload:
              "$ref": "#/components/schemas/WorkPackageWriteModel"
            schema:
              "$ref": "#/components/schemas/WorkPackageSchemaModel"
            validationErrors:
              type: object
              description: |-
                All validation errors, where the key is the faulty property. The object is empty, if the request body is
                valid.
        _links:
          type: object
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This form endpoint

                  **Resource** : Form
            validate:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: The endpoint for validating the request bodies. Often
                  referring to this very form endpoint.
            previewMarkup:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: Renders a markup preview for the work package form.
            customFields:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: Link to the HTML page for the custom field definitions.
            configureForm:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: Link to the HTML page for the form configuration.
    WorkPackagePatchModel:
      allOf:
      - "$ref": "#/components/schemas/WorkPackageWriteModel"
      - type: object
        required:
        - lockVersion
        properties:
          lockVersion:
            type: integer
            description: The version of the item as used for optimistic locking
    WorkPackageSchemaModel:
      type: object
      description: |-
        A schema for a work package. This schema defines the attributes of a work package.

        TODO: Incomplete, needs to be updated with the real behaviour of schemas (when does which attribute appear?).
      properties:
        _type:
          type: string
          enum:
          - Schema
        _dependencies:
          type: array
          items:
            type: string
          description: TBD
        _attributeGroups:
          type: array
          items:
            type: object
          description: TBD (WorkPackageFormAttributeGroup)
        lockVersion:
          "$ref": "#/components/schemas/SchemaPropertyModel"
        id:
          "$ref": "#/components/schemas/SchemaPropertyModel"
        subject:
          "$ref": "#/components/schemas/SchemaPropertyModel"
        description:
          "$ref": "#/components/schemas/SchemaPropertyModel"
        duration:
          "$ref": "#/components/schemas/SchemaPropertyModel"
        scheduleManually:
          "$ref": "#/components/schemas/SchemaPropertyModel"
        ignoreNonWorkingDays:
          "$ref": "#/components/schemas/SchemaPropertyModel"
        startDate:
          "$ref": "#/components/schemas/SchemaPropertyModel"
        dueDate:
          "$ref": "#/components/schemas/SchemaPropertyModel"
        derivedStartDate:
          "$ref": "#/components/schemas/SchemaPropertyModel"
        derivedDueDate:
          "$ref": "#/components/schemas/SchemaPropertyModel"
        estimatedTime:
          "$ref": "#/components/schemas/SchemaPropertyModel"
        derivedEstimatedTime:
          "$ref": "#/components/schemas/SchemaPropertyModel"
        remainingTime:
          "$ref": "#/components/schemas/SchemaPropertyModel"
        derivedRemainingTime:
          "$ref": "#/components/schemas/SchemaPropertyModel"
        percentageDone:
          "$ref": "#/components/schemas/SchemaPropertyModel"
        derivedPercentageDone:
          "$ref": "#/components/schemas/SchemaPropertyModel"
        readonly:
          "$ref": "#/components/schemas/SchemaPropertyModel"
        createdAt:
          "$ref": "#/components/schemas/SchemaPropertyModel"
        updatedAt:
          "$ref": "#/components/schemas/SchemaPropertyModel"
        author:
          "$ref": "#/components/schemas/SchemaPropertyModel"
        project:
          "$ref": "#/components/schemas/SchemaPropertyModel"
        projectPhase:
          "$ref": "#/components/schemas/SchemaPropertyModel"
        projectPhaseDefinition:
          "$ref": "#/components/schemas/SchemaPropertyModel"
        parent:
          "$ref": "#/components/schemas/SchemaPropertyModel"
        assignee:
          "$ref": "#/components/schemas/SchemaPropertyModel"
        responsible:
          "$ref": "#/components/schemas/SchemaPropertyModel"
        type:
          "$ref": "#/components/schemas/SchemaPropertyModel"
        status:
          "$ref": "#/components/schemas/SchemaPropertyModel"
        category:
          "$ref": "#/components/schemas/SchemaPropertyModel"
        version:
          "$ref": "#/components/schemas/SchemaPropertyModel"
        priority:
          "$ref": "#/components/schemas/SchemaPropertyModel"
        _links:
          type: object
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  This work package schema

                  **Resource**: Schema
    WorkPackageWriteModel:
      type: object
      description: |-
        This model is used for creating and updating work packages. It can also be used for validation against the work
        package form endpoints.
      properties:
        subject:
          type: string
          description: Work package subject
        description:
          allOf:
          - "$ref": "#/components/schemas/Formattable"
          - description: The work package description
        scheduleManually:
          type: boolean
          description: |-
            Uses manual scheduling mode when true (default). Uses automatic scheduling
            mode when false. Can be automatic only when predecessors or children are
            present.
        startDate:
          type:
          - string
          - 'null'
          format: date
          description: Scheduled beginning of a work package
        dueDate:
          type:
          - string
          - 'null'
          format: date
          description: Scheduled end of a work package
        estimatedTime:
          type:
          - string
          - 'null'
          format: duration
          description: Time a work package likely needs to be completed excluding
            its descendants
        duration:
          type:
          - string
          - 'null'
          format: duration
          description: |-
            The amount of time in hours the work package needs to be completed. This value must be bigger or equal to `P1D`,
            and any the value will get floored to the nearest day.

            The duration has no effect, unless either a start date or a due date is set.

            Not available for milestone type of work packages.
        ignoreNonWorkingDays:
          type: boolean
          description: |-
            When scheduling, whether or not to ignore the non working days being defined.
            A work package with the flag set to true will be allowed to be scheduled to a non working day.
        _links:
          type: object
          properties:
            category:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The category of the work package

                  **Resource**: Category
            type:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The type of the work package

                  **Resource**: Type
            priority:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The priority of the work package

                  **Resource**: Priority
            project:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The project to which the work package belongs

                  **Resource**: Project
            status:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The current status of the work package

                  **Resource**: Status
            responsible:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The person that is responsible for the overall outcome

                  **Resource**: User
            assignee:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The person that is intended to work on the work package

                  **Resource**: User
            version:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  The version associated to the work package

                  **Resource**: Version
            parent:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: |-
                  Parent work package

                  **Resource**: WorkPackage
    Work_Package_activitiesModel:
      type: object
      example:
        _links:
          self:
            href: "/api/v3/work_packages/1/revisions"
        total: 2
        count: 2
        _type: Collection
        _embedded:
          elements:
          - _type: Activity
            _links:
              self:
                href: "/api/v3/activity/1"
              workPackage:
                href: "/api/v3/work_packages/1"
              user:
                href: "/api/v3/users/1"
            id: 1
            details: []
            comment:
              format: markdown
              raw: Lorem ipsum dolor sit amet.
              html: "<p>Lorem ipsum dolor sit amet.</p>"
            createdAt: '2014-05-21T08:51:20.396Z'
            updatedAt: '2014-05-21T09:14:02.324Z'
            version: 1
          - _type: Activity
            _links:
              self:
                href: "/api/v3/activity/2"
              workPackage:
                href: "/api/v3/work_packages/1"
              user:
                href: "/api/v3/users/1"
            id: 2
            details: []
            comment:
              format: markdown
              raw: Lorem ipsum dolor sit amet.
              html: "<p>Lorem ipsum dolor sit amet.</p>"
            createdAt: '2014-05-21T09:51:22.769Z'
            updatedAt: '2014-05-21T10:14:02.927Z'
            version: 2
    Work_PackagesModel:
      allOf:
      - "$ref": "#/components/schemas/CollectionModel"
      - type: object
        required:
        - _links
        - _embedded
        properties:
          _links:
            type: object
            required:
            - self
            properties:
              self:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: |-
                    The work package collection

                    **Resource**: WorkPackageCollection
                  readOnly: true
          _embedded:
            type: object
            required:
            - elements
            properties:
              elements:
                type: array
                items:
                  "$ref": "#/components/schemas/WorkPackageModel"
      example:
        _links:
          self:
            href: "/api/v3/work_packages"
        total: 2
        count: 2
        _type: Collection
        _embedded:
          elements:
          - _hint: Work package resource shortened for brevity
            _type: WorkPackage
            _links:
              self:
                href: "/api/v3/work_packages/1"
            id: 1
          - _hint: Work package resource shortened for brevity
            _type: WorkPackage
            _links:
              self:
                href: "/api/v3/work_packages/2"
            id: 2
    EmojiReactionModel:
      type: object
      properties:
        _type:
          type: string
          enum:
          - EmojiReaction
        id:
          type: string
          description: 'Emoji reaction id (format: reactable_id-reaction)'
          example: 1-thumbs_up
        reaction:
          type: string
          description: The reaction identifier
          example: thumbs_up
        emoji:
          type: string
          description: The emoji character
          example: "\U0001F44D"
        reactionsCount:
          type: integer
          description: Number of users who reacted with this emoji
          minimum: 1
          example: 3
        firstReactionAt:
          type: string
          format: date-time
          description: Time of the first reaction
        _links:
          type: object
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: This emoji reaction
            reactable:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: The activity this emoji reaction belongs to
            reactingUsers:
              type: array
              items:
                allOf:
                - "$ref": "#/components/schemas/Link"
                - description: The users who reacted with this emoji
      example:
        _type: EmojiReaction
        id: 1-thumbs_up
        reaction: thumbs_up
        emoji: "\U0001F44D"
        reactionsCount: 3
        firstReactionAt: '2024-04-08T15:37:19.275Z'
        _links:
          self:
            href: "/api/v3/emoji_reactions/1-thumbs_up"
          reactable:
            href: "/api/v3/activities/1"
          reactingUsers:
          - href: "/api/v3/users/435"
            title: John Doe
          - href: "/api/v3/users/436"
            title: Jane Smith
          - href: "/api/v3/users/437"
            title: Bob Johnson
    EmojiReactions_Model:
      type: object
      properties:
        _type:
          type: string
          enum:
          - Collection
        total:
          type: integer
          description: Total number of emoji reactions
          minimum: 0
        count:
          type: integer
          description: Number of emoji reactions in this response
          minimum: 0
        _embedded:
          type: object
          properties:
            elements:
              type: array
              items:
                "$ref": "#/components/schemas/EmojiReactionModel"
        _links:
          type: object
          properties:
            self:
              allOf:
              - "$ref": "#/components/schemas/Link"
              - description: This collection
      example:
        _type: Collection
        total: 2
        count: 2
        _embedded:
          elements:
          - _type: EmojiReaction
            id: 1-thumbs_up
            reaction: thumbs_up
            emoji: "\U0001F44D"
            reactionsCount: 3
            firstReactionAt: '2024-04-08T15:37:19.275Z'
            _links:
              self:
                href: "/api/v3/emoji_reactions/1-thumbs_up"
              reactable:
                href: "/api/v3/activities/1"
              reactingUsers:
              - href: "/api/v3/users/435"
                title: John Doe
              - href: "/api/v3/users/436"
                title: Jane Smith
              - href: "/api/v3/users/437"
                title: Bob Johnson
          - _type: EmojiReaction
            id: 1-heart
            reaction: heart
            emoji: "❤️"
            reactionsCount: 1
            firstReactionAt: '2024-04-08T15:38:19.275Z'
            _links:
              self:
                href: "/api/v3/emoji_reactions/1-heart"
              reactable:
                href: "/api/v3/activities/1"
              reactingUsers:
              - href: "/api/v3/users/435"
                title: John Doe
        _links:
          self:
            href: "/api/v3/activities/1/emoji_reactions"
  securitySchemes:
    BasicAuth:
      type: http
      scheme: basic
tags:
- description: |-
    ## Links

    Links to other resources in the API are represented uniformly by so called link objects.

    ### Local Properties

    | Property  | Description                                                              | Type    | Required | Nullable | Default     |
    |:---------:| ------------------------------------------------------------------------ | ------- |:--------:|:--------:| ----------- |
    | href      | URL to the referenced resource (might be relative)                       | String  |    ✓     |    ✓     |             |
    | title     | Representative label for the resource                                    | String  |          |          |             |
    | templated | If true the `href` contains parts that need to be replaced by the client | Boolean |          |          | false       |
    | method    | The HTTP verb to use when requesting the resource                        | String  |          |          | GET         |
    | payload   | The payload to send in the request to achieve the desired result         | String  |          |          | unspecified |
    | identifier| An optional unique identifier to the link object                         | String  |          |          | unspecified |

    All link objects *must* contain the `href` property, though it might be `null`. Thus the following is a valid
    link object: `{ "href": null }`  whereas `{ }` is not a valid link object.
    The meaning of `"href": null` is that **no** resource is referenced.
    For example a work package without an assignee will still have an assignee link, but its `href` will be `null`.

    If a `title` is present, the client can display the title to the user when referring to the resource.

    Templated links are links that contain client replaceable parts. Replaceable parts are enclosed in braces. For example
    the link `api/v3/example/{id}` is not complete in itself, but the client needs to replace the string `{id}` itself.
    As of now the API does not indicate the valid replacement values.

    The `method` indicates which HTTP verb the client *must* use when following the link for the intended purpose.

    If a `payload` is specified, it needs to be sent as the body of the request to achieve the desired result (e.g. perform the
    action represented by the link). If no `payload` is specified, there is either no payload to send or a valid payload is not specified
    by the link object. A payload might also be templated slightly. If the `templated` property is true, a payload might contain replaceable parts
    in its strings (e.g. `{ "href": "/api/v3/examples/{example_id}" }`).

    Note: When writing links (e.g. during a `PATCH` operation) only changes to `href` are accepted.
    Changes to all other properties will be **silently ignored**.

    For resources invisible to the client (e.g. because of missing permissions), a link will contain
    the uri `urn:openproject-org:api:v3:undisclosed` instead of a url. This indicates the existence of a value
    without revealing the actual value. An example for this is the parent project. A project resource which itself might be
    visible to the client can have a reference to a parent project invisible to the same client. Revealing the existence of
    a parent over hiding has the benefit of allowing the client to make an informed decision of whether to keep the existing reference
    or updating it. Sending ‘{ "href": "urn:openproject-org:api:v3:undisclosed" }` for a resource will have the effect of keeping the
    original value. This is especially beneficial if the client creates and updates resources based on the payload object provided
    as part of a form as is recommended when interacting with the API.

    ## Errors

    In case of an error, the API will respond with an appropriate HTTP status code.
    For responses with an HTTP status of `4xx` and `5xx` the body will always contain a single error object.
    Error objects shall give the client additional details about the cause of an erroneous response.

    ### General errors

    * Error objects have their `_type` set to `Error`

    * The `errorIdentifier` serves as a unique (and machine readable) identifier for a specific error cause
        * There *may* be multiple possible error identifiers per HTTP status code
        * There *may* be multiple possible HTTP status codes per error identifier
        * The "List of Error Identifiers" defines the possible mappings between HTTP status and error identifier

    * The `message` contains a human readable concise message describing the error
        * It *optionally* includes specific information, for example which permission would have been needed to perform an action
        * It is localized depending on the users preferences
        * It *must not* include HTML or other kind of markup
        * Error messages form complete sentences including punctuation

    #### Example

    ```json
    {
      "_type": "Error",
      "errorIdentifier": "urn:openproject-org:api:v3:errors:InternalServerError",
      "message": "An internal server error occurred. This is not your fault."
    }
    ```

    ### Embedded error information

    Errors might optionally contain embedded objects that contain further information.

    #### Error details

    Under the embedded key `details` there might be an object describing the error more verbosely. For example if the
    error affects a specific field, this field could be defined there.

    ##### Example

    ```json
    {
      "_type": "Error",
      "errorIdentifier": "urn:openproject-org:api:v3:examples:ExampleError",
      "message": "This is an example error.",
      "_embedded": {
        "details": {
          "_type": "ExampleErrorDetailInformation",
          "erroneousField": "subject"
        }
      }
    }
    ```

    #### Multiple error objects

    To ease implementation of basic clients it is guaranteed that the response body always only contains a single error object.
    However it is allowed that an error object *embeds* other error objects under the key `errors`, thereby aggregating them.

    The `errorIdentifier` of such an object is always `urn:openproject-org:api:v3:errors:MultipleErrors`. The message can either describe one of the
    embedded errors or simply state that multiple errors occurred.

    ##### Example

    ```json
    {
      "_type": "Error",
      "errorIdentifier": "urn:openproject-org:api:v3:errors:MultipleErrors",
      "message": "Multiple fields violated their constraints.",
      "_embedded": {
        "errors": [
          {
            "_type": "Error",
            "errorIdentifier": "urn:openproject-org:api:v3:errors:PropertyConstraintViolation",
            "...": "..."
          },
          {
            "_type": "Error",
            "errorIdentifier": "urn:openproject-org:api:v3:errors:PropertyConstraintViolation",
            "...": "..."
          }
        ]
      }
    }
    ```

    ### List of Error Identifiers

    * `urn:openproject-org:api:v3:errors:InvalidQuery` (**HTTP 400**)
    The query contained a value that did not match the servers expectation

    * `urn:openproject-org:api:v3:errors:InvalidRenderContext` (**HTTP 400**)
    The client specified a rendering context that does not exist

    * `urn:openproject-org:api:v3:errors:InvalidRequestBody` (**HTTP 400**)
    The format of the request body did not match the servers expectation

    * `urn:openproject-org:api:v3:errors:InvalidSignal` (**HTTP 400**)
    The client specified a select not available on the resource, e.g because the property/link does not exist on it.

    * `urn:openproject-org:api:v3:errors:InvalidUserStatusTransition` (**HTTP 400**)
    The client used an invalid transition in the attempt to change the status of a user account.

    * `urn:openproject-org:api:v3:errors:Unauthenticated` (**HTTP 401**)
    The client has to authenticate to access the requested resource.

    * `urn:openproject-org:api:v3:errors:MissingPermission` (**HTTP 403**)
    The client does not have the needed permissions to perform the requested action

    * `urn:openproject-org:api:v3:errors:NotFound` (**HTTP 404**)
    Default for HTTP 404 when no further information is available

    * `urn:openproject-org:api:v3:errors:UpdateConflict` (**HTTP 409**)
    The resource changed between GET-ing it and performing an update on it

    * `urn:openproject-org:api:v3:errors:TypeNotSupported` (**HTTP 415**)
    The request contained data in an unsupported media type (Content-Type)

    * `urn:openproject-org:api:v3:errors:PropertyConstraintViolation` (**HTTP 422**)
    The client tried to set a property to an invalid value

    * `urn:openproject-org:api:v3:errors:PropertyIsReadOnly` (**HTTP 422**)
    The client tried to set or change a property that is not writable

    * `urn:openproject-org:api:v3:errors:PropertyFormatError` (**HTTP 422**)
    A property value was provided in a format that the server does not understand or accept

    * `urn:openproject-org:api:v3:errors:PropertyMissingError` (**HTTP 422**)
    The request is syntactically correct, but is missing a property to perform the requested action

    * `urn:openproject-org:api:v3:errors:PropertyValueNotAvailableAnymore` (**HTTP 422**)
    An unchanged property needs to be changed, because other changes to the resource make it unavailable

    * `urn:openproject-org:api:v3:errors:ResourceTypeMismatch` (**HTTP 422**)
    A link to a resource of a specific type was expected, but the link to another type of resource was provided

    * `urn:openproject-org:api:v3:errors:InternalServerError` (**HTTP 500**)
    Default for HTTP 500 when no further information is available

    * `urn:openproject-org:api:v3:errors:MultipleErrors`
    Multiple errors occurred. See the embedded `errors` array for more details.

    ## Formattable Text

    OpenProject supports text formatting in Markdown. Properties that contain formattable text have a special representation in this API. In this specification their
    type is indicated as `Formattable`. Their representation contains the following properties:

    | Property | Description                                        | Type   | Example                            | Supported operations |
    |:--------:| -------------------------------------------------- | ------ | ---------------------------------- | -------------------- |
    | format   | Indicates the formatting language of the raw text  | String | markdown                           | READ                 |
    | raw      | The raw text, as entered by the user               | String | `I **am** formatted!`              | READ / WRITE         |
    | html     | The text converted to HTML according to the format | String | `I <strong>am</strong> formatted!` | READ                 |

    `format` can as of today have one of the following values:

    * `plain` - only basic formatting, e.g. inserting paragraphs and line breaks into HTML

    * `markdown` - formatting using Markdown

    * `custom` - There is no apparent formatting rule that transforms the raw version to HTML (only used for read only properties)

    Note that `raw` is the only property supporting the **write** operation. A property of type *Formattable* that
    is marked as **read and write**, will only accept changes to the `raw` property. Changes to `format` and `html` will be **silently ignored**.
    It is thus sufficient to solely provide the `raw` property for changes.

    If the *Formattable* is marked as **read only**, the `raw` attribute also becomes **read only**.

    ### Example

    ```json
    {
      "format": "markdown",
      "raw": "I **am** formatted!",
      "html": "I <strong>am</strong> formatted!"
    }
    ```

    ## Dates, Times, Durations and Timestamps

    Representation of time related values in this API is done according to [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601).
    In this specification the following terms will be used as type specifiers (e.g. in tables):

    * `Date` - refers to an ISO 8601 date, e.g. "2014-05-21"

    * `DateTime` - refers to an ISO 8601 combined date and time, optionally with milliseconds, e.g. "2014-05-21T13:37:00Z" or "2014-05-21T13:37:00.396Z"

    * `Duration` - refers to an ISO 8601 duration, e.g. "P1DT18H"

    * `Timestamp` - refers to an ISO 8601 combined date and time, e.g. "2014-05-21T13:37:00Z" or to an ISO 8601 duration, e.g. "P1DT18H".
    The following shorthand values are also being parsed as duration: "1d", "1w", "1m", "1y", "1y-2m", "-2y".
    It can also refer the following relative date keywords: `"oneDayAgo@HH:MM+HH:MM", "lastWorkingDay@HH:MM+HH:MM", "oneWeekAgo@HH:MM+HH:MM", "oneMonthAgo@HH:MM+HH:MM"`.
    The `"HH:MM"` part represents the zero padded hours and minutes, e.g. `"oneMonthAgo@21:00+00:00"`. The last "+HH:MM" part represents the timezone offset from UTC
    associated with the time, e.g. `"oneMonthAgo@21:00+02:00"` means a +2 hour timezone offset from UTC.
    The offset can be positive or negative e.g."oneDayAgo@01:00+01:00", "oneDayAgo@01:00-01:00".
    Values older than 1 day are accepted only with valid Enterprise Token available.

    ## Colors

    Colors are represented in RGB using hexadecimal notation as specified in [CSS Color Module Level 3](https://www.w3.org/TR/css3-color/).
    That is a `#` followed by either three or six hexadecimal digits.

    ### Example

    ```
        red:   #ff0000 or #f00
        green: #00ff00 or #0f0
        black: #000000 or #000
        white: #ffffff or #fff
    ```

    ## Digests

    Digests (or Hashes) are one way functions that map data of arbitrary size to data of a fixed size.
    In OpenProject they are for example used to calculate checksums for (attachment) files.
    The checksum calculated depends on the hashed data and the algorithm used as hash function.

    Therefore all digests are represented in the following form:

    | Property  | Description                                        | Type   | Example                            |
    |:---------:| -------------------------------------------------- | ------ | ---------------------------------- |
    | algorithm | The algorithm used to compute the digest           | String | md5                                |
    | hash      | The calculated digest in hexadecimal notation      | String | 64c26a8403cd796ea4cf913cda2ee4a9   |

    ### Example

    ```json
    {
      "algorithm": "md5",
      "hash": "64c26a8403cd796ea4cf913cda2ee4a9"
    }
    ```
  name: Basic Objects
- description: |-
    Whenever a client calls a resource that can return more than one element, it will receive a collection of elements.
    However as collections can become quite large, the API will **not** simply return a JSON array, but a special collection
    object that will contain the actual elements in its embedded property `elements`.

    Collections *may* be paginated, this means that a single response from the server will not contain all elements of the collection,
    but only a subset. In this case the client can issue further requests to retrieve the remaining elements.
    There are two ways to access the result pages of a paginated collection:

    * offset based pagination

    * cursor based pagination

    The available ways of pagination depend on the collection queried. Some collections feature no pagination at all, meaning they
    will always return all elements. Others might only offer one of the two pagination methods or both of them.

    A collection also carries meta information like the total count of elements in the collection or - in case of a paginated collection -
    the amount of elements returned in this response and action links to retrieve the remaining elements.

    ## Local Properties

    | Property | Description                                                     | Type    | Availability                |
    |:--------:| --------------------------------------------------------------- | ------- | --------------------------- |
    | total    | The total amount of elements available in the collection        | Integer | always                      |
    | pageSize | Amount of elements that a response will hold                    | Integer | when paginated              |
    | count    | Actual amount of elements in this response                      | Integer | always                      |
    | offset   | The page number that is requested from paginated collection     | Integer | when offset based available |
    | groups   | Summarized information about aggregation groups                 | Object  | when grouping               |
    | totalSums| Aggregations of supported values for elements of the collection | Object  | when showing sums           |

    ## Links

    | Link             | Description                                                              | Availability                |
    |:----------------:| ------------------------------------------------------------------------ | --------------------------- |
    | self             | Link to the current page in the collection                               | always                      |
    | changeSize       | Templated link to change the page size, might change relative position   | when paginated              |
    | jumpTo           | Templated link to jump to a specified offset                             | when offset based available |
    | nextByOffset     | Link to retrieve the following page of elements (offset based)           | when offset based available |
    | previousByOffset | Link to retrieve the preceding page of elements (offset based)           | when offset based available |
    | nextByCursor     | Link to retrieve the elements following the current page (cursor based)  | when cursor based available |
    | previousByCursor | Link to retrieve the elements preceding the current page (cursor based)  | when cursor based available |
  name: Collections
- description: |-
    Filter objects can be added to a number of endpoints in the OpenProject APIv3. With them, you can create powerful queries to endpoints to return the data that you want.

    They all share the following basic properties:

    - They consist of three items: A property to filter or a specific filter name, one or more values, and a filter operator that defines what query to produce with the given values

    - You can combine any number of distinct filters can be added to the endpoint definitions in this API documentation

    - A combination of filter objects are treated as an AND filter. OR filters are not yet possible in a single query.

    ## Filter syntax

    The filter syntax is a JSON object that can be passed as a GET parameter to the endpoints as an URL-encoded JSON string looks like the following:

    ```json5
    [
      { "<filter name>": { "operator": "<operator>", "values": [<value>, ...] } },
      // ...
    ]
    ```

    **Example**

    Filtering the work packages API endpoint for a work package that matches the subject or ID "12" and has a status with the ID=5.

    ```json
    [
      { "subjectOrId": { "operator": "**", "values": ["12"] } },
      { "status": { "operator": "=", "values": ["5"] } }
    ]
    ```

    With the above JSON stringified and URL-encoded, this can be added to the `/api/v3/work_packages` endpoint using the `filter` parameter to form the URL:

    ```
    https://community.openproject.org/api/v3/work_packages?filters=%5B%7B%22subjectOrId%22:%7B%22operator%22:%22**%22,%22values%22:%5B%2212%22%5D%7D%7D,%7B%22status%22:%7B%22operator%22:%22=%22,%22values%22:%5B%225%22%5D%7D%7D%5D
    ```

    ## Compression

    As the above can become quite long, especially if a lot of filter values are included, the API offers to wrap all query props into a zlib compressed and base64 encoded property (`eprops`).
    The property will then not only include the filter but the complete query props set (e.g. `pageSize`, `offset` and `columns`. So `eprops` is then a JSON object that is compressed and encoded.

    **Example**

    Instead of the request

    ```
    https://community.openproject.org/api/v3/work_packages?filters=[%7B%22subjectOrId%22:%7B%22operator%22:%22**%22,%22values%22:[%2212%22]%7D%7D,%7B%22status%22:%7B%22operator%22:%22=%22,%22values%22:[%225%22]%7D%7D]&pageSize=10&sortBy=[[%22id%22,%20%22asc%22]]
    ```

    Which in a non URL encoded style would be

    ```
    https://community.openproject.org/api/v3/work_packages?filters=[{"subjectOrId":{"operator":"**","values":["12"]}},{"status":{"operator":"=","values":["5"]}}]&pageSize=10&sortBy=[["id", "asc"]]
    ```

    All of the props can be put inside a json object

    ```json
    {
      "filters": "[{\"subjectOrId\":{\"operator\":\"**\",\"values\":[\"12\"]}},{\"status\":{\"operator\":\"=\",\"values\":[\"5\"]}}]",
      "sortBy": "[[\"id\",\"asc\"]]",
      "pageSize": 10
    }
    ```

    Please note, that all objects that have to be json (e.g `filters`) will be double encoded.

    That json object can then be compressed and encoded and the result sent over as the combined `eprops` parameter:

    ```
    https://community.openproject.org/api/v3/work_packages?eprops=eJxtjTELwjAUhP%2FLjSWDFVwCLt2cHBz7OsT2VSKFlLwXQUv%2Bu0lXHe%2B7%2B7gN%0As1%2BUo8Ci3wiS7k8e9RovE8EWEFaOTkMsidA0BEN4uSWxFNIT2iNhyNlUV50m%0A%2BaOdf6zTLg0wkBC1e9f3gv20L52Mpa%2Ft6h588x%2BGbQ%2F5C12YN%2BM%3D%0A
    ```

    ## Available filters

    The availability of filters depend on the endpoint you're querying and will be listed in each endpoint definition. For work packages, you can also [start using filters in the work packages module](https://community.openproject.org/projects/openproject/work_packages) to build your query and then simply copy the URL from your browser to get the resulting filter values and their operators.

    ## Available operators

    The following table is a list of all available operators. Not all endpoints and parameters support all values, but this list serves as a lookup table for identifying and using the operators. When building a filter object, you use the **symbol** listed below.

    | Symbol | Description of filtered properties                           | Values array contains      |
    | ------ | ------------------------------------------------------------ | -------------------------- |
    | `=`    | are equal to one of the given value(s)                       | At least one typed value   |
    | `&=`   | are containing all of the given value(s)                     | At least one typed value   |
    | `!`    | are not equal one of the given value(s)                      | At least one typed value   |
    | `>=`   | are greater or equal than the given value                    | One numerical value        |
    | `<=`   | are lesser or equal than the given value                     | One numerical value        |
    | `t-`   | are the given number of days in the past                     | 1 integer (days)           |
    | `t+`   | are the given number of days in the future                   | 1 integer (days)           |
    | `<t+`  | are *less than* the given number of days in the future       | 1 integer (days)           |
    | `>t+`  | are *more than* the given number of days in the future       | 1 integer (days)           |
    | `>t-`  | are *less than* the given number of days in the past         | 1 integer (days)           |
    | `<t-`  | are *more than* the given number of days in the past         | 1 integer (days)           |
    | `*`    | are not NULL                                                 | *nothing, values is empty* |
    | `!*`   | are NULL                                                     | *nothing, values is empty* |
    | `**`   | searches the given string in all string-based attributes     | One string value           |
    | `=d`   | are on the given date                                        | 1 ISO8601 date/datetime    |
    | `<>d`  | are between the two given dates.                             | 2 ISO8601 date/datetimes   |
    | `w`    | are in this week                                             | *nothing, values is empty* |
    | `t`    | are today                                                    | *nothing, values is empty* |
    | `~`    | are containing the given words (SQL LIKE) in that order      | At least one string value  |
    | `!~`   | are *not* containing the given words (SQL LIKE) in that order | At least one string value  |

    ​

    **Special operators for work packages**

    There are some additional operators only in use for work packages:

    | Symbol | Description of filtered properties         | Values array contains      |
    | ------ | ------------------------------------------ | -------------------------- |
    | `o`    | the status of the work package is *open*   | *nothing, values is empty* |
    | `c`    | the status of the work package is *closed* | *nothing, values is empty* |
    | `ow`   | the work packages have a manual sort order | *nothing, values is empty* |

    There are also relation filters for work packages that have the symbols `blocks/blocked` `children/parent` `follows/precedes` `duplicates/duplicated` `partof/includes` `relates` `requires/required` depending on the direction of the relation and take as value the work package ID that is the target node of the relation.

    **Special values for boolean filters**

    If you're using an operator that requires boolean values, please note that they need to be presented in this form:

    - `['f']` for false
    - `['t']` for true
  name: Filters
- description: |-
    Baseline comparisons allow to compare work packages or collections of work packages with respect to different points in time.

    This helps to answer questions like:

    - Which work packages match a certain set of filters today, which work packages match this set of filters at a certain earlier point in time?
    - Which properties of these work packages have changed with respect to these points in time?

    This tool can be used to analyze how a project plan has changed with respect to a certain baseline date.

    ## Requesting Work Packages for Different Timestamps

    The work-packages API supports a `timestamps` parameter to gather information about a single work package or a collection of work packages for several points in time.

    ```
    GET /api/v3/work_packages?timestamps=2022-01-01T00:00:00Z,PT0S
    ```

    ```
    GET /api/v3/work_packages/123?timestamps=2022-01-01T00:00:00Z,PT0S
    ```

    Each timestamp should be given as an [ISO-8601](https://en.wikipedia.org/wiki/ISO_8601) string, either an absolute date and time with timezone, e.g. `"2022-01-01T00:00:00Z"`, or a relative timestamp utilizing the [ISO-8601-Duration](https://en.wikipedia.org/wiki/ISO_8601#Durations) format, e.g. `"P-1Y"`, which is composed of an initial `"P"` for "Period", and a duration. `"P-1Y"` is interpreted as the relative timestamp "1 year ago".
    Furthermore, a set of predefined relative date keywords can also be passed for the timestamps: `"oneDayAgo@HH:MM+HH:MM", "lastWorkingDay@HH:MM+HH:MM", "oneWeekAgo@HH:MM+HH:MM", "oneMonthAgo@HH:MM+HH:MM"`. The `"HH:MM"` part represents the zero paded hours and minutes, e.g. `"oneMonthAgo@21:00+00:00"`. The last "+HH:MM" part represents the timezone offset from UTC associated with the time,
    e.g. `"oneMonthAgo@21:00+02:00"` means a +2 hour timezone offset from UTC. The offset can be positive or negative e.g."oneDayAgo@01:00+01:00", "oneDayAgo@01:00-01:00".

    Several timestamps should be passed as comma-separated list of these ISO-8601 strings to the `timestamps` parameter, e.g. `"2022-01-01T00:00:00Z,PT0S"`.

    The timestamps should be given in ascending temporal order, such that the first timestamp is the **baseline** timestamp, and the last timestamp is the **current** timestamp.

    Values older than 1 day are accepted only with valid Enterprise Token available.

    ## Response Overview

    When providing a `timestamps` parameter, the response has several additional properties:

    | Property                | Description                                                                            | Type             | Further information                                 |
    | ----------------------- | -------------------------------------------------------------------------------------- | ---------------- | --------------------------------------------------- |
    | `timestamp`             | The requested timestamp corresponding to the surrounding embedded object               | String           | Section *[Timestamps](#timestamps)* below           |
    | `attributesByTimestamp` | Attributes and meta information of the work packages at the respective timestamps      | Array of Objects | Section *[Attributes](#attributes)* below           |
    | `matchesFilters`        | Marks whether the work package matches the filter criteria at the respective timestamp | Bool             | Section *[Filter Matching](#filter-matching)* below |
    | `exists`                | Marks whether the work package exists at the respective timestamp                      | Bool | Section *[Existence](#existence)* below             |

    Each work-package element has the `attributesByTimestamp` as `_embedded` section.

    The properties `timestamp`, `matchesFilters`, and `exists` are wrapped in a `_meta` section, which is added to each work-package element as well as to each element of the `attributesByTimestamp` array.

    ```json5
    // /api/v3/work_packages?timestamps=2022-01-01T00:00:00Z,PT0S
    {
      "_type": "WorkPackageCollection",
      "total": 1,
      "_embedded": {
        "elements": [
          {
            "_type": "WorkPackage",
            "id": 1528,
            "subject": "Current subject of the work package",
            // other attributes ...,
            "_links": {
              "self": {
                "href": "/api/v3/work_packages/1528?timestamps=2022-01-01T00:00:00Z,2023-03-01T01:37:10Z"
              }
            },
            "_meta": {
              "matchesFilters": true,
              "exists": true,
              "timestamp": "PT0S"
            },
            "_embedded": {
              "attributesByTimestamp": [
                {
                  "subject": "Original subject of the work package",
                  "_meta": {
                    "matchesFilters": true,
                    "exists": true,
                    "timestamp": "2022-01-01T00:00:00Z"
                  },
                  "_links": {
                    "self": {
                      "href": "/api/v3/work_packages/1528?timestamps=2022-01-01T00:00:00Z"
                    }
                  },
                },
                {
                  "_meta": {
                    "matchesFilters": true,
                    "exists": true,
                    "timestamp": "PT0S"
                  },
                  "_links": {
                    "self": {
                      "href": "/api/v3/work_packages/1528?timestamps=2023-03-01T01:37:10Z"
                    }
                  }
                }
              ],
            }
          }
        ]
      },
      "_links": {
        "self": {
          "href": "/api/v3/work_packages?timestamps=2022-01-01T00:00:00Z,2023-03-01T01:37:10Z"
        }
      }
    }
    ```

    ## Meta Information

    Each `_meta` section describes the surrounding object of the meta section, which may be the main work-package object, or an attributes object within the `attributesByTimestamp` array.

    Note that the `_meta` information of the most current (rightmost) timestamp is redundant: It is given as `_meta` section of the main work-package object as well as `_meta` section of the last object within the `attributesByTimestamp` array.

    ## Timestamps

    Each `_meta` section contains a `timestamp` property, which is to the requested `timestamp` corresponding to the object the `_meta` section describes.

    The `timestamp` has the same ISO-8601 format as in the `timestamps` request parameter and preserves the absolute or relative character of the requested timestamp.

    Furthermore, each self link corresponding to an earlier point in time has also a `timestamps` request parameter added to it, which is converted to an absolute ISO-8601 string at the execution time of the query. (in the above example, `PT0S` was converted to `2023-03-01T01:37:10Z` as the query was executed at that time.)

    ## Attributes

    To read out the attributes of the work packages at the current timestamp (the last of the given `timestamps`), check the attributes of the work-package objects. To read out the attributes of the work packages at the other given timestamps, check the attributes within `"_embedded"` section `"attributesAtTimestamp"`.

    To save bandwidth, only attributes that differ from the ones in the main work-package object are included in the `"attributesByTimestamp"`. Attributes with the same value as in the main work-package object are not included in the `"attributesByTimestamp"` section.

    ```json5
    // /api/v3/work_packages?timestamps=2022-01-01T00:00:00Z,PT0S
    {
      "_type": "WorkPackageCollection",
      "_embedded": {
        "elements": [
          {
            "_type": "WorkPackage",
            "subject": "Current subject of the work package",
            "_meta": {
              "timestamp": "PT0S"
            },
            "_embedded": {
              "attributesByTimestamp": [
                {
                  "subject": "Original subject of the work package",
                  "_meta": {
                    "timestamp": "2022-01-01T00:00:00Z"
                  }
                },
                {
                  "_meta": {
                    "timestamp": "PT0S"
                  }
                }
              ],
            }
          }
        ]
      }
    }
    ```

    In the above example, the last of the given `timestamps` is `"PT0S"` (which means 0 seconds ago, i.e. now). The work-package attributes at this time are included in the main work-package object. The `"subject"` of the work package at the timestamp `"PT0S"` (now) is `"Current subject of the work package"`.

    The `"_embedded"` section `"attributesByTimestamp"` has an array entry for the timestamp `"PT0S"`, which is the last array entry. Because the value of the `"subject"` is the same as up in the main work-package object, the `"subject"` attribute is left out in the `"attributesByTimestamp"` for the timestamp `"PT0S"`. The `"subject"` of the work package at the timestamp `"PT0S"` (now) is `"Current subject of the work package"`.

    The `"_embedded"` section `"attributesByTimestamp"` has an array entry for the baseline timestamp `"2022-01-01T00:00:00Z"`, which is the first array entry. The `"subject"` of the work package at the timestamp `"2022-01-01T00:00:00Z"` is `"Original subject of the work package"`. It is included in the  `"attributesByTimestamp"` for the timestamp `"2022-01-01T00:00:00Z"` because it differs from the `"subject"` in the main work-package object, which is `"Current subject of the work package"`.

    ## Filter Matching

    The work-packages API supports filtering the query results by one or several search criteria. See: [Filters](../filters)

    To find out whether a work package matches the given set of filter criteria at a certain timestamp, check the `"matchesFilters"` property in the `"_meta"` section for that timestamp:

    ```json5
    // /api/v3/work_packages?filters=...&timestamps=2022-01-01T00:00:00Z,PT0S
    {
      "_type": "WorkPackageCollection",
      "_embedded": {
        "elements": [
          {
            "_type": "WorkPackage",
            "_meta": {
              "matchesFilters": true,
              "timestamp": "PT0S"
            },
            "_embedded": {
              "attributesByTimestamp": [
                {
                  "_meta": {
                    "matchesFilters": false,
                    "timestamp": "2022-01-01T00:00:00Z"
                  }
                },
                {
                  "_meta": {
                    "matchesFilters": true,
                    "timestamp": "PT0S"
                  }
                }
              ],
            }
          }
        ]
      }
    }
    ```

    In the above example, the work package matches the filter criteria at the timestamp `"PT0S"`, but does not match the filter criteria at the timestamp `"2022-01-01T00:00:00Z"`.

    In another example, it might be the other way around: The work package could match the filter criteria (`"matchesFilters": true`) at the baseline timestamp, but not match the filter criteria anymore (`"matchesFilters": false`) at the current timestamp.

    The work package is included in the returned collection if it matches the filter criteria at least at one of the requested timestamps.

    ## Existence

    To find out whether a work package has existed at a requested timestamp, check the `"exists"` property in the `"_meta"` section for that timestamp:

    ```json5
    // /api/v3/work_packages?timestamps=2022-01-01T00:00:00Z,PT0S
    {
      "_type": "WorkPackageCollection",
      "_embedded": {
        "elements": [
          {
            "_type": "WorkPackage",
            "_meta": {
              "exists": true,
              "timestamp": "PT0S"
            },
            "_embedded": {
              "attributesByTimestamp": [
                {
                  "_meta": {
                    "exists": false,
                    "timestamp": "2022-01-01T00:00:00Z"
                  }
                },
                {
                  "_meta": {
                    "exists": true,
                    "timestamp": "PT0S"
                  }
                }
              ],
            }
          }
        ]
      }
    }
    ```

    In the above example, the work package exists at the timestamp `"PT0S"`, but has not existed at the timestamp `"2022-01-01T00:00:00Z"`.

    In another example, it might be the other way around: The work package could exist (`"exists": true`) at the baseline time, but could have been deleted after that time such that it does not exist (`"exists": false`) at the current time. Please note, however, that OpenProject does not support [soft deletion](https://community.openproject.org/projects/openproject/work_packages/40015), yet. Currently, when a work package is deleted, its history is deleted as well, so that its history cannot be retrieved through the baseline API anymore.

    The work package is included in the returned collection if it has existed at least at one of the requested timestamps.

    ## Usage Example

    In this example ruby script, the work packages are retrieved at a baseline date and in their current state. Then the subject of the first work package is compared with respect to the baseline date and the current state.

    ```ruby
    # Define timestamps
    baseline_timestamp = "2022-01-01T00:00:00Z"
    current_timestamp = "PT0S"
    timestamps = [baseline_timestamp, current_timestamp]

    # Retrieve work packages
    url = URI("https://community.openproject.org/api/v3/work_packages?timestamps=#{timestamps.join(',')}")
    response = JSON.parse(Net::HTTP.get(url), object_class: OpenStruct)
    work_packages = response.dig("_embedded", "elements")

    # Extract differing baseline attributes
    work_package = work_packages.first
    baseline_attributes = work_package.dig("_embedded", "attributesByTimestamp").first

    # Compare baseline state to current state of the work package
    if baseline_attributes.subject.present? and baseline_attributes.subject != work_package.subject
      puts "The subject of the work package has changed."
      puts "Subject at the baseline time: #{baseline_attributes.subject}"
      puts "Current subject:              #{work_package.subject}"
    end

    # Check existence
    puts "The work package did exist at the baseline time." if baseline_attributes.dig("_meta", "exists")
    puts "The work package exists at the current time." if work_package.dig("_meta", "exists")

    # Check filter matching
    puts "The work package matches the query filters at the baseline time." if baseline_attributes.dig("_meta", "matchesFilters")
    puts "The work package matches the query filters at the current time." if work_package.dig("_meta", "matchesFilters")
    ```
  name: Baseline Comparisons
- description: |-
    This API provides forms as a concept to aid in editing or creating resources. The goal of forms is to:

    * make writable properties of a resource discoverable

    * show to which values a property can be set

    * validate changes to a resource and indicate validation errors

    These benefits aside, a client can freely choose to immediately edit a resource without prior validation by a form.
    In the case of an invalid request the edit will fail and return appropriate errors nevertheless.

    A form is associated to a single resource and aids in performing changes on that resource.
    When posting to a form endpoint with an empty request body or an empty JSON object,
    you will receive an initial form for the associated resource.
    Subsequent calls to the form should contain a single JSON object as described by the form.

    ## Actions

    | Link                | Description                                                           | Condition                        |
    |:-------------------:| --------------------------------------------------------------------- | -------------------------------- |
    | validate            | Validate changes, show errors and allowed values for changed resource |                                  |
    | commit              | Actually perform changes to the resource                              | form content is valid            |
    | previewMarkup       | Post markup (e.g. markdown) here to receive an HTML-rendered response |                                  |

    ## Linked Properties

    | Link                | Description                                      | Type          | Nullable | Supported operations |
    |:-------------------:| ------------------------------------------------ | ------------- | -------- | -------------------- |
    | self                | This form                                        | Form          |          | READ                 |

    ## Embedded Properties:

    Apart from the linked properties, forms contain always three other embedded properties:

    * `payload`

    * `schema`

    * `validationErrors`

    Their purpose is explained below.

    ### Payload

    The payload contains an edited version of the resource that will be modified when committing the form.
    This representation contains all writable properties of the resource and reflects all changes that the latest call to **validate** included,
    thereby acting as a preview for the changes.

    In case the client tries to set the value to something invalid, the invalid change is also reflected here. However a validation error (see below)
    indicates that a commit of this payload would fail.

    It might happen that setting one property affects the allowed values for another property. Thus by changing a property A
    the current value of another property B might become invalid. If the client did not yet touch the value of B, the payload will
    contain a default value for that property. Nevertheless the client will also receive an appropriate validation error for value B.

    The content of this element *can* be used as a template for the request body of a call to **validate** or **commit**.

    A call to **validate** and **commit** does not need to include all properties that were defined in the `payload` section.
    It is only necessary to include the properties that you want to change, as well as the `lockVersion` if one is present.
    However you *may* include all the properties sent in the `payload` section.

    ### Schema

    The schema embedded in a form is a normal [schema describing the underlying resource](https://www.openproject.org/docs/api/endpoints/schemas/).
    However, the embedded schema can change with each revalidation of the form.
    For example it might be possible, that changing the type of a work package affects its available properties,
    as well as possible values for certain properties.
    As this makes the embedded schema very dynamic, it is not included as a static link.

    ### Validation Errors

    Like a schema the validation errors build a dictionary where the key is a property name.
    Each value is an error object that indicates the error that occurred validating the corresponding property.
    There are only key value pairs for properties that failed validation, the element is empty if all validations succeeded.

    However note that even in the case of validation errors, the response you receive from the form endpoint will be an HTTP 200.
    That is because the main purpose of a form is helping the client to sort out validation errors.

    ### Meta object

    Form resources may have an additional `_meta` object that contains parameters to be sent together with the resource,
    but that do not belong to the resource itself. For example, parameters on if and how to send notifications for the action
    performed with the API request can be sent.

    Each individual endpoint will describe their meta properties, if available.
  name: Forms
- description: |-
    Some endpoints, especially those returning `Collection` resources, support signaling desired properties. By signaling, the client
    can convey to the server the properties to include in a response.

    Currently only `select` is supported which allows to specify the subset of properties a client is interested in. The benefit of using `select`
    is reduced response time. Other signaling, especially expanding the embedded resources to include as well over multiple layers of embedding
    are in consideration to be implemented (probably named `embed`) but as of now, they are not supported. Please also see
    [the specification for OData that inspired this feature](https://www.odata.org/documentation/odata-version-2-0/uri-conventions/).

    For example, a resource `/api/v3/bogus` that without signaling returns:

    ```json
      {
        "_type": "Collection"
        "count": 20,
        "total": 554,
        "_embedded": {
          "elements": [
            {
              "id": 1,
              "name": "Some name"
            },
            {
              "id": 9,
              "name": "Another name"
            }
          ]
        },
        "_links": {
          "self": {
            "href": "/api/v3/bogus",
            "title": "A bogus collection"
          },
          "bar": {
            "href": "/api/v3/bar",
            "title": "Foobar"
          }
        }
      }
    ```

    can via signaling `/api/v3/bogus?select=total,elements/name,bar` be instructed to return:

    ```json
      {
        "total": 554,
        "_embedded": {
          "elements": [
            {
              "name": "Some name"
            },
            {
              "name": "Another name"
            }
          ]
        },
        "_links": {
          "bar": {
            "href": "/api/v3/bar",
            "title": "Foobar"
          }
        }
      }
    ```

    The `select` query property is a comma separated list of the properties to include, e.g. `select=total,elements/name,bar`.
    The API also accepts alternative styles of writing like `select=["total","elements/name","bar"]`. Each individual item in the list
    is the path inside the resource. So while `total` refers to the property on the top level, `elements/name` refers to the property `name` within
    the collection of `elements`. The full path has to be provided for every property, e.g. `select=elements/name,elements/id`.
    The order of the list has no impact on the selection. There is also a wildcard `*` which will result in every property on that level to be selected.
    To select every property in the example above, the client would have to signal `select=*,elements/*`.

    Please note that the nesting into `_embedded` and `_links` is not included in the query prop `select` as
    links in the context of HAL can be considered properties of the resource just the same as unnested properties and forcing
    clients to write the full nesting would not increase clarity.

    Link properties are considered to be a single value that cannot be split up further. Every property within a link will be returned
    if the link is signaled to be selected.

    The `select` signaling flag has been introduced for performance reasons. Not every end point supports it and those that do oftentimes only
    allow a subset of their resource's properties to be selected. End points supporting the `select` query prop are documented accordingly.
  name: Signaling
- description: |-
    An action is a change one can trigger within the OpenProject instance.
    This could be creating a work package, exporting work packages or updating a user.
    An action can also be something where the user is able to be involved so where the user is in the passive role
    e.g. when being assigned a work package.

    A capability combines an action with a context and a principal. It thus communicates, which principal can carry out
    (or be passively involved) which action within a certain context. E.g. a user might have the capability of creating work packages
    within a project.

    In other words, an action is independent of a principal and context while a capability is
    a relation between an action, the context and the principal.

    The actions are most of the time derived from permissions which can be configured via the administrative UI where an administrator
    selects from a set of permissions to be granted per role. But there are other cases, e.g. in order to become assignee or responsible of a work package, a user has
    to have a role which allows having work packages assigned which is not a permission.

    Even though user might have a capability, it might still not be possible to carry out the action
    because some other requirement is not met.
    E.g. a user might have the capability to update work packages, but if a particular work package is
    in a readonly state, that work package cannot be updated.

    *Only a small set of actions that actually already exist in the system are currently exposed via
    the api. They will be added over time.*

    ## Action

    An action describes what can be carried out within the application. Until an action becomes assigned,
    which turns it into a capability, it remains in the state of "could be".

    ### Linked Properties

    |  Link               | Description                              | Type             | Constraints                                                    | Supported operations |
    |:-------------------:|----------------------------------------- | -------------    | -------------------------------------------------------------- | -------------------- |
    | self                | The action                               | Action           | not null                                                       | READ                 |

    ### Local Properties

    | Property    | Description                                                                             | Type        | Constraints    | Supported operations |
    | :---------: | ---------------------------------------------                                           | ----------- | -----------    | -------------------- |
    | id          | Identifier for the action                                                               | String      | Not null       | READ                 |
    | name        | A human readable name for the action *Not yet implemented*                              | String      | Not null       | READ                 |
    | description | Describes what can be done by principals having that action   *Not yet implemented*     | String      | Not null       | READ                 |
    | modules     | Clusters the actions into groups into which they belong logically *Not yet implemented* | []String    | Not null       | READ                 |

    ## Capabilities

    Actions can be assigned to a principal by assigning roles to that principal. E.g. a user might receive the 'work_packages/show'
    action by having a role called reader assigned within a project.

    Whenever a principal is assigned an action within a context, the principal has additional capabilities.

    Exactly which actions can be gained by having a role assigned depends on the configuration of that role.
    The configuration is adaptable by admins within the administration of the OpenProject instance.

    ### Linked Properties

    |  Link               | Description                                                                                           | Type             | Constraints     | Supported operations |
    |-------------------- |-----------------------------------------                                                              | -------------    | --------------- | -------------------- |
    | self                | The capability                                                                                        |                  |                 |                      |
    | action              | The action the principal is granted                                                                   | Action           | not null        | READ                 |
    | context             | The context the principal has this the action in. This is typically a project or the global context.  | Project or null  |                 | READ                 |
    | principal           | The principal being allowed the action.                                                               | Action           | not null        | READ                 |

    ### Local Properties

    | Property    | Description                                   | Type        | Constraints        | Supported operations |
    | :---------: | --------------------------------------------- | ----------- | -----------        | -------------------- |
    | id          | Identifier for the action                     | String      | Not null           | READ                 |
    | name        | A human readable name for the action          | String      | Not null           | READ                 |
  name: Actions & Capabilities
- description: |-
    ## Local Properties

    | Property    | Description      | Type                 | Constraints | Supported operations |
    | :---------: | -------------    | ----                 | ----------- | -------------------- |
    | id          | Activity id      | Integer              | x > 0       | READ                 |
    | version     | Activity version | Integer              | x > 0       | READ                 |
    | comment     |                  | Formattable          |             | READ / WRITE         |
    | details     |                  | Array of Formattable |             | READ                 |
    | createdAt   | Time of creation | DateTime             |             | READ                 |
    | updatedAt   | Time of update   | DateTime             |             | READ                 |

    Activity can be either _type `Activity` or _type `Activity::Comment`.
  name: Activities
- description: |-
    Attachments are files that were uploaded to OpenProject. Each attachment belongs to a single
    container (e.g. a work package or a board message).

    ## Actions

    | Link                | Description                                                          | Condition                                                                                          |
    |:-------------------:|----------------------------------------------------------------------| --------------------------------------------                                                       |
    | delete              | Deletes this attachment                                              | **Permission**: edit on attachment container or being the author for attachments without container |

    ## Linked Properties

    |  Link            | Description                                         | Type          | Constraints | Supported operations |
    |:----------------:| --------------------------------------------------- | ------------- | ----------- | -------------------- |
    | self             | This attachment                                     | Attachment    | not null    | READ                 |
    | container        | The object (e.g. WorkPackage) housing the attachment| Anything      | not null    | READ                 |
    | author           | The user who uploaded the attachment                | User          | not null    | READ                 |
    | downloadLocation | Direct download link to the attachment              | -             | not null    | READ                 |

    ## Local Properties

    | Property     | Description                                     | Type        | Constraints | Supported operations |
    |:------------:| ----------------------------------------------- | ----------- | ----------- | -------------------- |
    | id           | Attachment's id                                 | Integer     | x > 0       | READ                 |
    | title        | The name of the file                            | String      | not null    | READ                 |
    | fileName     | The name of the uploaded file                   | String      | not null    | READ                 |
    | fileSize     | The size of the uploaded file in Bytes          | Integer     | x >= 0      | READ                 |
    | description  | A user provided description of the file         | Formattable | not null    | READ                 |
    | contentType  | The files MIME-Type as determined by the server | String      | not null    | READ                 |
    | digest       | A checksum for the files content                | Digest      | not null    | READ                 |
    | createdAt    | Time of creation                                | DateTime    | not null    | READ                 |
  name: Attachments
- description: |-
    *Note: Budgets are currently only implemented as a stub. Further properties of budgets might be added at a future date, however they will require the view budget permission to be displayed.*

    ## Linked Properties:

    |  Link     | Description                                 | Type          | Constraints           | Supported operations |
    |:---------:|-------------------------------------------- | ------------- | --------------------- | -------------------- |
    | self      | This budget                                 | Budget        | not null              | READ                 |

    ## Properties

    | Property    | Description                                 | Type        | Constraints | Supported operations | Condition                   |
    | :---------: | ------------------------------------------- | ----------- | ----------- | -------------------- | --------------------------- |
    | id          | Budget id                                   | Integer     | x > 0       | READ                 |                             |
    | subject     | Budget name                                 | String      | not empty   | READ                 |                             |
  name: Budgets
- description: |-
    ## Linked Properties

    |  Link           | Description                                         | Type          | Constraints | Supported operations |
    |:---------------:| --------------------------------------------------- | ------------- | ----------- | -------------------- |
    | self            | This category                                       | Category      | not null    | READ                 |
    | project         | The project of this category                        | Project       | not null    | READ                 |
    | defaultAssignee | Default assignee for work packages of this category | User          |             | READ                 |

    ## Local Properties

    | Property   | Description   | Type    | Constraints | Supported operations |
    | :--------: | ------------- | ------- | ----------- | -------------------- |
    | id         | Category id   | Integer | x > 0       | READ                 |
    | name       | Category name | String  |             | READ                 |
  name: Categories
- description: |-
    The configuration endpoint allows to read certain configuration parameters of the OpenProject instance.
    Note that there is no 1:1 relationship between this endpoint and the settings an administrator has at hand to modify the behaviour
    of the application via configuration.yml or ENV variables.

    For now this endpoint will only allow access to settings deemed useful for a client to know in general.

    As clients might rely on the combination of both, the system settings as well as the current user's preferences, the resource
    embeds the current user's preferences so client can fetch both with one request.

    | Link                | Description                                      | Type            | Nullable | Supported operations |
    |:-------------------:| ------------------------------------------------ | -------------   | -------- | -------------------- |
    | self                | The configuration                                | Configuration   |          | READ                 |
    | userPreferences     | The preferences of the current user              | UserPreferences |          | READ                 |

    ## Local Properties

    | Property                  | Description                                                                | Type       | Condition         | Supported operations |
    | :-----------------------: | -------------------------------------------------------------------------- | ---------- | ----------------- | -------------------- |
    | maximumAttachmentFileSize | The maximum allowed size of an attachment in Bytes                         | Integer    |                   | READ                 |
    | perPageOptions            | Page size steps to be offered in paginated list UI                         | Integer[]  |                   | READ                 |
    | hostName                  | The host name configured for the system                                    | String     |                   | READ                 |
    | durationFormat            | The format used to display Work, Remaining Work, and Spent time durations. | String     |                   | READ                 |
    | activeFeatureFlags        | The list of all feature flags that are active                              | String[]   |                   | READ                 |
  name: Configuration
- description: |-
    Custom actions are a preconfigured set of changes that are applied to a work package.

    Currently, this resource is a stub. The conditions and changes defined for the custom action are not yet present in the resource.

    ## Actions

    | Link                | Description                                                          | Condition                                                                                                                        |
    |:-------------------:|----------------------------------------------------------------------| ---------------------------------------                                                                                          |
    | executeImmediately  | Apply the action to a work package                                   |

    ## Linked Properties

    | Property         | Description                                               | Type                  | Constraints                      | Supported operations |
    | :--------------: | ------------------------------------------------------    | -----------           | -------------------------------- | -------------------- |
    | self             | This custom action                                        | CustomAction          | not null                         | READ                 |

    ## Local Properties

    | Property         | Description                                              | Type                  | Constraints  | Supported operations |
    | :--------------: | ------------------------------------------------------   | -----------           | ------------ | -------------------- |
    | id               | Custom action id                                         | Integer               | x > 0        | READ                 |
    | name             | The user selected name of the custom action              | String                |              | READ                 |
    | description      | A text describing the custom action                      | String                |              | READ                 |
  name: Custom actions
- description: |-
    ## Linked Properties

    |  Link         | Description               | Type          | Constraints | Supported operations |
    |:-------------:|-------------------------- | ------------- | ----------- | -------------------- |
    | self          | This custom option        | CustomOption  | not null    | READ                 |

    ## Local Properties

    | Property         | Description                                    | Type     | Constraints | Supported operations |
    |:----------------:| ---------------------------------------------- | -------- | ----------- | -------------------- |
    | id               | The identifier                                 | Integer  |             | READ                 |
    | value            | The value defined for this custom option       | String   |             | READ                 |

    custom options are options of list custom fields.
  name: Custom Options
- description: |-
    A document is a file containing a list of attachments.

    *Please note, that the endpoint is only a stub for now.*

    ## Actions

    None yet

    ## Linked Properties

    | Link          | Description                               | Type           | Constraints           | Supported operations | Condition                                 |
    | :-----------: | -------------------------------------     | -------------  | --------------------- | -------------------- | ----------------------------------------- |
    | self          | This document                             | Document       | not null              | READ                 |                                           |
    | project       | The project the document is in            | Project        | not null              | READ / WRITE         |                                           |
    | attachments   | The attachments belonging to the document | []Attachment   | not null              | READ / WRITE         |                                           |

    ## Local Properties

    | Property     | Description                                               | Type     | Constraints                                          | Supported operations | Condition                                                   |
    | :----------: | --------------------------------------------------------- | -------- | ---------------------------------------------------- | -------------------- | ----------------------------------------------------------- |
    | id           | Document's id                                             | Integer  | x > 0                                                | READ                 |                                                             |
    | title        | The title chosen for the collection of documents          | String   | max 60 characters                                    | READ                 |                                                             |
    | description  | A text describing the documents                           | String   |                                                      | READ                 |                                                             |
    | createdAt    | The time the document was created at                      | DateTime |                                                      | READ                 |                                                             |
  name: Documents
- description: TBD
  name: File links
- description: |-
    A grid is a layout for a page or a part of the page of the OpenProject application. It defines the structure (number of rows and number of columns) as well as the contents of the page.

    The contents is defined by `GridWidget`s. While a `GridWidget` is its own type, it is not a resource in its own right as it is an intrinsic part of a `Grid`.

    Depending on what page a grid is defined for, different widgets may be eligible to be placed on the grid. The page might also define the permissions needed for accessing, creating or modifying the grid.

    Currently, the following pages employ grids:

    + /my/page: The My page every user has. Only a user can access or modify their "My page".

    *The delete action is not yet supported*

    ## Actions

    | Link                | Description                                                          | Condition                                                                                           |
    |:-------------------:| -------------------------------------------------------------------- | ----------------------------------------------------------------                                    |
    | updateImmediately   | Directly perform edits on this grid                                  | **Permission**: depends on the page the grid is defined for                                         |
    | update              | Validate edits on the grid via a form resource before committing     | **Permission**: depends on the page the grid is defined for                                         |

    ## Linked Properties

    | Link          | Description                                                       | Type                | Constraints           | Supported operations | Condition                                     |
    | :-----------: | --------------------------------------------------------------    | -------------       | --------------------- | -------------------- | -----------------------------------------     |
    | self          | This grid                                                         | Grid                | not null              | READ                 |                                               |
    | page          | The url of the page the grid is defined for                       | url                 | not null              | READ / WRITE         | The page cannot be changed after the creation |

    ## Local Properties

    | Property     | Description                                               | Type          | Constraints                                          | Supported operations | Condition                   |
    | :----------: | --------------------------------------------------------- | --------      | ---------------------------------------------------- | -------------------- | --------------              |
    | id           | Grid's id                                                 | Integer       | x > 0                                                | READ                 |                             |
    | rowCount     | The number of rows the grid has                           | Integer       | x > 0                                                | READ/WRITE           |                             |
    | columnCount  | The number of columns the grid has                        | Integer       | x > 0                                                | READ/WRITE           |                             |
    | widgets      | The set of `GridWidget`s selected for the grid            | []GridWidget  |                                                      | READ/WRITE           | The widgets cannot overlap  |
    | createdAt    | The time the grid was created                             | DateTime      |                                                      | READ                 |                             |
    | updatedAt    | The time the grid was last updated                        | DateTime      |                                                      | READ                 |                             |

    ## GridWidget Properties

    | Property     | Description                                                                        | Type     | Constraints                                          | Supported operations | Condition      |
    | :----------: | ---------------------------------------------------------                          | -------- | ---------------------------------------------------- | -------------------- | -------------- |
    | identifier   | The kind of widget                                                                 | String   | not null                                             | READ/WRITE           |                |
    | startRow     | The row the widget starts at (1 based)                                             | Integer  | x > 0, x < rowCount of the grid, x < endRow          | READ/WRITE           |                |
    | endRow       | The row the widget ends. The widget's area does not include the row itself.        | Integer  | x > 0, x <= rowCount of the grid, x > startRow       | READ/WRITE           |                |
    | startColumn  | The column the widget starts at (1 based)                                          | Integer  | x > 0, x < columnCount of the grid, x < endColumn    | READ/WRITE           |                |
    | endColumn    | The column the widget ends. The widget's area does not include the column itself.  | Integer  | x > 0, x <= columnCount of the grid, x > startColumn | READ/WRITE           |                |
    | options      | An options hash of values customizable by the widget                               | JSON     |                                                      | READ/WRITE           |                |
  name: Grids
- description: |-
    Groups are collections of users. They support assigning/unassigning multiple users to/from a project in one operation.

    This resource does not yet have the form and schema endpoints. But as all properties are static, clients should still be able
    to work with this resource.

    ## Actions

    ## Actions

    | Link                | Description                                                          | Condition                                                        |
    |:-------------------:| -------------------------------------------------------------------- | ---------------------------------------------------------------- |
    | delete              | Deletes the group.                                                   | **Permission**: Administrator                                    |
    | updateImmediately   | Updates the group's attributes.                                      | **Permission**: Administrator                                    |

    ## Linked Properties

    |  Link              | Description                                                                                                                                                           | Type              | Constraints           | Supported operations | Condition                                                                |
    |:-----------:       |--------------------------------------------------------------                                                                                                         | -------------     | --------------------- | -------------------- | -----------------------------------------                                |
    | self               | This group                                                                                                                                                            | Group             | not null              | READ                 |                                                                          |
    | memberships        | Link to collection of all the group's memberships. The list will only include the memberships in projects in which the requesting user has the necessary permissions. | MemberCollection  |                       | READ                 | **Permission**: view members or manage members in any project            |
    | members            | The list all all the users that are members of the group                                                                                                              | UserCollection    |                       | READ/WRITE           | **Permission**: manage members in any project to read & admin to write   |

    ## Local Properties

    | Property     | Description                                                | Type     | Constraints                                          | Supported operations | Condition                                                      |
    | :----------: | ---------------------------------------------------------  | -------- | ---------------------------------------------------- | -------------------- | -----------------------------------------------------------    |
    | id           | Group's id                                                 | Integer  | x > 0                                                | READ                 |                                                                |
    | name         | Group's full name, formatting depends on instance settings | String   |                                                      | READ/WRITE           | Admin to write                                                 |
    | createdAt    | Time of creation                                           | DateTime |                                                      | READ                 | Only visible by admins                                         |
    | updatedAt    | Time of the most recent change to the user                 | DateTime |                                                      | READ                 | Only visible by admins                                         |
  name: Groups
- description: |-
    ## Linked Properties

    |  Link         | Description               | Type          | Constraints | Supported operations |
    |:-------------:|-------------------------- | ------------- | ----------- | -------------------- |
    | self          | This help text            | HelpText      | not null    | READ                 |
    | editText      | Edit the help text entry  | text/htm      | Admin       | READ                 |

    ## Local Properties

    | Property           | Description                 | Type                 | Constraints | Supported operations |
    | :---------:        | --------------------------- | -------------------- | ----------- | -------------------- |
    | id                 | Help text id                | Integer              | x > 0       | READ                 |
    | attribute          | Attribute name              | String               |             | READ                 |
    | attributeCaption   | Attribute caption           | String               |             | READ                 |
    | helpText           | Help text content           | Formattable          |             | READ                 |
  name: Help texts
- description: |-
    Users and groups can become members of a project. Such a membership will also have one or more roles assigned to it. By that, memberships control the permissions a user has within a project.

    There are also memberships that do not govern the permissions within a certain project but rather govern global permissions. Among the permissions that can be granted like this are the permissions to "Create project" and "Manage users". Those memberships do not have a project associated.

    When creating and updating memberships, a custom message can be sent to users of new and updated memberships. This message can be provided within the `_meta` group.

    ## Linked Properties

    |  Link               | Description                                                   | Type             | Constraints                                                    | Supported operations |
    |:-------------------:|-----------------------------------------                      | -------------    | -------------------------------------------------------------- | -------------------- |
    | self                | This membership                                               | Membership       | not null                                                       | READ                 |
    | project             | The project for which the membership is granted               | Project          |                                                                | READ                 |
    | roles               | The list of roles the user or group is granted in the project | RoleCollection   | not null                                                       | READ                 |
    | principal           | The user or group that was granted membership                 | User or Group    | not null                                                       | READ                 |

    ## Local Properties

    | Property    | Description                                   | Type        | Constraints                                        | Supported operations |
    | :---------: | --------------------------------------------- | ----------- | -----------                                        | -------------------- |
    | id          | Membership id                                 | Integer     | x > 0                                              | READ                 |
    | createdAt   | Time of creation                              | DateTime    | not null                                           | READ                 |
    | updatedAt   | Time of latest update                         | DateTime    | not null                                           | READ                 |

    ## Meta parameters

    | Meta property              | Description                                                                          | Type         | Constraints | Supported operations |Condition |
    | :------------------------: | ---------------------------------------------------                                  | ----         | ----------- | -------------------- |----------|
    | notificationMessage        | The message included in the email(s) send to the users of new or updated memberships | Formattable  |             | READ/WRITE           |          |
  name: Memberships
- description: |-
    News are articles written by users in order to inform other users of important information.

    ## Actions

    | Link                | Description                                                              | Condition                              |
    |:-------------------:|--------------------------------------------------------------------------| ---------------------------------------|
    | delete              | Delete the new                                                           | **Permission**: manage news            |
    | updateImmediately   | Directly perform edits on the news                                       | **Permission**: manage news            |

    ## Linked Properties

    | Link          | Description                          | Type           | Constraints           | Supported operations | Condition                                 |
    | :-----------: | -------------------------------------| -------------  | --------------------- | -------------------- | ----------------------------------------- |
    | self          | This news                            | News           | not null              | READ                 |                                           |
    | project       | The project the news is situated in  | Project        | not null              | READ / WRITE         |                                           |
    | author        | The user having created the news     | User           | not null              | READ                 |                                           |

    ## Local Properties

    | Property     | Description                                               | Type     | Constraints                                          | Supported operations | Condition                                                   |
    | :----------: | --------------------------------------------------------- | -------- | ---------------------------------------------------- | -------------------- | ----------------------------------------------------------- |
    | id           | News' id                                                  | Integer  | x > 0                                                | READ                 |                                                             |
    | title        | The headline of the news                                  | String   | max 60 characters                                    | READ                 |                                                             |
    | summary      | A short summary                                           | String   | max 255 characters                                   | READ                 |                                                             |
    | description  | The main body of the news with all the details            | String   |                                                      | READ                 |                                                             |
    | createdAt    | The time the news was created at                          | DateTime |                                                      | READ                 |                                                             |
  name: News
- description: |-
    Notifications are created through notifiable actions in OpenProject.
    Notifications are triggered by actions carried out in the system by users, e.g. editing a work package, but can also be send out because
    of time passing e.g. when a user is notified of a work package that is overdue.

    This endpoint only returns in-app notifications.

    ## Actions

    | Link                | Description                                                          | Condition                   |
    |:-------------------:| -------------------------------------------------------------------- | --------------------------- |
    | read_ian            | Marks the notification as read                                       | notification is unread      |
    | unread_ian          | Marks the notification as unread                                     | notification is read        |

    ## Linked Properties

    | Link          | Description                                       | Type            | Constraints           | Supported operations | Condition                                 |
    | :-----------: | ----------------------------------------          | --------------  | --------------------- | -------------------- | ----------------------------------------- |
    | self          | This notification                                 | Notification    | not null              | READ                 |                                           |
    | project       | The project containing the resource               | Project         | not null              | READ                 |                                           |
    | actor         | The user that caused the notification             | User            |                       | READ                 | optional                                  |
    | resource      | The resource the notification belongs to          | Polymorphic     | not null              | READ                 |                                           |
    | activity      | The journal the notification belongs to           | Polymorphic     |                       | READ                 | optional                                  |
    | details       | A list of objects including detailed information  | Polymorphic     |                       | READ                 | optional                                  |

    ## Local Properties

    | Property     | Description                                               | Type          | Constraints                                          | Supported operations | Condition                                                   |
    | :----------: | --------------------------------------------------------- | --------      | ---------------------------------------------------- | -------------------- | ----------------------------------------------------------- |
    | id           | Primary key                                               | Integer       |                                                      | READ                 |                                                             |
    | subject      | The subject of the notification                           | String        |                                                      | READ                 |                                                             |
    | reason       | The reason causing the notification                       | String        |                                                      | READ                 |                                                             |
    | readIAN      | Whether the notification is read                          | Boolean       |                                                      | READ                 |                                                             |
  name: Notifications
- description: TBD
  name: OAuth 2
- description: |-
    Represents a post in a board. Posts are also referred to as messages in the application.

    *This resource is currently a stub*

    ## Actions

    | Link                | Description                    | Condition                                                                                                                        |
    |:-------------------:|--------------------------------| ---------------------------------------                                                                                          |
    | addAttachment       | Attach a file to the post      | **Permission**: edit messages           |

    ## Linked Properties

    | Property         | Description                                            | Type        | Constraints    | Supported operations |
    | :--------------: | ------------------------------------------------------ | ----------- | -------------- | -------------------- |
    | self             | This post                                              | Post        | not null       | READ                 |
    | attachments      | The files attached to this post                        | Collection  |                | READ                 |
    | project          | The project the post belongs to                        | Project     | not null       | READ                 |

    ## Local Properties

    | Property         | Description                                 | Type                  | Constraints                          | Supported operations |
    | :--------------: | ------------------------------------------- | -----------           | ------------------------------------ | -------------------- |
    | id               | Identifier of this post                     | Integer               | x > 0                                | READ                 |
    | subject          | The post's subject                          | String                | not null                             | READ                 |
  name: Posts
- description: |-
    Principals are the superclass of users, groups and placeholder users. This end point returns all principals
    within a joined collection but can be filtered to e.g. only return groups or users.
  name: Principals
- description: |-
    ## Linked Properties

    |  Link     | Description                                 | Type          | Constraints           | Supported operations |
    |:---------:|-------------------------------------------- | ------------- | --------------------- | -------------------- |
    | self      | This priority                               | Priority      | not null              | READ                 |

    ## Local Properties

    | Property    | Description                                 | Type       | Constraints | Supported operations |
    | :---------: | ------------------------------------------- | ---------- | ----------- | -------------------- |
    | id          | Priority id                                 | Integer    | x > 0       | READ                 |
    | name        | Priority name                               | String     | not empty   | READ                 |
    | position    | Sort index of the priority                  | Integer    | x > 0       | READ                 |
    | isDefault   | Indicates whether this is the default value | Boolean    |             | READ                 |
    | isActive    | Indicates whether the priority is available | Boolean    |             | READ                 |
  name: Priorities
- description: |-
    Project phases separate the whole of the project's duration into smaller, distinct parts where each phase has its own start and end date.
    Such a phase will then have different focus on certain aspects of project management. E.g. while the first phase might be about gathering requirements, the second phase might be about implementing the requirements
    and the third phase might be about testing the implementation.

    Phases within a project are concrete instances of a phase definition. That way, one or a number of project life cycles can be defined throughout the OpenProject instance and then be reused in different projects.
    Projects can enable or disable the use of a phase definition in a project and assign dates to the phase instances.

    ## Actions

    * None currently

    ## Linked Properties

    | Link         | Description                                                                                  | Type                   | Constraints | Supported operations |Condition                                                                                  |
    | :----------: | -------------                                                                                | ----                   | ----------- | -------------------- |-----------------------------------------                                                  |
    | self         | This project phase                                                                           | ProjectPhase           | not null    | READ                 |                                                                                           |
    | definition   | This definition this phase relies on                                                         | ProjectPhaseDefinition | not null    | READ                 |                                                                                           |
    | project      | This project this phase is instantiated in                                                   | Project                | not null    | READ                 |                                                                                           |

    ## Local Properties

    | Property               | Description                                                                        | Type              | Constraints                          | Supported operations |
    | :---------------------:| -------------                                                                      | ----              | -----------                          | -------------------- |
    | id                     | Project phase's id                                                                 | Integer           | x > 0                                | READ                 |
    | name                   |                                                                                    | String            |                                      | READ                 |
    | active                 | Indicates whether the project phase is currently active within the project         | Boolean           |                                      | READ                 |
    | createdAt              | Time of creation                                                                   | DateTime          |                                      | READ                 |
    | updatedAt              | Time of the most recent change to the project phase                                | DateTime          |                                      | READ                 |
  name: Project Phases
- description: |-
    Project phases separate the whole of the project's duration into smaller, distinct parts.
    Such a phase will then have different focus on certain aspects of project management. E.g. while the first phase might be about gathering requirements, the second phase might be about implementing the requirements
    and the third phase might be about testing the implementation.

    The phases within the projects rely on an abstract definition of the project life cycle valid in a number of projects within the OpenProject instance.
    That definition is a set of ProjectPhaseDefinitions.

    ## Actions

    * None currently

    ## Linked Properties

    | Link         | Description                                                                                  | Type                   | Constraints | Supported operations |Condition                                                                                  |
    | :----------: | -------------                                                                                | ----                   | ----------- | -------------------- |-----------------------------------------                                                  |
    | self         | This project phase definition                                                                | ProjectPhaseDefinition | not null    | READ                 |                                                                                           |

    ## Local Properties

    | Property               | Description                                                 | Type      | Constraints | Supported operations |
    |---------------         |-------------------------------------------------------------|-----------|-------------|----------------------|
    | id                     | Project phase definition's id                               | Integer   | x > 0       | READ                 |
    | name                   |                                                             | String    |             | READ                 |
    | startGate              | Indicates whether the project phase has a gate at the start | Boolean   |             | READ                 |
    | startGateName          | The name of the gate at the start of the phase              | String    |             | READ                 |
    | finishGate             | Indicates whether the project phase has a gate at the end   | Boolean   |             | READ                 |
    | finishGateName         | The name of the gate at the end of the phase                | String    |             | READ                 |
    | createdAt              | Time of creation                                            | DateTime  |             | READ                 |
    | updatedAt              | Time of the most recent change to the project phase         | DateTime  |             | READ                 |
  name: Project Phase Definitions
- description: |-
    Projects are containers structuring the information (e.g. work packages, wikis) into smaller groups. They can be used in a classic project management approach but also when structuring work by departments.

    As containers, they also control behaviour of the elements within them. One of the most important aspects of this is that projects limit permissions by having members with a certain permission set (roles) assigned to them.

    ## Actions

    | Link                         | Description                                                          | Condition                         |
    |:--------------------------:  |----------------------------------------------------------------------| --------------------------------- |
    | update                       | Form endpoint that aids in updating this project                     | **Permission**: edit project      |
    | updateImmediately            | Directly update this project                                         | **Permission**: edit project      |
    | delete                       | Delete this project                                                  | **Permission**: admin             |
    | createWorkPackage            | Form endpoint that aids in preparing and creating a work package     | **Permission**: add work packages |
    | createWorkPackageImmediately | Directly creates a work package in the project                       | **Permission**: add work packages |

    ## Linked Properties

    | Link         | Description                                                                                                         | Type          | Constraints | Supported operations |Condition                                                                                  |
    | :----------: | -------------                                                                                                       | ----          | ----------- | -------------------- |-----------------------------------------                                                  |
    | self         | This project                                                                                                        | Project       | not null    | READ                 |                                                                                           |
    | ancestors    | Array of all ancestors of the project, down from the root node (first element) to the parent (last element).        | Collection    | not null    | READ                 | **Permission** view project on the ancestor project. Non visible projects will be omitted |
    | categories   | Categories available in this project                                                                                | Collection    | not null    | READ                 |                                                                                           |
    | types        | Types available in this project                                                                                     | Collection    | not null    | READ                 | **Permission**: view work packages or manage types                                        |
    | versions     | Versions available in this project                                                                                  | Collection    | not null    | READ                 | **Permission**: view work packages or manage versions                                     |
    | memberships  | Memberships in the project                                                                                          | Collection    | not null    | READ                 | **Permission**: view members                                                              |
    | workPackages | Work Packages of this project                                                                                       | Collection    | not null    | READ                 |                                                                                           |
    | parent       | Parent project of the project                                                                                       | Project       |             | READ/WRITE           | **Permission** edit project                                                               |
    | status       | Denotes the status of the project, so whether the project is on track, at risk or is having trouble.                | ProjectStatus |             | READ/WRITE           | **Permission** edit project                                                               |

    Depending on custom fields defined for projects, additional links might exist.

    Note, that the parent and ancestor links may contain the "undisclosed uri" `urn:openproject-org:api:v3:undisclosed` in case an
    ancestor project is defined but the client lacks permission to see it. See the
    [general introduction into links' properties](https://www.openproject.org/docs/api/basic-objects/#local-properties) for more information.

    ## Local Properties

    | Property               | Description                                                                                           | Type              | Constraints                          | Supported operations |
    | :---------------------:| -------------                                                                                         | ----              | -----------                          | -------------------- |
    | id                     | Projects' id                                                                                          | Integer           | x > 0                                | READ/WRITE           |
    | identifier             |                                                                                                       | String            |                                      | READ/WRITE           |
    | name                   |                                                                                                       | String            |                                      | READ/WRITE           |
    | active                 | Indicates whether the project is currently active or already archived                                 | Boolean           |                                      | READ/WRITE           |
    | statusExplanation      | A text detailing and explaining why the project has the reported status                               | Formattable       |                                      | READ/WRITE           |
    | public                 | Indicates whether the project is accessible for everybody                                             | Boolean           |                                      | READ/WRITE           |
    | description            |                                                                                                       | Formattable       |                                      | READ/WRITE           |
    | createdAt              | Time of creation                                                                                      | DateTime          |                                      | READ                 |
    | updatedAt              | Time of the most recent change to the project                                                         | DateTime          |                                      | READ                 |

    Depending on custom fields defined for projects, additional properties might exist.
  name: Projects
- description: |
    A query defines how work packages can be filtered and displayed.
    Clients can define a query once, store it, and use it later on to load the same set of filters and display options.

    ## Actions

    | Link                | Description                                                          | Condition                                                                                                                        |
    |:-------------------:|----------------------------------------------------------------------| ---------------------------------------                                                                                          |
    | star                | Elevates the query to the status of 'starred'                        | **Permission**: save queries for own queries, manage public queries for public queries; Only present if query is not yet starred |
    | unstar              | Removes the 'starred' status                                         | **Permission**: save queries for own queries, manage public queries for public queries; Only present if query is starred         |
    | update              | Use the Form based process to verify the query before persisting     | **Permission**: view work packages                                                                                               |
    | updateImmediately   | Persist the query without using a Form based process for guidance    | **Permission**: save queries for own queries, manage public queries for public queries;                                          |

    ## Linked Properties

    | Property               | Description                                                                                                                                    | Type                  | Constraints                                 | Supported operations |
    | :--------------------: | ------------------------------------------------------                                                                                         | --------------------- | ------------------------------------------- | -------------------- |
    | self                   | This query                                                                                                                                     | Query                 | not null                                    | READ                 |
    | user                   | The user that owns this query                                                                                                                  | User                  | not null                                    | READ                 |
    | project                | The project on which this query operates                                                                                                       | Project               |                                             | READ                 |
    | columns                | Ordered list of QueryColumns. The columns, when mapped to WorkPackage properties determine which WorkPackage properties to display             | []QueryColumn         |                                             | READ                 |
    | highlightedAttributes  | **Only with valid Enterprise Token available:** List of QueryColumns that should get highlighted when `highlightingMode` is set to `inline`.   | []QueryColumn         |                                             | READ                 |
    | sortBy                 | Ordered list of QuerySortBys. Indicates the WorkPackage property the results will be ordered by as well as the direction                       | []QuerySortBy         |                                             | READ                 |
    | groupBy                | The WorkPackage property results of this query are grouped by                                                                                  | String                |                                             | READ                 |
    | results                | The list of work packages returned by applying the filters, sorting and grouping defined in the query                                          | WorkPackageCollection |                                             | READ                 |
    | schema                 | This query's schema                                                                                                                            | Schema                |                                             | READ                 |

    Please note, that all the properties listed above will also be embedded when individual queries are returned but will not be embedded when a list of queries is returned. Whether the properties are embedded or not may be subject to change in the future.

    The `columns` and `highlightedAttributes` properties will be moved into `Views::WorkPackagesTable` so it is deprecated to have it listed within the Query directly.

    ## Local Properties

    | Property         | Description                                                                                              | Type                  | Constraints                                                                         | Supported operations |
    | :--------------: | -------------------------------------------------------------------------------------------------------- | --------------------- | ----------------------------------------------------------------------------------- | -------------------- |
    | id               | Query id                                                                                                 | Integer               | x > 0                                                                               | READ                 |
    | name             | Query name                                                                                               | String                |                                                                                     | READ/WRITE           |
    | filters          | A set of QueryFilters which will be applied to the work packages to determine the resulting work packages| []QueryFilterInstance |                                                                                     | READ/WRITE           |
    | sums             | Should sums (of supported properties) be shown?                                                          | Boolean               |                                                                                     | READ/WRITE           |
    | timelineVisible  | Should the timeline mode be shown?                                                                       | Boolean               |                                                                                     | READ/WRITE           |
    | timelineLabels   | Which labels are shown in the timeline, empty when default                                               | QueryTimelineLabels   |                                                                                     | READ/WRITE           |
    | timelineZoomLevel| Which zoom level should the timeline be rendered in?                                                     | String                | days, weeks, months, quarters, years                                                | READ/WRITE           |
    | timestamps       | The timestamps to filter by when showing changed attributes on work packages.| []Timestamp               |                       | **Values older than 1 day are accepted only with valid Enterprise Token available.**| READ/WRITE           |
    | highlightingMode | Which highlighting mode should the table have?                                                           | String                | none, inline, status, priority, type                                                | READ/WRITE           |
    | showHierarchies  | Should the hierarchy mode be enabled?                                                                    | Boolean               |                                                                                     | READ/WRITE           |
    | hidden           | Should the query be hidden from the query list?                                                          | Boolean               |                                                                                     | READ/WRITE           |
    | public           | Can users besides the owner see the query?                                                               | Boolean               |                                                                                     | READ/WRITE           |
    | starred          | Should the query be highlighted to the user?                                                             | Boolean               |                                                                                     | READ                 |
    | createdAt        | Time of creation                                                                                         | DateTime              | not null                                                                            | READ                 |
    | updatedAt        | Time of the most recent change to the query                                                              | DateTime              | not null                                                                            | READ                 |

    A query that is not assigned to a project (`"project": null`) is called a global query. Global queries filter work packages regardless of the project they are assigned to. As such, a different set of filters exists for those queries.

    The `hidden` property is deprecated as it is replaced by the `Views` concept. A query that isn't hidden will have a `View` while a query that is hidden won't.

    The `timelineVisible`, `timelineLabels`, `timelineZoomLevel`, `highlightingMode` and `showHierarchies` properties will be moved into the more appropriate Views (probably `Views::WorkPackagesTable`) so it is deprecated to have them within the Query directly.

    ## Query Filter Instance

    A QueryFilterInstance defines a filtering applied to the list of work packages. As such it contains:

    * the filter type (`QueryFilter`) used

    * the operator (`QueryOperator`) used

    * the list of values

    The list of values can either consist of a list of links or of a list of strings. If the values are primitive (e.g. Integer, Boolean, Date) they will be displayed as strings and the QueryFilterInstance will have a `values` property.

    ```json
      {
        "_type": "DueDateQueryFilter",
        "name": "Finish date",
        "values": [
          "1"
        ],
        "_links": {
          "filter": {
            "href": "/api/v3/queries/filters/dueDate",
            "title": "Finish date"
          },
          "operator": {
            "href": "/api/v3/queries/operators/<t+",
            "title": "in less than"
          }
          "schema": {
            "href": "/api/v3/queries/filter_instance_schemas/dueDate"
          }
        }
      }
    ```

    If the values are nonprimitive (e.g. User, Project), they will be listed as objects and the QueryFilterInstance will have a `values` link.

    ```json
      {
        "_type": "AssigneeQueryFilter",
        "name": "Assignee",
        "_links": {
          "filter": {
            "href": "/api/v3/queries/filters/assignee",
            "title": "Assignee"
          },
          "operator": {
            "href": "/api/v3/queries/operators/=",
            "title": "is"
          },
          "schema": {
            "href": "/api/v3/queries/filter_instance_schemas/assignee"
          },
          "values": [
            {
              "href": "/api/v3/users/1",
              "title": "OpenProject Admin"
            }
          ]
        }
      }

    ```
  name: Queries
- description: |-
    A QueryColumn can be referenced by a Query to denote the work package properties the client should display for the work packages returned as query results. The columns maps to the WorkPackage by the id property. QueryColumns exist in three types: `QueryColumn::Property`, `QueryColumn::RelationToType` and `QueryColumn::RelationOfType`.

    ## Actions

    As of now, no actions are defined.

    ## Linked Properties

    | Property         | Description                                            | Type                                                                              | Constraints                                    | Supported operations |
    | :--------------: | ------------------------------------------------------ | -----------                                                                       | --------------------------------               | -------------------- |
    | self             | This query column                                      | QueryColumn::Property, QueryColumn::RelationToType or QueryColumn::RelationOfType | not null                                       | READ                 |
    |  type            | The type relations point to                            | Type                                                                              | not null, exists only on QueryColumn::Relation | READ                 |

    ## Local Properties

    | Property         | Description                                            | Type        | Constraints                      | Supported operations |
    | :--------------: | ------------------------------------------------------ | ----------- | -------------------------------- | -------------------- |
    | id               | Query column id                                        | String      | not null                         | READ                 |
    | name             | Query column name                                      | String      | not null                         | READ                 |
  name: Query Columns
- description: |-
    A QueryFilter can be referenced by a filter instance defined for a Query to denote the filtering applied to the query's work package results. This resource is not an instance of an applicable filter but rather the type an applicable filter can have.

    ## Actions

    As of now, no actions are defined.

    ## Linked Properties

    | Property         | Description                                            | Type        | Constraints                      | Supported operations |
    | :--------------: | ------------------------------------------------------ | ----------- | -------------------------------- | -------------------- |
    | self             | This query filter                                      | QueryFilter | not null                         | READ                 |

    ## Local Properties

    | Property         | Description                                            | Type        | Constraints                      | Supported operations |
    | :--------------: | ------------------------------------------------------ | ----------- | -------------------------------- | -------------------- |
    | id               | QueryFilter id                                         | String      | not null                         | READ                 |
  name: Query Filters
- description: |-
    A QueryOperator can be referenced by a QueryFilter to denote the operator to be applied to the filter relation.

    ## Actions

    As of now, no actions are defined.

    ## Linked Properties

    | Property         | Description                                            | Type          | Constraints                      | Supported operations |
    | :--------------: | ------------------------------------------------------ | -----------   | -------------------------------- | -------------------- |
    | self             | This query operator                                    | QueryOperator | not null                         | READ                 |

    ## Local Properties

    | Property         | Description                                            | Type        | Constraints                      | Supported operations |
    | :--------------: | ------------------------------------------------------ | ----------- | -------------------------------- | -------------------- |
    | id               | Query operator id                                      | String      | not null                         | READ                 |
    | name             | Query operator name                                    | String      | not null                         | READ                 |
  name: Query Operators
- description: |-
    A QuerySortBy can be referenced by a Query to denote the sorting applied to the query's work package results. It consists of the columns to sort by as well as the direction (ascending/descending)

    ## Actions

    As of now, no actions are defined.

    ## Linked Properties

    | Property         | Description                                                                                                                                                                                                               | Type        | Constraints                      | Supported operations |
    | :--------------: | ------------------------------------------------------                                                                                                                                                                    | ----------- | -------------------------------- | -------------------- |
    | self             | This query sort by                                                                                                                                                                                                        | QuerySortBy | not null                         | READ                 |
    | column           | The QueryColumn to sort on.                                                                                                                                                                                               | QueryColumn | not null                         | READ                 |
    | direction        | The direction the QueryColumn is to be sorted in. This property is identified by a URI (`urn:openproject-org:api:v3:queries:directions:asc` or `urn:openproject-org:api:v3:queries:directions:desc`) instead of by a URL. |             | not null                         | READ                 |

    ## Local Properties

    | Property         | Description                                            | Type        | Constraints                      | Supported operations |
    | :--------------: | ------------------------------------------------------ | ----------- | -------------------------------- | -------------------- |
    | id               | QuerySortBy id                                         | String      | not null                         | READ                 |
    | name             | QuerySortBy name                                       | String      | not null                         | READ                 |
  name: Query Sort Bys
- description: |-
    A QueryFilterInstanceSchema is a Schema specifically for describing QueryFilterInstances. Because the behaviour of FilterInstances, with regards to the `values` property, differs from one another depending on the chosen Filter, the QueryFilterInstanceSchema explicitly lists the dependencies in its `_dependencies` property. As the property causing the difference is the selected Filter, that property is linked. Apart from that, a QueryFilterInstanceSchema has the same structure a Schema does.

    ## Linked Properties

    | Link                  | Description                                         | Type                      | Constraints | Supported operations |
    | :-------------------: | ----------------------------------------            | -------------             | --------    | -------------------- |
    | self                  | This QueryFilterInstanceSchema (same as for schema) | QueryFilterInstanceSchema | not null    | READ                 |
    | filter                | The filter for which this schema is specific        | Filter                    | not null    | READ                 |

    ## Local Properties

    | Property         | Description                                            | Type         | Constraints                      | Supported operations |
    | :--------------: | ------------------------------------------------------ | ------------ | -------------------------------- | -------------------- |
    | name             | Describes the name attribute                           | Field schema | not null                         | READ                 |
    | filter           | QuerySortBy name                                       | Field schema | not null                         | READ                 |
  name: Query Filter Instance Schema
- description: |-
    Work packages may be related to each other in different ways.

    ```
    +--------------+                            +--------------+
    |              | 1                        1 |              |
    | Work package +-------------+--------------+ Work package |
    |              | from        |           to |              |
    +--------------+             |              +--------------+
                          +------+-------+
                          |   Relation   |
                          +--------------+
                          | type         |
                          | reverseType  |
                          | description  |
                          | lag        |
                          +--------------+
    ```

    ## Actions

    | Link                | Description                                                          | Condition                                     |
    |:-------------------:| -------------------------------------------------------------------- | --------------------------------------------- |
    | update              | Updates the relation between two work packages via a form            | **Permission**: manage work package relations |
    | updateImmediately   | Updates the relation between two work packages                       | **Permission**: manage work package relations |
    | delete              | Destroys the relation between the two work packages                  | **Permission**: manage work package relations |

    ## Linked Properties

    | Link          | Description                           | Type          | Constraints | Supported operations | Condition                                     |
    |:-------------:|-------------------------------------- | ------------- | ----------- | -------------------- | --------------------------------------------- |
    | self          | This relation                         | Relation      | not null    | READ                 | **Permission**: view work packages            |
    | schema        | The schema of this relation           | Schema        | not null    | READ                 |                                               |
    | from          | The emanating work package            | WorkPackage   | not null    | READ                 | **Permission**: view work packages            |
    | to            | The work package the relation ends in | WorkPackage   | not null    | READ                 | **Permission**: view work packages            |

    ## Local Properties

    | Property         | Description                                                   | Type    | Constraints                                                                                                   | Supported operations |
    | :---------------:| ------------------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------- | -------------------- |
    | id               | Relation ID                                                   | Integer | x > 0                                                                                                         | READ                 |
    | name             | The internationalized name of this kind of relation           | String  |                                                                                                               | READ
    | type             | Which kind of relation (blocks, precedes, etc.)               | String  | in: relates, duplicates, duplicated, blocks, blocked, precedes, follows, includes, partof, requires, required | READ / WRITE         |
    | reverseType      | The kind of relation from the other WP's perspective          | String  | in: relates, duplicates, duplicated, blocks, blocked, precedes, follows, includes, partof, requires, required | READ                 |
    | description      | Short text further describing the relation                    | String  |                                                                                                               | READ / WRITE         |
    | lag*             | The number of days between closing of `from` and start of `to`| Integer | x >= 0                                                                                                        | READ / WRITE         |

    \* Only applicable for some relation types such as "follows". You can check using the relation by schema
    endpoint at `/api/v3/relations/schema/{type}`.
  name: Relations
- description: |-
    Throughout OpenProject user input for many properties can be formatted using *Markdown*.
    Using the appropriate rendering endpoint it is possible to render custom formatted inputs into HTML and thus
    receive a preview of the rendered text.

    The request to a rendering endpoint must always have a MIME-Type of `text/plain`.
    The request body is the actual string that shall be rendered as HTML string.
  name: Previewing
- description: |-
    Revisions are sets of updates to files in the context of repositories linked in OpenProject.

    ## Linked Properties

    |  Link            | Description                                                                                       | Type          | Constraints | Supported operations |
    |:----------------:| --------------------------------------------------------------------------------------------------| ------------- | ----------- | -------------------- |
    | self             | This revision                                                                                     | Revision      | not null    | READ                 |
    | project          | The project to which the revision belongs                                                         | Project       | not null    | READ                 |
    | author           | The user that added this revision, if the authorName was mapped to a user in OpenProject          | User          |             | READ                 |
    | showRevision     | A URL to the repository view (outside APIv3) showing this revision                                | -             | not null    | READ                 |

    ## Local Properties

    | Property                | Description                                                                                                                                                 | Type        | Constraints | Supported operations |
    |:-----------------------:| ------------------------------------------------------------------------------------------------------------------------------------------------------------| ----------- | ----------- | -------------------- |
    | id                      | Revision's id, assigned by OpenProject                                                                                                                      | Integer     | x > 0       | READ                 |
    | identifier              | The raw SCM identifier of the revision (e.g. full SHA hash)                                                                                                 | String      | not null    | READ                 |
    | formattedIdentifier     | The SCM identifier of the revision, formatted (e.g. shortened unambiguous SHA hash). May be identical to identifier in many cases                           | String      | not null    | READ                 |
    | authorName              | The name of the author that committed this revision. Note that this name is retrieved from the repository and does not identify a user in OpenProject.      | String      | not null    | READ                 |
    | message                 | The commit message of the revision                                                                                                                          | Formattable | not null    | READ                 |
    | createdAt               | The time this revision was committed to the repository                                                                                                      | DateTime    | not null    | READ                 |
  name: Revisions
- description: |-
    When principals (groups or users) are assigned to a project, they are receive roles in that project. Roles regulate access to specific resources by having permissions configured for them.

    Currently, this is only a stub.

    ## Linked Properties

    | Link                  | Description                               | Type          | Constraints                    | Supported operations |
    | :-------------------: | ----------------------------------------- | ------------- | -------------------------------| -------------------- |
    | self                  | This role                                 | Role          | not null                       | READ                 |

    ## Local Properties

    | Property    | Description                                   | Type        | Constraints | Supported operations |
    | :---------: | --------------------------------------------- | ----------- | ----------- | -------------------- |
    | id          | Role id                                       | Integer     | x > 0       | READ                 |
    | name        | Role name                                     | String      | not null    | READ                 |
  name: Roles
- description: |-
    The root resource contains links to available resources in the API. By following these links
    a client should be able to discover further resources in the API.

    *Note: Currently there is no list action for projects available.*
    *A client will therefore have to know links to projects and can't (yet) discover them.*

    | Link                  | Description                                      | Type            | Nullable | Supported operations | Condition                                        |
    | :-------------------: | ------------------------------------------------ | --------------- | -------- | -------------------- | ---------                                        |
    | configuration         | The configuration of this OpenProject instance   | Configuration   |          | READ                 |                                                  |
    | user                  | The user currently logged-in                     | User            |          | READ                 | logged in                                        |
    | userPreferences       | The preferences of the logged-in user            | UserPreference  |          | READ                 | logged in                                        |
    | priorities            | List of available priorities                     | Collection      |          | READ                 | **Permission** View work packages in any project |
    | statuses              | List of available work package statuses          | Collection      |          | READ                 | **Permission** View work packages in any project |
    | types                 | List of available work package types             | Collection      |          | READ                 | **Permission** View work packages in any project |
    | workPackages          | List of all work packages                        | Collection      |          | READ                 | **Permission** View work packages in any project |
    | users                 | List of all users                                | Collection      |          | READ                 | **Permission** Administrator                     |

    ## Local Properties

    | Property                  | Description                                          | Type       | Condition                                | Supported operations |
    | :-----------------------: | ---------------------------------------------------- | ---------- | ---------------------------------        | -------------------- |
    | instanceName              | The name of the OpenProject instance                 | String     |                                          | READ                 |
    | coreVersion               | The OpenProject core version number for the instance | String     | **Permission** requires admin privileges | READ                 |
  name: Root
- description: |-
    The schema provides detailed information about the properties of a resource.

    The schema is represented by a dictionary where keys are names of resource properties and values are
    objects describing the corresponding property.

    These objects are called **field schema** and form the core of the schema representation.
    Each of them can contain its own `_links` and `_embedded` section.

    ## Linked Properties

    | Link                | Description                              | Type          | Nullable | Supported operations |
    |:-------------------:| ---------------------------------------- | ------------- | -------- | -------------------- |
    | self                | This schema                              | Schema        |          | READ                 |

    ## Local Properties

    | Property            | Description                                                                        | Type             |
    | :-----------------: | ---------------------------------------------------------------------------------- | ---------------- |
    | _dependencies       | A list of dependencies between one property's value and another property           | SchemaDependency |

    The `_dependencies` property contains the list of dependencies that exist between the value selected for one of the properties of the described resource and the resource's structure. Depending on the value, additional properties might exist or properties might have other values allowed to be assigned. See [SchemaDependency](https://www.openproject.org/docs/api/endpoints/schemas/#schema-dependencies) for more information.

    ## Field schema

    ### Linked Properties

    | Property             | Description                                                    | Conditions                                           |
    | :--------------:     | -------------------------------------------------------------- | ---------------------------------------------        |
    | allowedValues        | List of resources that are assignable by the current user.     | Will not exist if `allowedValuesSchemas` is present. |
    | allowedValuesSchemas | Link to schemas further describing the property.               | Will not exist if `allowedValues` is present.        |

    The `allowedValues` can either contain a list of canonical links or just a single link to a collection resource.
    This is an optimization to allow efficient handling of both small resource lists (that can be enumerated inline) and large
    resource lists (requiring one or more separate requests).

    The `allowedValuesSchemas` will on rare occasions (e.g. for a [Query](https://www.openproject.org/docs/api/endpoints/queries/)) replace `allowedValues`. This is done when there is no fixed set of allowed values. Instead, the allowed values will have to follow a schema, or one of a list of schemas, in its own right.

    Only one of the links (`allowedValues`, `allowedValuesSchemas`) will exist for any given property.

    ### Local Properties

    | Property          | Description                                                                        | Type         | Default |
    |:-----------------:| ---------------------------------------------------------------------------------- | ------------ | ------- |
    | type              | The data type of the property                                                      | MetaType     |         |
    | name              | Human readable name of the property as it could be displayed in a UI               | String       |         |
    | required          | If true this property is not nullable                                              | Boolean      | true    |
    | hasDefault        | If true this property will have a default value if none is provided                | Boolean      | false   |
    | writable          | If false it is not allowed to **change** the property value                        | Boolean      | true    |
    | minLength         | The value of the property must at least contain the specified amount of characters | Integer      | 0       |
    | maxLength         | The value of the property must at most contain the specified amount of characters  | Integer      | ∞       |
    | regularExpression | The value of the property must match the given regular expression (if not null)    | String       | null    |
    | location          | If present, contains a reference to the location of the property in the JSON       | String       | null    |
    | description       | If present, contains a formattable, human readable description                     | Formattable  | null    |
    | deprecated        | If present, the client should consider the existence of the property deprecated    | Boolean      | false   |

    All of the above properties that do not have a default value *must* be present in the schema.
    For properties that have a default value, the client can assume the default value, if the property is missing.

    Note that regular expressions used in the API follow the rules of [Ruby Regular Expressions](https://ruby-doc.org/core-2.2.6/Regexp.html).

    ### Location property

    The location property gives a hint as to where to find the resource property:

      * when not set, it is in the resource top level attributes;
      * when set to `_links`, it is under the path `_links.propertyName`;
      * when set to `_meta`, it is under the path `_meta.propertyName`.

    For example, for a work package schema, the field schema of the `user` property has a location
    property set to `_links`. This means that the `user` property will be found under the path
    `_links.user` of the json payload of the work package resource.

    ## Schema Dependencies

    A `SchemaDependency` describes the dependencies between a value chosen for a resource's property
    and the resource's structure. By that, additional properties or changes in a property are
    described.

    A `SchemaDependency` will never describe a property to disappear, only to appear. As such it
    always provides additional information. For a property that is depending on another property's
    value, this can result in not being listed in the resource's schema itself at all. This will be
    the case if the existence of the property as a whole will be dependent. If only one of the aspects
    (e.g. *writable*) of the property changes with the selected value, the property itself will
    already be listed in the schema, but it will lack the dependent aspect.

    Given that SchemaDependencies will only add information, and the content type of JSON, a client should be able to join the two objects, the schema and the dependency, into one object easily.

    SchemaDependencies are always embedded inside a Schema's `_dependencies` attribute. As such, they are not independently existing resources. Consequently, they do not have a `self` reference.

    ### Linked Properties

    A SchemaDependency does not have any links.

    ### Local Properties

    | Property            | Description                                                                        | Type             |
    | :-----------------: | ---------------------------------------------------------------------------------- | ---------------- |
    | on                  | The name of the property on which the dependency exists                            | string           |
    | dependencies        | The additions to a schema grouped by the value of the depending property           | object           |

    The following excerpt exemplifies the objects that can be found as a value of the `dependencies` property:

    ```json
    {
      "_type": "SchemaDependency",
      "on": "someProperty",
      "dependencies": {
        "1": {
          "loremIpsum": {
            "type": "User",
            "name": "Lorem ipsum",
            "required": true,
            "hasDefault": false,
            "writable": true,
            "location": "_links",
            "description": {
                "format": "markdown",
                "raw": "A description for field Lorem ipsum. This may contain [links](https://example.com).",
                "html": "<p>A description for field Lorem ipsum. This may contain <a href=\"https://example.com\">links</a>.</p>"
            };
            "_links": {
              "allowedValues": {
                "href": "/api/v3/some/path/to/users"
              }
            }
          }
        },
        "2": {
          "loremIpsum": {
            "type": "User",
            "name": "Lorem ipsum",
            "required": true,
            "hasDefault": false,
            "writable": true,
            "location": "_links",
            "_links": {
              "allowedValues": {
                "href": "/api/v3/a/totally/different/path/to/other/users"
              }
            }
          }
        },
        "3": {
          "loremIpsum": {
            "type": "User",
            "name": "Lorem ipsum",
            "required": true,
            "hasDefault": false,
            "writable": false,
            "location": "_links",
          }
        },
        "4": {}
      }
    }
    ```

    Given the example above:
      * If the depending property is `1`, `2` or `3`:
        * The client must set the property `loremIpsum`, because of `"required": true` for all three field schemas
        * When the depending property is `1` or `2`, the values allowed to be set for `loremIpsum` property differ
        * When the depending property is `3`, the `loremIpsum` property will not be writable
      * If the depending property is `4`, the `loremIpsum` property does not exist

    Because of the limitation of JSON objects, all keys will be strings, even when the depending value is actually something different (e.g. Integer, Date).
    This is also true for resources where the resource url is used as the key.
  name: Schemas
- name: Statuses
  description: |-
    ## Linked Properties

    | Link | Description | Type   | Constraints | Supported operations |
    |:----:|-------------|--------|-------------|----------------------|
    | self | This status | Status | not null    | READ                 |

    ## Local Properties

    |      Property      | Description                                                                                                                                | Type    | Constraints   | Supported operations |
    |:------------------:|--------------------------------------------------------------------------------------------------------------------------------------------|---------|---------------|----------------------|
    |         id         | Status id                                                                                                                                  | Integer | x > 0         | READ                 |
    |        name        | Status name                                                                                                                                | String  |               | READ                 |
    |      isClosed      | Indicates, whether work package of this status are considered closed                                                                       | Boolean |               | READ                 |
    |       color        | A Hex-coded value of the color assigned to the status.                                                                                     | String  |               | READ                 |
    |     isDefault      | True, if this status is the default status for new work packages                                                                           | Boolean |               | READ                 |
    |     isReadonly     | Indicates, whether work package of this status are readonly                                                                                | Boolean |               | READ                 |
    | excludedFromTotals | Indicates, whether work package of this status are excluded from totals of<br/>`Work`, `Remaining work`, and  `% Complete` in a hierarchy. | Boolean |               | READ                 |
    |  defaultDoneRatio  | The percentageDone being applied when changing to this status                                                                              | Integer | 0 <= x <= 100 | READ                 |
    |      position      | Sort index of the status                                                                                                                   | Integer |               | READ                 |
- description: |-
    ## Actions

    | Link                | Description                                                                | Condition                                                                                           |
    |:-------------------:| -------------------------------------------------------------------------- | ----------------------------------------------------------------                                    |
    | updateImmediately   | Directly perform edits on this time entry                                  | **Permission**: 'edit time entries' or 'edit own time entries' if the time entry belongs to the user, or 'log own time' if the time entry is ongoing |
    | update              | Form endpoint that aids in preparing and performing edits on a TimeEntry   | **Permission**: 'edit time entries' or 'edit own time entries' if the time entry belongs to the user, or 'log own time' if the time entry is ongoing |
    | delete              | Delete this time entry                                                     | **Permission**: 'edit time entries' or 'edit own time entries' if the time entry belongs to the user, or 'log own time' if the time entry is ongoing |

    ## Linked Properties

    | Link          | Description                                                                                                                             | Type                | Constraints           | Supported operations | Condition                                                 |
    | :-----------: | --------------------------------------------------------------                                                                          | -------------       | --------------------- | -------------------- | --------------------------------------------------------- |
    | self          | This time entry                                                                                                                         | TimeEntry           | not null              | READ                 |                                                           |
    | project       | The project the time entry is bundled in. The project might be different from the work package's project once the workPackage is moved. | Project             | not null              | READ / WRITE         |                                                           |
    | workPackage   | The work package the time entry is created on                                                                                           | WorkPackage         |                       | READ / WRITE         |                                                           |
    | user          | The user the time entry tracks expenditures for                                                                                         | User                | not null              | READ / WRITE          | **Permission**: Log time for other users permission      |
    | activity      | The time entry activity the time entry is categorized as                                                                                | TimeEntriesActivity |                       | READ / WRITE         |                                                           |

    Depending on custom fields defined for time entries, additional links might exist.

    Time entries are either linked to a work package or to a project. If they are linked to a project, the work package reference is empty. If they are linked to a work package, the project reference is filled up automatically to point to the work package's project.

    ## Local Properties

    | Property     | Description                                               | Type     | Constraints                                          | Supported operations | Condition                                                   |
    | :----------: | --------------------------------------------------------- | -------- | ---------------------------------------------------- | -------------------- | ----------------------------------------------------------- |
    | id           | Time entries' id                                          | Integer  | x > 0                                                | READ                 |                                                             |
    | comment      | A text provided by the user detailing the time entry      | String   |                                                      | READ / WRITE         |                                                             |
    | spentOn      | The date the expenditure is booked for                    | Date     |                                                      | READ / WRITE         |                                                             |
    | hours        | The time quantifying the expenditure                      | Time     |                                                      | READ / WRITE         |                                                             |
    | ongoing      | Whether the time entry is actively tracking               | Boolean  |                                                      | READ / WRITE         |                                                             |
    | createdAt    | The time the time entry was created                       | DateTime |                                                      | READ                 |                                                             |
    | updatedAt    | The time the time entry was last updated                  | DateTime |                                                      | READ                 |                                                             |

    Depending on custom fields defined for time entries, additional properties might exist.
  name: Time entries
- description: |-
    Time entries are classified by an activity which is one item of a set of user defined activities (e.g. Design, Specification, Development).

    ## Actions

    None

    ## Linked Properties

    | Link          | Description                                                    | Type                | Constraints           | Supported operations | Condition                                 |
    | :-----------: | -------------------------------------------------------------- | -------------       | --------------------- | -------------------- | ----------------------------------------- |
    | self          | This time entry activity                                       | TimeEntriesActivity | not null              | READ                 |                                           |
    | projects      | List of projects the time entry is active in                   | []Project           | not null              | READ / WRITE         |                                           |

    ## Local Properties

    | Property     | Description                                                  | Type     | Constraints                                          | Supported operations | Condition                                                   |
    | :----------: | ---------------------------------------------------------    | -------- | ---------------------------------------------------- | -------------------- | ----------------------------------------------------------- |
    | id           | Time entries' id                                             | Integer  | x > 0                                                | READ                 |                                                             |
    | name         | The human readable name chosen for this activity             | String   | max 30 characters                                    | READ                 |                                                             |
    | position     | The rank the activity has in a list of activities            | Date     |                                                      | READ                 |                                                             |
    | default      | Flag to signal whether this activity is the default activity | Boolean  |                                                      | READ                 |                                                             |
  name: Time entry activities
- description: |-
    Work package types represented in the system.

    Types exist globally and are then activated for projects.

    ## Linked Properties

    |  Link         | Description               | Type          | Constraints | Supported operations |
    |:-------------:|-------------------------- | ------------- | ----------- | -------------------- |
    | self          | This type                 | Type          | not null    | READ                 |

    ## Local Properties

    | Property         | Description                                          | Type     | Constraints | Supported operations |
    |:----------------:| ---------------------------------------------------- | -------- | ----------- | -------------------- |
    | id               | Type id                                              | Integer  | x > 0       | READ                 |
    | name             | Type name                                            | String   |             | READ                 |
    | color            | The color used to represent this type                | Color    |             | READ                 |
    | position         | Sort index of the type                               | Integer  |             | READ                 |
    | isDefault        | Is this type active by default in new projects?      | Boolean  |             | READ                 |
    | isMilestone      | Do work packages of this type represent a milestone? | Boolean  |             | READ                 |
    | createdAt        | Time of creation                                     | DateTime |             | READ                 |
    | updatedAt        | Time of the most recent change to the user           | DateTime |             | READ                 |
  name: Types
- description: |-
    ## Linked Properties

    |  Link     | Description                                              | Type           | Constraints           | Supported operations |
    |:---------:|----------------------------------------------------------| -------------- | --------------------- | -------------------- |
    | self      | This UserPreferences                                     | UserPreferences| not null              | READ                 |
    | user      | The user that this preference belongs to                 | User           | not null              | READ                 |

    ## Local Properties

    | Property               | Description                                                                     | Type                | Constraints | Supported operations |
    |:----------------------:| -----------------------------------------------------------                     | ----------          | ----------- | -------------------- |
    | autoHidePopups         | Whether to hide popups (e.g. success messages) after 5 seconds                  | Boolean             |             | READ / WRITE         |
    | notifications          | The settings for the notifications to be received by the user                   | NotificationSetting |             | READ / WRITE         |
    | timeZone               | Current selected time zone                                                      | String              |             | READ / WRITE         |
    | commentSortDescending  | Sort comments in descending order                                               | Boolean             |             | READ / WRITE         |
    | warnOnLeavingUnsaved   | Issue warning when leaving a page with unsaved text                             | Boolean             |             | READ / WRITE         |
  name: UserPreferences
- name: Users
  description: |-
    ## Actions

    | Link                | Description                                                          | Condition                                                        |
    |:-------------------:| -------------------------------------------------------------------- | ---------------------------------------------------------------- |
    | lock                | Restrict the user from logging in and performing any actions         | not locked; **Permission**: Administrator                        |
    | show                | Link to the OpenProject user page (HTML)                             |                                                                  |
    | unlock              | Allow a locked user to login and act again                           | locked; **Permission**: Administrator                            |
    | updateImmediately   | Updates the user's attributes.                                       | **Permission**: Administrator, manage_user global permission     |
    | delete              | Permanently remove a user from the instance                          | **Permission**: Administrator, self-delete                       |

    ## Linked Properties

    |  Link       | Description                                                                                                                                                          | Type              | Constraints           | Supported operations | Condition                                                     |
    |:-----------:|--------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------- | --------------------- | -------------------- | -----------------------------------------                     |
    | self        | This user                                                                                                                                                            | User              | not null              | READ                 |                                                               |
    | auth_source | Link to the user's auth source (endpoint not yet implemented)                                                                                                        | LdapAuthSource    |                       | READ / WRITE         | **Permission**: Administrator                                 |
    | members     | Link to collection of all the user's memberships. The list will only include the memberships in projects in which the requesting user has the necessary permissions. | MemberCollection  |                       | READ                 | **Permission**: view members or manage members in any project |

    Depending on custom fields defined for users, additional links might exist.

    ## Local Properties

    | Property     | Description                                               | Type     | Constraints                                          | Supported operations | Condition                                                                               |
    | :----------: | --------------------------------------------------------- | -------- | ---------------------------------------------------- | -------------------- | -----------------------------------------------------------                             |
    | id           | User's id                                                 | Integer  | x > 0                                                | READ                 |                                                                                         |
    | login        | User's login name                                         | String   | unique, 256 max length                               | READ / WRITE         | **Permission**: Administrator, manage_user global permission                            |
    | firstName    | User's first name                                         | String   | 30 max length                                        | READ / WRITE         | **Permission**: Administrator, manage_user global permission                            |
    | lastName     | User's last name                                          | String   | 30 max length                                        | READ / WRITE         | **Permission**: Administrator, manage_user global permission                            |
    | name         | User's full name, formatting depends on instance settings | String   |                                                      | READ                 |                                                                                         |
    | email        | User's email address                                      | String   | unique, 60 max length                                | READ / WRITE         | E-Mail address not hidden, **Permission**: Administrator, manage_user global permission |
    | admin        | Flag indicating whether or not the user is an admin       | Boolean  | in: [true, false]                                    | READ / WRITE         | **Permission**: Administrator                                                           |
    | avatar       | URL to user's avatar                                      | Url      |                                                      | READ                 |                                                                                         |
    | status       | The current activation status of the user (see below)     | String   | in: ["active", "registered", "locked", "invited"]    | READ                 |                                                                                         |
    | language     | User's language                                           | String   | ISO 639-1                                            | READ / WRITE         | **Permission**: Administrator, manage_user global permission                            |
    | password     | User's password for the default password authentication   | String   |                                                      | WRITE                | **Permission**: Administrator                                                           |
    | identity_url | User's identity_url for OmniAuth authentication           | String   |                                                      | READ / WRITE         | **Permission**: Administrator                                                           |
    | createdAt    | Time of creation                                          | DateTime |                                                      | READ                 |                                                                                         |
    | updatedAt    | Time of the most recent change to the user                | DateTime |                                                      | READ                 |                                                                                         |

    Depending on custom fields defined for users, additional properties might exist.

    The `status` of a user can be one of:

    * `active` - the user can log in with the account right away

    * `invited` - the user is invited and is pending registration

    If the user's `status` is set to `active` during creation a means of authentication
    has to be provided which is one of the following:

    * `password` - The password with which the user logs in.

    * `auth_source` - Link to an LDAP auth source.

    * `identity_url` - The identity URL of an OmniAuth authentication provider.

    If all of these are missing the creation will fail with an "missing password" error.

    The `language` is limited to those activated in the system.

    Due to data privacy, the user's properties are limited to reveal as little about the user as possible.
    Thus `login`, `firstName`, `lastName`, `language`, `createdAt` and `updatedAt` are hidden for all
    users except for admins or the user themselves.

    Please note that custom fields are not yet supported by the api although the backend supports them.
- description: |-
    `Values::Property` represents a single key - value pair. That pair typically is an
    excerpt of the properties of a resource. `Values::Property` itself is not an independent resource. It will always be nested and as such
    will only exist as part of another resource.

    It is currently used e.g. in the Notification resource.

    ## Linked Properties

    | Property         | Description                 | Type                | Constraints           | Supported operations | Condition                 |
    | :--------------: | ----------------------------| -----------         | --------------------- | -------------------- | ------------------------- |
    | self             | This value                  | Values::Property    | not null              | READ                 |                           |
    | schema           | This value's schema         | Schema              | not null              | READ                 |                           |

    ## Local Properties

    | Property         | Description                                            | Type         | Constraints    | Supported operations | Condition                    |
    | :--------------: | ------------------------------------------------------ | -----------  | -------------- | -------------------- | ---------------------------- |
    | property         | The pairs' key name                                    | String       | not null       | READ                 |                              |
    | value            | The pairs' value                                       | Polymorphic  |                | READ                 |                              |
  name: Values::Property
- description: |-
    Work Packages can be assigned to a version. As such, versions serve to group Work Packages into logical units where each group comprises all the work packages that needs to be finished in order for the version to be finished.

    ## Actions

    | Link                | Description                                                              | Condition                              |
    |:-------------------:|--------------------------------------------------------------------------| ---------------------------------------|
    | update              | Form endpoint that aids in preparing and performing edits on the version | **Permission**: manage versions        |
    | updateImmediately   | Directly perform edits on the version                                    | **Permission**: manage versions        |

    ## Linked Properties

    |  Link               | Description                              | Type          | Constraints                                                    | Supported operations |
    |:-------------------:|----------------------------------------- | ------------- | -------------------------------------------------------------- | -------------------- |
    | self                | This version                             | Version       | not null                                                       | READ                 |
    | definingProject     | The project to which the version belongs | Project       | only present if the project is visible for the current user    | READ                 |
    | availableInProjects | Projects where this version can be used  | Projects      | not null                                                       | READ                 |

    Depending on custom fields defined for versions, additional linked properties might exist.

    ## Local Properties

    | Property    | Description                                   | Type        | Constraints                                        | Supported operations |
    | :---------: | --------------------------------------------- | ----------- | -----------                                        | -------------------- |
    | id          | Version id                                    | Integer     | x > 0                                              | READ                 |
    | name        | Version name                                  | String      | not null, may not exceed 60 characters             | READ / WRITE         |
    | description |                                               | Formattable |                                                    | READ / WRITE         |
    | startDate   |                                               | Date        |                                                    | READ / WRITE         |
    | endDate     |                                               | Date        |                                                    | READ / WRITE         |
    | status      | The current status of the version             | String      | not null, only 'open', 'finished', 'closed'        | READ / WRITE         |
    | sharing     | The current status of the version             | String      | not null, limited to fixed set as defined by form  | READ / WRITE         |
    | createdAt   | Time of creation                              | DateTime    | not null                                           | READ                 |
    | updatedAt   | Time of the most recent change to the version | DateTime    | not null                                           | READ                 |

    Depending on custom fields defined for versions, additional properties might exist.
  name: Versions
- description: "A View is a representation of some information. That information might
    be a query (currently it always is).\nThe view will store the configuration on
    how to display the information but not the information itself.\n\nA View might
    then be a graph, a table, a gantt chart or something completely different.\nThe
    client will have to choose how to represenent in the view. \n\nA View instance
    will always be of a subtype of `Views`, e.g. `Views::WorkPackageslist`. The properties
    between each `Views` type might differ a lot.\n\n**The View is a new concept so
    it is prone to change.**\n\nCurrently a lot of restrictions still apply:\n  *
    There will always be a query associated to the view when in the complete concept,
    this limitation should not be necessary.\n  * A query can only have one view associated.\n
    \ * There is neither an update nor a delete endpoint and the schema and form endpoints
    are also missing. \n    To delete a view, simply delete the query.\n  * Most of
    the properties are deduced from the associated query and can thus only be updated
    via updating the query.\n  * The properties are not different between `Views`
    subtypes.\n\n## Linked Properties\n\n| Link                  | Description                                                                                                               |
    Type                      | Constraints            | Supported operations |\n|
    :-------------------: | ----------------------------------------                                                                                  |
    -------------             | --------               | -------------------- |\n|
    self                  | This view                                                                                                                 |
    View (a subtype of it)    | not null               | READ                 |\n|
    query                 | This query from which to fetch the data                                                                                   |
    Query                     | not null               | READ/WRITE           |\n|
    project               | This project the view is defined in (deduces from the
    query). If no project is specified, the View is considered global.  | Project
    \                  | Deduced from the query | READ                 |\n\n## Local
    Properties\n\n| Property         | Description                                           |
    Type                  | Constraints                               | Supported
    operations|\n| :--------------: | ------------------------------------------------------|
    -----------           | ------------------------------------      | --------------------|\n|
    _type            | The subtype chosen                                    | String
    \               |                                           | READ                |\n|
    id               | View id                                               | Integer
    \              | x > 0                                     | READ                |\n|
    name             | View name                                             | String
    \               | Deduced from the query                    | READ                |\n|
    public           | Can users besides the owner see the view?             | Boolean
    \              | Deduced from the query                    | READ                |\n|
    starred          | Should the view be highlighted to the user?           | Boolean
    \              | Deduced from the query                    | READ                |\n|
    createdAt        | Time of creation                                      | DateTime
    \             | not null                                  | READ                |\n|
    updatedAt        | Time of the most recent change to the view            | DateTime
    \             | not null                                  | READ                |"
  name: Views
- description: |-
    Represents an individual page in a project's wiki.

    *This resource is currently a stub*

    ## Actions

    | Link                | Description                                                          | Condition                                                                                                                        |
    |:-------------------:|----------------------------------------------------------------------| ---------------------------------------                                                                                          |
    | addAttachment       | Attach a file to the wiki page                                       | **Permission**: edit wiki page      |

    ## Linked Properties

    | Property         | Description                                            | Type        | Constraints    | Supported operations |
    | :--------------: | ------------------------------------------------------ | ----------- | -------------- | -------------------- |
    | self             | This wiki page                                         | WikiPage    | not null       | READ                 |
    | attachments      | The files attached to this wiki page                   | Collection  |                | READ                 |
    | project          | The project the wiki page belongs to                   | Project     | not null       | READ                 |

    ## Local Properties

    | Property         | Description                                 | Type                  | Constraints                          | Supported operations |
    | :--------------: | ------------------------------------------- | -----------           | ------------------------------------ | -------------------- |
    | id               | Identifier of this wiki page                | Integer               | x > 0                                | READ                 |
    | title            | The wiki page's title                       | String                | not null                             | READ                 |
  name: Wiki Pages
- description: |-
    ## Actions

    | Link                | Description                                                              | Condition                              |
    |:-------------------:|--------------------------------------------------------------------------| ---------------------------------------|
    | addAttachment       | Attach a file to the WP                                                  | **Permission**: edit work package      |
    | addComment          | Post comment to WP                                                       | **Permission**: add work package notes |
    | addRelation         | Adds a relation to this work package.                                    | **Permission**: manage wp relations    |
    | addWatcher          | Add any user to WP watchers                                              | **Permission**: add watcher            |
    | customActions       | Collection of predefined changes that can be applied to the work package |                                        |
    | logTime             | Log time on the work package                                             | **Permission**: Log time, Log own time |
    | previewMarkup       | Post markup (in markdown) here to receive an HTML-rendered response      |                                        |
    | removeWatcher       | Remove any user from WP watchers                                         | **Permission**: delete watcher         |
    | unwatch             | Remove current user from WP watchers                                     | logged in; watching                    |
    | update              | Form endpoint that aids in preparing and performing edits on a WP        | **Permission**: edit work package      |
    | updateImmediately   | Directly perform edits on a work package                                 | **Permission**: edit work package      |
    | watch               | Add current user to WP watchers                                          | logged in; not watching                |
    | delete              | Delete this work package                                                 | **Permission**: delete work package    |

    ## Linked Properties

    | Link                   | Description                                                                                                                                           | Type                   | Constraints                               | Supported operations  | Condition                                                                                   |
    | :--------------------: | ----------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------- | ----------------------------------------- | --------------------- | -----------------------------------------                                                   |
    | self                   | This work package                                                                                                                                     | WorkPackage            | not null                                  | READ                  |                                                                                             |
    | schema                 | The schema of this work package                                                                                                                       | Schema                 | not null                                  | READ                  |                                                                                             |
    | ancestors              | Array of all visible ancestors of the work package, with the root node being the first element                                                        | Collection             | not null                                  | READ                  | **Permission** view work packages                                                           |
    | attachments            | The files attached to this work package                                                                                                               | Collection             | not null                                  | READ / WRITE          |                                                                                             |
    | author                 | The person that created the work package                                                                                                              | User                   | not null                                  | READ                  |                                                                                             |
    | assignee               | The person that is intended to work on the work package                                                                                               | User                   |                                           | READ / WRITE          |                                                                                             |
    | availableWatchers      | All users that can be added to the work package as watchers.                                                                                          | User                   |                                           | READ                  | **Permission** add work package watchers                                                    |
    | budget                 | The budget this work package is associated to                                                                                                         | Budget                 |                                           | READ / WRITE          | **Permission** view cost objects                                                            |
    | category               | The category of the work package                                                                                                                      | Category               |                                           | READ / WRITE          |                                                                                             |
    | children               | Array of all visible children of the work package                                                                                                     | Collection             | not null                                  | READ                  | **Permission** view work packages                                                           |
    | parent                 | Parent work package                                                                                                                                   | WorkPackage            | Needs to be visible (to the current user) | READ / WRITE          |                                                                                             |
    | priority               | The priority of the work package                                                                                                                      | Priority               | not null                                  | READ / WRITE          |                                                                                             |
    | project                | The project to which the work package belongs                                                                                                         | Project                | not null                                  | READ / WRITE          |                                                                                             |
    | projectPhase           | The project phase this work package is assigned to                                                                                                    | ProjectPhase           |                                           | READ / WRITE          | **Permission** view project phases. There has to be a project phase active in the project.  |
    | projectPhaseDefinition | The project phase definition for the project phase of this work package.                                                                              | ProjectPhaseDefinition |                                           | READ                  | **Permission** view project phases. The associated project phase has to be active.          |
    | responsible            | The person that is responsible for the overall outcome                                                                                                | User                   |                                           | READ / WRITE          |                                                                                             |
    | relations              | Relations this work package is involved in                                                                                                            | Relation               |                                           | READ                  | **Permission** view work packages                                                           |
    | revisions              | Revisions that are referencing the work package                                                                                                       | Revision               |                                           | READ                  | **Permission** view changesets                                                              |
    | status                 | The current status of the work package                                                                                                                | Status                 | not null                                  | READ / WRITE          |                                                                                             |
    | timeEntries            | All time entries logged on the work package. Please note that this is a link to an HTML resource for now and as such, the link is subject to change.  | N/A                    |                                           | READ                  | **Permission** view time entries                                                            |
    | type                   | The type of the work package                                                                                                                          | Type                   | not null                                  | READ / WRITE          |                                                                                             |
    | version                | The version associated to the work package                                                                                                            | Version                |                                           | READ / WRITE          |                                                                                             |
    | watchers               | All users that are currently watching this work package                                                                                               | Collection             |                                           | READ                  | **Permission** view work package watchers                                                   |

    ## Local Properties

    | Property                | Description                                                                                                                                                                   | Type        | Constraints                                                                                                                                                                                  | Supported operations | Condition                        |
    | :--------------:        | ------------------------------------------------------                                                                                                                        | ----------- | ------------------------------------------------------------------------------------------------------                                                                                       | -------------------- | -------------------------------- |
    | id                      | Work package id                                                                                                                                                               | Integer     | x > 0                                                                                                                                                                                        | READ                 |                                  |
    | lockVersion             | The version of the item as used for optimistic locking                                                                                                                        | Integer     |                                                                                                                                                                                              | READ                 |                                  |
    | subject                 | Work package subject                                                                                                                                                          | String      | not null; 1 <= length <= 255                                                                                                                                                                 | READ / WRITE         |                                  |
    | type                    | Name of the work package's type                                                                                                                                               | String      | not null                                                                                                                                                                                     | READ                 |                                  |
    | description             | The work package description                                                                                                                                                  | Formattable |                                                                                                                                                                                              | READ / WRITE         |                                  |
    | scheduleManually        | Uses manual scheduling mode when true (default). Uses automatic scheduling mode when false. Can be automatic only when predecessors or children are present.                  | Boolean     |                                                                                                                                                                                              | READ / WRITE         |                                  |
    | startDate               | Scheduled beginning of a work package                                                                                                                                         | Date        | Cannot be set for parent work packages unless it is scheduled manually; must be equal or greater than the earliest possible start date; Exists only on work packages of a non milestone type | READ / WRITE         |                                  |
    | dueDate                 | Scheduled end of a work package                                                                                                                                               | Date        | Cannot be set for parent work packages unless it is scheduled manually; must be greater than or equal to the start date; Exists only on work packages of a non milestone type                | READ / WRITE         |                                  |
    | date                    | Date on which a milestone is achieved                                                                                                                                         | Date        | Exists only on work packages of a milestone type                                                                                                                                             | READ / WRITE         |                                  |
    | derivedStartDate        | Similar to start date but is not set by a client but rather deduced by the work packages' descendants. If manual scheduleManually is active, the two dates can deviate.       | Date        |                                                                                                                                                                                              | READ                 |                                  |
    | derivedDueDate          | Similar to due date but is not set by a client but rather deduced by the work packages' descendants. If manual scheduleManually is active, the two dates can deviate.         | Date        |                                                                                                                                                                                              | READ                 |                                  |
    | duration                | The amount of time in hours the work package needs to be completed.                                                                                                           | Duration    | Not available for milestone type of work packages.                                                                                                                                           | READ / WRITE         |                                  |
    | estimatedTime           | Corresponds to work. Time a work package likely needs to be completed.                                                                                                        | Duration    |                                                                                                                                                                                              | READ / WRITE         |                                  |
    | derivedEstimatedTime    | Corresponds to total work. Time a work package likely needs to be completed including itself and its descendants.                                                             | Duration    |                                                                                                                                                                                              | READ                 |                                  |
    | remainingTime           | Corresponds to remaining work. Remaining time a work package likely needs to be completed.                                                                                    | Duration    |                                                                                                                                                                                              | READ / WRITE         |                                  |
    | derivedRemainingTime    | Corresponds to total remaining work. Remaining time a work package likely needs to be completed including itself and its descendants.                                         | Duration    |                                                                                                                                                                                              | READ                 |                                  |
    | ignoreNonWorkingDays    | When scheduling, whether or not to ignore the non working days being defined. A work package with the flag set to true will be allowed to be scheduled to a non working day.  | Boolean     | Cannot be set for parent work packages unless it is scheduled manually                                                                                                                       | READ                 |                                  |
    | spentTime               | The time booked for this work package by users working on it                                                                                                                  | Duration    |                                                                                                                                                                                              | READ                 | **Permission** view time entries |
    | percentageDone          | Corresponds to % complete. Amount of total completion for a work package.                                                                                                     | Integer     | 0 <= x <= 100; can be null                                                                                                                                                                   | READ                 |                                  |
    | derivedPercentageDone   | Corresponds to total % complete. Amount of total completion for a work package and its descendants.                                                                           | Integer     | 0 <= x <= 100; can be null                                                                                                                                                                   | READ                 |                                  |
    | readonly                | If true, the work package is in a readonly status so with the exception of the status, no other property can be altered.                                                      | Boolean     |                                                                                                                                                                                              | READ                 | Enterprise edition only          |
    | createdAt               | Time of creation                                                                                                                                                              | DateTime    |                                                                                                                                                                                              | READ                 |                                  |
    | updatedAt               | Time of the most recent change to the work package                                                                                                                            | DateTime    |                                                                                                                                                                                              | READ                 |                                  |

    Note that the properties listed here only cover the built-in properties of the OpenProject Core.
    Using plug-ins and custom fields a work package might contain various additional properties.
    A client can consult the schema information to which the work package links. The schema will contain information about
    all properties of the linking work package, including properties added by plug-ins and custom fields.

    Custom fields are identified by a key in the form of `customFieldN`, where `N` is an integer. Depending on their type,
    they can occur as properties or as linked properties. A client has to consult the schema to resolve
    the human readable name of custom fields.

    Properties that cannot be set directly on parent work packages are inferred from their children instead:

    * `startDate` is the earliest start date from its children if automatic scheduling is activated.

    * `dueDate` is the latest finish date from its children if automatic scheduling is activated.

    * `derivedEstimatedTime` is the sum of estimated times from its children and the work package's own estimated time.

    * `derivedRemainingTime` is the sum of remaining times from its children and the work package's own remaining time

    * `derivedPercentageDone` is computed by the work package's derivedEstimatedTime and derivedRemainingTime.

    `startDate` can also not be earlier than a finish date of any predecessor.

    While attachments are returned as a link whose content is to be fetched separately, clients can choose to
    replace the work package's attachments by providing an array of already uploaded [Attachment resources](https://www.openproject.org/docs/api/endpoints/attachments/)
    on [create](https://www.openproject.org/docs/api/endpoints/work-packages/#create-work-package)
    and [update](https://www.openproject.org/docs/api/endpoints/work-packages/#update-a-work-package). The attachments the work package has had prior to the request will be removed.
  name: Work Packages
- name: Work Schedule
  description: |-
    The work schedule defines if days are working days or non-working days.

    A day can be a non-working day if any of these two conditions are met:

      - the day is a recurring non-working week day: a weekend day. For instance
        Sunday is not worked in most countries;
      - the day has been defined as a non-working day: national bank holidays or
        other days deemed special. For instance the 1st of January is New Year's
        day and is a bank holiday in most countries.

    Endpoints can define which week days are working/non-working days, and which
    dates are non-working days.

    To represent the work schedule, `Day`, `WeekDay`, and `NonWorkingDay` models are used.

    ## Day Actions

    None

    ## Day Linked Properties

    | Link              | Description                                                      | Type                      | Constraints | Supported operations |
    | :---------------: | ---------------------------------------------------------------- | ------------------------- | ----------- | -------------------- |
    | self              | This day                                                         | Day                       | not null    | READ                 |
    | nonWorkingReasons | A list of resources describing why this day is a non-working day | (WeekDay/NonWorkingDay)[] |             | READ                 |
    | weekDay           | The week day for this day                                        | WeekDay                   | not null    | READ                 |

    ## Day Local Properties

    | Property   | Description                                 | Type    | Constraints    | Supported operations |
    | :--------: | ------------------------------------------- | ------- | -------------- | -------------------- |
    | date       | The date in ISO8601 format (YYYY-MM-DD)     | Date    | not null       | READ                 |
    | name       | The name of the day                         | String  | not null       | READ                 |
    | working    | `true` for a working day, `false` otherwise | Boolean | not null       | READ                 |


    ## WeekDay Actions

    | Link   | Description          | Condition                          |
    | :----: | -------------------- | ---------------------------------- |
    | update | Update this week day | **Permission**: edit work schedule |

    ## WeekDay Linked Properties

    | Link | Description   | Type    | Constraints | Supported operations |
    | :--: | ------------- | ------- | ----------- | -------------------- |
    | self | This week day | WeekDay | not null    | READ                 |

    ## WeekDay Local Properties

    | Property | Description                                         | Type    | Constraints    | Supported operations |
    | :------: | --------------------------------------------------- | ------- | -------------- | -------------------- |
    | day      | The week day from 1 to 7. 1 is Monday. 7 is Sunday. | Integer | x >= 1, x <= 7 | READ                 |
    | name     | The name of the week day                            | String  | not null       | READ                 |
    | working  | `true` for a working week day, `false` otherwise    | Boolean | not null       | READ/WRITE           |


    ## NonWorkingDay Actions

    | Link   | Description                 | Condition                          |
    | :----: | --------------------------- | ---------------------------------- |
    | update | Update this non-working day | **Permission**: edit work schedule |

    ## NonWorkingDay Linked Properties

    | Link | Description          | Type          | Constraints | Supported operations |
    | :--: | -------------------- | ------------- | ----------- | -------------------- |
    | self | This non-working day | NonWorkingDay | not null    | READ                 |

    ## NonWorkingDay Local Properties

    | Property | Description                             | Type   | Constraints | Supported operations |
    | :------: | --------------------------------------- | ------ | ----------- | -------------------- |
    | date     | The date in ISO8601 format (YYYY-MM-DD) | Date   | not null    | READ                 |
    | name     | The name of the non-working day day     | String | not null    | READ/WRITE           |
security:
- BasicAuth: []
