openapi: 3.1.0
info:
  title: Kanbert
  version: v1
servers:
  - url: https://api.kanbert.com/api/v1
tags:
  - name: Users
  - name: Clients
  - name: Projects
  - name: Tasks
  - name: Task Comments
  - name: Efforts
  - name: Contacts
  - name: Companies
  - name: Offers
  - name: Outgoing Invoices
  - name: Payments
  - name: Usergroups & Teams
  - name: Settings
  - name: Integration
  - name: Files
  - name: Custom Fields
  - name: Webhook Management
security:
  - http: []
  - oauth2: []
paths:
  /whoami:
    get:
      operationId: users.whoami
      description: '**No specific scope required.**'
      summary: Retrieve current user's information
      tags:
        - Users
      responses:
        '200':
          description: '`UserData`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserData'
        '401':
          $ref: '#/components/responses/AuthenticationException'
  /users:
    get:
      operationId: users.index
      description: '**No specific scope required.**'
      summary: List all users (basic)
      tags:
        - Users
      parameters:
        - name: sort
          in: query
          description: >-
            Available sorts are `first_name`, `last_name`, `email`.<br/>You can
            sort by multiple options by separating them with a comma. To sort in
            descending order, use `-` sign in front of the sort, for example:
            `-title`.
          schema:
            type: string
          example: sort=-created_at,title
        - name: page[size]
          in: query
          description: The number of results that will be returned per page.
          schema:
            type: integer
            default: 30
        - name: page[cursor]
          in: query
          description: The cursor to start the pagination from.
          schema:
            type: string
        - name: filter
          in: query
          description: >-
            Allowed filter fields (with allowed operators):


            | Field | Type | Operators |

            |------|------|-----------|

            | `first_name` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `last_name` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `email` | `string` | in, nin, notin, eq, ne, neq, contains, like,
            startswith, endswith, isnull, isnotnull, notnull |

            | `type` | `enum<UserType>` | eq, ne, neq, in, nin, notin, isnull,
            isnotnull, notnull |


            Filtering expression. Accepts either JSON (array/tree of conditions)
            or a readable string DSL.


            You can check the full syntax at Docs `Filtering` section.


            Special values:

            - me.id — current authenticated user id (usable on fields of type
            id). Example: `id eq me.id`

            - now — current date-time. Example: `dueOn lt now`

            - sow/eow — start/end of week. Examples: `dueOn gt sow`, `dueOn lt
            eow`

            - som/eom — start/end of month. Examples: `dueOn gt som`, `dueOn lt
            eom`

            - today — special date for today; with eq it expands to the whole
            day range. Example: `dueOn eq today`

            - today±Nd — relative day offset. Examples: `today-30d`, `today+5d`.
          schema:
            type: string
          example: >-
            title contains "Acme" and (created_at >= "2024-01-01" or client.name
            contains "Corp")
      responses:
        '200':
          description: The cursor paginated collection of `DWI.Http.Data.Api.V1.UserData`
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    description: The list of items
                    items:
                      $ref: '#/components/schemas/UserData'
                  links:
                    type: array
                    items:
                      type: string
                  meta:
                    type: object
                    properties:
                      path:
                        type:
                          - string
                          - 'null'
                        description: Base path for paginator generated URLs.
                      per_page:
                        type: integer
                        description: Number of items shown per page.
                      next_cursor:
                        type:
                          - string
                          - 'null'
                      next_cursor_url:
                        type:
                          - string
                          - 'null'
                      prev_cursor:
                        type:
                          - string
                          - 'null'
                      prev_cursor_url:
                        type:
                          - string
                          - 'null'
                    required:
                      - path
                      - per_page
                      - next_cursor
                      - next_cursor_url
                      - prev_cursor
                      - prev_cursor_url
                required:
                  - data
                  - links
                  - meta
        '401':
          $ref: '#/components/responses/AuthenticationException'
  /users/full:
    get:
      operationId: users.fullIndex
      description: '**Required scopes:** `user:read`'
      summary: Get all users (full)
      tags:
        - Users
      parameters:
        - name: sort
          in: query
          description: >-
            Available sorts are `first_name`, `last_name`, `email`,
            `created_at`, `custom_fields.<alias>`.<br/>You can sort by multiple
            options by separating them with a comma. To sort in descending
            order, use `-` sign in front of the sort, for example: `-title`.
          schema:
            type: string
          example: sort=-created_at,title
        - name: include
          in: query
          description: >-
            Available includes are `user_groups`. You can include multiple
            options by separating them with a comma.
          schema:
            type: string
        - name: page[size]
          in: query
          description: The number of results that will be returned per page.
          schema:
            type: integer
            default: 30
        - name: page[cursor]
          in: query
          description: The cursor to start the pagination from.
          schema:
            type: string
        - name: filter
          in: query
          description: >-
            Allowed filter fields (with allowed operators):


            | Field | Type | Operators |

            |------|------|-----------|

            | `archived` | `enum: with, only, without` | eq |

            | `first_name` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `last_name` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `email` | `string` | in, nin, notin, eq, ne, neq, contains, like,
            startswith, endswith, isnull, isnotnull, notnull |

            | `plan` | `enum<UserPlan>` | eq, ne, neq, in, nin, notin, isnull,
            isnotnull, notnull |

            | `type` | `enum<UserType>` | eq, ne, neq, in, nin, notin, isnull,
            isnotnull, notnull |

            | `is_owner` | `boolean` | eq, ne, neq, isnull, isnotnull, notnull |

            | `created_at` | `datetime` | eq, ne, neq, lt, lte, le, gt, gte, ge,
            in, nin, notin, isnull, isnotnull, notnull |

            | `custom_fields.*` — see Custom fields below | `custom` | eq, ne,
            neq, lt, lte, le, gt, gte, ge, in, nin, notin, contains, like,
            startswith, endswith, isnull, isnotnull, notnull |


            Filtering expression. Accepts either JSON (array/tree of conditions)
            or a readable string DSL.


            You can check the full syntax at Docs `Filtering` section.


            Special values:

            - me.id — current authenticated user id (usable on fields of type
            id). Example: `id eq me.id`

            - now — current date-time. Example: `dueOn lt now`

            - sow/eow — start/end of week. Examples: `dueOn gt sow`, `dueOn lt
            eow`

            - som/eom — start/end of month. Examples: `dueOn gt som`, `dueOn lt
            eom`

            - today — special date for today; with eq it expands to the whole
            day range. Example: `dueOn eq today`

            - today±Nd — relative day offset. Examples: `today-30d`, `today+5d`.


            Custom fields: when enabled, you can filter by
            `custom_fields.<slug>`. Example: `custom_fields.my_flag eq 'yes'` or
            `custom_fields.score gte 10`. Supported ops depend on the custom
            field type (eq, ne, in, nin, contains, startswith, endswith, isnull,
            isnotnull, and comparisons for numeric/date types).
          schema:
            type: string
          example: >-
            title contains "Acme" and (created_at >= "2024-01-01" or client.name
            contains "Corp")
      responses:
        '200':
          description: The cursor paginated collection of `UserFullData`
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    description: The list of items
                    items:
                      $ref: '#/components/schemas/UserFullData'
                  links:
                    type: array
                    items:
                      type: string
                  meta:
                    type: object
                    properties:
                      path:
                        type:
                          - string
                          - 'null'
                        description: Base path for paginator generated URLs.
                      per_page:
                        type: integer
                        description: Number of items shown per page.
                      next_cursor:
                        type:
                          - string
                          - 'null'
                      next_cursor_url:
                        type:
                          - string
                          - 'null'
                      prev_cursor:
                        type:
                          - string
                          - 'null'
                      prev_cursor_url:
                        type:
                          - string
                          - 'null'
                    required:
                      - path
                      - per_page
                      - next_cursor
                      - next_cursor_url
                      - prev_cursor
                      - prev_cursor_url
                required:
                  - data
                  - links
                  - meta
        '401':
          $ref: '#/components/responses/AuthenticationException'
  /users/{id}:
    get:
      operationId: users.show
      description: >-
        **No specific scope required.**


        Returns `UserFullData` if app has any `user:*` scope or `user-profile:*`
        if current user
      summary: Retrieve a user
      tags:
        - Users
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
              - shortcode
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id` by default it will use the integration
            slug
          schema:
            type: string
        - name: include
          in: query
          description: >-
            Available includes are `user_groups`. You can include multiple
            options by separating them with a comma.
          schema:
            type: string
      responses:
        '200':
          description: |-
            `UserData`

            `UserFullData`
          content:
            application/json:
              schema:
                anyOf:
                  - $ref: '#/components/schemas/UserData'
                  - $ref: '#/components/schemas/UserFullData'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '404':
          $ref: '#/components/responses/ModelNotFoundException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /clients:
    get:
      operationId: clients.index
      description: '**No specific scope required.**'
      summary: List all clients (basic)
      tags:
        - Clients
      parameters:
        - name: sort
          in: query
          description: >-
            Available sorts are `name`, `shortcode`.<br/>You can sort by
            multiple options by separating them with a comma. To sort in
            descending order, use `-` sign in front of the sort, for example:
            `-title`.
          schema:
            type: string
          example: sort=-created_at,title
        - name: page[size]
          in: query
          description: The number of results that will be returned per page.
          schema:
            type: integer
            default: 30
        - name: page[cursor]
          in: query
          description: The cursor to start the pagination from.
          schema:
            type: string
        - name: filter
          in: query
          description: >-
            Allowed filter fields (with allowed operators):


            | Field | Type | Operators |

            |------|------|-----------|

            | `name` | `string` | in, nin, notin, eq, ne, neq, contains, like,
            startswith, endswith, isnull, isnotnull, notnull |

            | `shortcode` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `primary_contact.id` | `id<UserData>` | eq, ne, neq, in, nin,
            notin, isnull, isnotnull, notnull |

            | `origin_space.id` | `id<SpaceData>` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |


            Filtering expression. Accepts either JSON (array/tree of conditions)
            or a readable string DSL.


            You can check the full syntax at Docs `Filtering` section.


            Special values:

            - me.id — current authenticated user id (usable on fields of type
            id). Example: `id eq me.id`

            - now — current date-time. Example: `dueOn lt now`

            - sow/eow — start/end of week. Examples: `dueOn gt sow`, `dueOn lt
            eow`

            - som/eom — start/end of month. Examples: `dueOn gt som`, `dueOn lt
            eom`

            - today — special date for today; with eq it expands to the whole
            day range. Example: `dueOn eq today`

            - today±Nd — relative day offset. Examples: `today-30d`, `today+5d`.
          schema:
            type: string
          example: >-
            title contains "Acme" and (created_at >= "2024-01-01" or client.name
            contains "Corp")
      responses:
        '200':
          description: The cursor paginated collection of `ClientData`
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    description: The list of items
                    items:
                      $ref: '#/components/schemas/ClientData'
                  links:
                    type: array
                    items:
                      type: string
                  meta:
                    type: object
                    properties:
                      path:
                        type:
                          - string
                          - 'null'
                        description: Base path for paginator generated URLs.
                      per_page:
                        type: integer
                        description: Number of items shown per page.
                      next_cursor:
                        type:
                          - string
                          - 'null'
                      next_cursor_url:
                        type:
                          - string
                          - 'null'
                      prev_cursor:
                        type:
                          - string
                          - 'null'
                      prev_cursor_url:
                        type:
                          - string
                          - 'null'
                    required:
                      - path
                      - per_page
                      - next_cursor
                      - next_cursor_url
                      - prev_cursor
                      - prev_cursor_url
                required:
                  - data
                  - links
                  - meta
        '401':
          $ref: '#/components/responses/AuthenticationException'
    post:
      operationId: clients.store
      description: '**Required scopes:** `client:write`'
      summary: Create a client
      tags:
        - Clients
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                external_id:
                  type:
                    - string
                    - 'null'
                  description: >-
                    Can be used to add an identifier from an external system,
                    must be unique within integration (integration slug)
                  maxLength: 255
                external_origin:
                  type: string
                  description: If not set, integration's slug will be used as default
                  maxLength: 255
                name:
                  type: string
                  maxLength: 255
                shortcode:
                  type: string
                  description: >-
                    If not provided, the shortcode will be generated, Shortcode
                    must be unique
                  maxLength: 255
                segment:
                  type: string
                  enum:
                    - A
                    - B
                    - C
                  default: B
                primary_contact_id:
                  type:
                    - string
                    - 'null'
                  description: User ID of the primary contact
              required:
                - name
      responses:
        '200':
          description: '`ClientFullData`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ClientFullData'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /clients/full:
    get:
      operationId: clients.fullIndex
      description: '**Required scopes:** `client:read`'
      summary: List all clients (full)
      tags:
        - Clients
      parameters:
        - name: sort
          in: query
          description: >-
            Available sorts are `name`, `shortcode`, `created_at`.<br/>You can
            sort by multiple options by separating them with a comma. To sort in
            descending order, use `-` sign in front of the sort, for example:
            `-title`.
          schema:
            type: string
          example: sort=-created_at,title
        - name: include
          in: query
          description: >-
            Available includes are `projects`. You can include multiple options
            by separating them with a comma.
          schema:
            type: string
        - name: page[size]
          in: query
          description: The number of results that will be returned per page.
          schema:
            type: integer
            default: 30
        - name: page[cursor]
          in: query
          description: The cursor to start the pagination from.
          schema:
            type: string
        - name: filter
          in: query
          description: >-
            Allowed filter fields (with allowed operators):


            | Field | Type | Operators |

            |------|------|-----------|

            | `name` | `string` | in, nin, notin, eq, ne, neq, contains, like,
            startswith, endswith, isnull, isnotnull, notnull |

            | `shortcode` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `archived` | `enum: with, only, without` | eq |

            | `segment` | `enum<ClientSegment>` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |

            | `primary_contact.id` | `id<UserData>` | eq, ne, neq, in, nin,
            notin, isnull, isnotnull, notnull |

            | `projects` | `Relation`<br /> - shortcode (string)<br /> - name
            (string)<br /> - is_acquisition (boolean)<br /> - status (enum) |
            any, none, count, all |

            | `origin_space.id` | `id<SpaceData>` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |


            Filtering expression. Accepts either JSON (array/tree of conditions)
            or a readable string DSL.


            You can check the full syntax at Docs `Filtering` section.


            Special values:

            - me.id — current authenticated user id (usable on fields of type
            id). Example: `id eq me.id`

            - now — current date-time. Example: `dueOn lt now`

            - sow/eow — start/end of week. Examples: `dueOn gt sow`, `dueOn lt
            eow`

            - som/eom — start/end of month. Examples: `dueOn gt som`, `dueOn lt
            eom`

            - today — special date for today; with eq it expands to the whole
            day range. Example: `dueOn eq today`

            - today±Nd — relative day offset. Examples: `today-30d`, `today+5d`.
          schema:
            type: string
          example: >-
            title contains "Acme" and (created_at >= "2024-01-01" or client.name
            contains "Corp")
      responses:
        '200':
          description: The cursor paginated collection of `ClientFullData`
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    description: The list of items
                    items:
                      $ref: '#/components/schemas/ClientFullData'
                  links:
                    type: array
                    items:
                      type: string
                  meta:
                    type: object
                    properties:
                      path:
                        type:
                          - string
                          - 'null'
                        description: Base path for paginator generated URLs.
                      per_page:
                        type: integer
                        description: Number of items shown per page.
                      next_cursor:
                        type:
                          - string
                          - 'null'
                      next_cursor_url:
                        type:
                          - string
                          - 'null'
                      prev_cursor:
                        type:
                          - string
                          - 'null'
                      prev_cursor_url:
                        type:
                          - string
                          - 'null'
                    required:
                      - path
                      - per_page
                      - next_cursor
                      - next_cursor_url
                      - prev_cursor
                      - prev_cursor_url
                required:
                  - data
                  - links
                  - meta
        '401':
          $ref: '#/components/responses/AuthenticationException'
  /clients/{id}:
    get:
      operationId: clients.show
      description: |-
        **No specific scope required.**

        Returns `ClientFullData` if app has any `client:*` scope
      summary: Retrieve a client
      tags:
        - Clients
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
              - shortcode
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id` by default it will use the integration
            slug
          schema:
            type: string
        - name: include
          in: query
          description: >-
            Available includes are `projects`. You can include multiple options
            by separating them with a comma.
          schema:
            type: string
      responses:
        '200':
          description: |-
            `ClientData`

            `ClientFullData`
          content:
            application/json:
              schema:
                anyOf:
                  - $ref: '#/components/schemas/ClientData'
                  - $ref: '#/components/schemas/ClientFullData'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '404':
          $ref: '#/components/responses/ModelNotFoundException'
        '422':
          $ref: '#/components/responses/ValidationException'
    patch:
      operationId: clients.update
      description: >-
        **Required scopes:** `client:write`


        To update `external_id` jump to
        [Endpoint](#operation/clients.updateExternalId)
        `/clients/{id}/external-identifier`
         To update `shortcode` jump to [Endpoint](#operation/clients.updateShortcode) `/clients/{id}/shortcode`
      summary: Update a client
      tags:
        - Clients
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
              - shortcode
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id` by default it will use the integration
            slug
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  maxLength: 255
                segment:
                  type: string
                  enum:
                    - A
                    - B
                    - C
                  default: B
                primary_contact_id:
                  type:
                    - string
                    - 'null'
                  description: User ID of the account manager
      responses:
        '200':
          description: '`ClientData`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ClientData'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '422':
          $ref: '#/components/responses/ValidationException'
    delete:
      operationId: clients.destroy
      description: '**Required scopes:** `client:write`'
      summary: Archive a client
      tags:
        - Clients
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
              - shortcode
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id` by default it will use the integration
            slug
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    enum:
                      - Client deleted successfully
                required:
                  - message
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /clients/{id}/external-identifier:
    put:
      operationId: clients.updateExternalId
      description: '**Required scopes:** `client:write`'
      summary: Update a client's external identifier
      tags:
        - Clients
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
              - shortcode
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id` by default it will use the integration
            slug
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                external_id:
                  type:
                    - string
                    - 'null'
                  description: >-
                    Can be used to add an identifier to the client from an
                    external system, must be unique within integration
                    (integration slug)
                  maxLength: 255
                external_origin:
                  type: string
                  description: If not set, integration's slug will be used as default
                  maxLength: 255
      responses:
        '200':
          description: '`ClientData`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ClientData'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /clients/{id}/shortcode:
    put:
      operationId: clients.updateShortcode
      description: '**Required scopes:** `client:write`'
      summary: Update a client's shortcode
      tags:
        - Clients
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
              - shortcode
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id` by default it will use the integration
            slug
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                shortcode:
                  type: string
                  maxLength: 255
              required:
                - shortcode
      responses:
        '200':
          description: '`ClientData`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ClientData'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /clients/{id}/restore:
    post:
      operationId: clients.restore
      description: '**Required scopes:** `client:write`'
      summary: Restore a client
      tags:
        - Clients
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
              - shortcode
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id` by default it will use the integration
            slug
          schema:
            type: string
      responses:
        '200':
          description: '`ClientFullData`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ClientFullData'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '409':
          description: |-
            An error

            An error
          content:
            application/json:
              schema:
                anyOf:
                  - type: object
                    properties:
                      message:
                        type: string
                        description: Error overview.
                        example: Contact not archived
                    required:
                      - message
                  - type: object
                    properties:
                      message:
                        type: string
                        description: Error overview.
                    required:
                      - message
        '422':
          $ref: '#/components/responses/ValidationException'
  /projects:
    get:
      operationId: projects.index
      description: '**No specific scope required.**'
      summary: List all projects
      tags:
        - Projects
      parameters:
        - name: sort
          in: query
          description: >-
            Available sorts are `shortcode`, `title`, `updated_at`,
            `created_at`, `computed_fields.<alias>`.<br/>You can sort by
            multiple options by separating them with a comma. To sort in
            descending order, use `-` sign in front of the sort, for example:
            `-title`.
          schema:
            type: string
          example: sort=-created_at,title
        - name: include
          in: query
          description: >-
            Available includes are `team`, `guests`, `tags`, `client`,
            `client.primary_contact`. You can include multiple options by
            separating them with a comma.
          schema:
            type: string
        - name: page[size]
          in: query
          description: The number of results that will be returned per page.
          schema:
            type: integer
            default: 30
        - name: page[cursor]
          in: query
          description: The cursor to start the pagination from.
          schema:
            type: string
        - name: filter
          in: query
          description: >-
            Allowed filter fields (with allowed operators):


            | Field | Type | Operators |

            |------|------|-----------|

            | `shortcode` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `title` | `string` | in, nin, notin, eq, ne, neq, contains, like,
            startswith, endswith, isnull, isnotnull, notnull |

            | `status` | `enum:running, closed` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |

            | `is_acquisition` | `boolean` | eq, ne, neq |

            | `client.id` | `id<ClientFullData>` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |

            | `client.name` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `client.shortcode` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `client.primary_contact_id` | `id<UserFullData>` | eq, ne, neq,
            in, nin, notin, isnull, isnotnull, notnull |

            | `project_type.title` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `project_type.id` | `id` | eq, ne, neq, in, nin, notin, isnull,
            isnotnull, notnull |

            | `created_by` | `id<UserData>` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |

            | `created_at` | `datetime` | eq, ne, neq, lt, lte, le, gt, gte, ge,
            in, nin, notin, isnull, isnotnull, notnull |

            | `start_date` | `date` | eq, ne, neq, lt, lte, le, gt, gte, ge, in,
            nin, notin, isnull, isnotnull, notnull |

            | `end_date` | `date` | eq, ne, neq, lt, lte, le, gt, gte, ge, in,
            nin, notin, isnull, isnotnull, notnull |

            | `tags` | `Relation`<br /> - title (string) | any, none, count, all
            |

            | `team` | `Relation`<br /> - id (id)<br /> - email (string)<br /> -
            space.id (id)<br /> - space.name (string)<br /> - added_at
            (datetime) | any, none, count, all |

            | `guests` | `Relation`<br /> - id (id)<br /> - email (string)<br />
            - added_at (datetime) | any, none, count, all |

            | `tasks` | `Relation`<br /> - uri (string)<br /> - title
            (string)<br /> - parent_task.id (id)<br /> - assignee.id (id)<br />
            - assignee.email (string)<br /> - status (enum) | any, none, count,
            all |


            Filtering expression. Accepts either JSON (array/tree of conditions)
            or a readable string DSL.


            You can check the full syntax at Docs `Filtering` section.


            Special values:

            - me.id — current authenticated user id (usable on fields of type
            id). Example: `id eq me.id`

            - now — current date-time. Example: `dueOn lt now`

            - sow/eow — start/end of week. Examples: `dueOn gt sow`, `dueOn lt
            eow`

            - som/eom — start/end of month. Examples: `dueOn gt som`, `dueOn lt
            eom`

            - today — special date for today; with eq it expands to the whole
            day range. Example: `dueOn eq today`

            - today±Nd — relative day offset. Examples: `today-30d`, `today+5d`.
          schema:
            type: string
          example: >-
            title contains "Acme" and (created_at >= "2024-01-01" or client.name
            contains "Corp")
        - name: computed_fields[alias]
          in: query
          description: >
            Dynamic computed relation fields (computed_fields[alias])


            Declare ad-hoc aggregates per request using:
            `computed_fields[<alias>] = relation.aggregate(args)`


            Syntax:

            - Count: `relation.count()` or `relation.count(<where>)`

            - Sum/Avg/Min/Max: `relation.sum(<column>)` or
            `relation.sum(<column>, <where>)`


            Where is written using the same Filter DSL and is validated against
            the relation's allowed fields.


            Use the prefix `computed_fields.` when referencing these aliases in
            `filter` or `sort`, e.g., `filter=computed_fields.tasks_done gte 1`
            or `sort=-computed_fields.tasks_done`. Bare aliases are accepted for
            backward compatibility but deprecated.


            Allowed relations for computed_fields (deny-all by default):

            - tasks (→ effort_sum): aggregates: count, sum, avg, min, max;
            coalesce default: 0


            Example:
            `?computed_fields[tasks_done]=tasks.count(status%20eq%20%22Completed%22)&filter=computed_fields.tasks_done%20gt%200`
          schema:
            type: string
          example: >-
            computed_fields[tasks_done]=tasks.count(status%20eq%20%22Completed%22)
      responses:
        '200':
          description: The cursor paginated collection of `ProjectData`
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    description: The list of items
                    items:
                      $ref: '#/components/schemas/ProjectData'
                  links:
                    type: array
                    items:
                      type: string
                  meta:
                    type: object
                    properties:
                      path:
                        type:
                          - string
                          - 'null'
                        description: Base path for paginator generated URLs.
                      per_page:
                        type: integer
                        description: Number of items shown per page.
                      next_cursor:
                        type:
                          - string
                          - 'null'
                      next_cursor_url:
                        type:
                          - string
                          - 'null'
                      prev_cursor:
                        type:
                          - string
                          - 'null'
                      prev_cursor_url:
                        type:
                          - string
                          - 'null'
                    required:
                      - path
                      - per_page
                      - next_cursor
                      - next_cursor_url
                      - prev_cursor
                      - prev_cursor_url
                required:
                  - data
                  - links
                  - meta
        '401':
          $ref: '#/components/responses/AuthenticationException'
  /projects/{id}:
    get:
      operationId: projects.show
      description: '**No specific scope required.**'
      summary: Retrieve a project
      tags:
        - Projects
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
              - shortcode
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id` by default it will use the integration
            slug
          schema:
            type: string
        - name: include
          in: query
          description: >-
            Available includes are `client`, `client.primaryContact`. You can
            include multiple options by separating them with a comma.
          schema:
            type: string
      responses:
        '200':
          description: '`ProjectData`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProjectData'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '404':
          $ref: '#/components/responses/ModelNotFoundException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /projects/{id}/team:
    get:
      operationId: projects.team
      description: '**No specific scope required.**'
      summary: List all project team members
      tags:
        - Projects
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
              - shortcode
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id` by default it will use the integration
            slug
          schema:
            type: string
        - name: page[size]
          in: query
          description: The number of results that will be returned per page.
          schema:
            type: integer
            default: 30
        - name: page[cursor]
          in: query
          description: The cursor to start the pagination from.
          schema:
            type: string
        - name: filter
          in: query
          description: >-
            Allowed filter fields (with allowed operators):


            | Field | Type | Operators |

            |------|------|-----------|

            | `email` | `string` | in, nin, notin, eq, ne, neq, contains, like,
            startswith, endswith, isnull, isnotnull, notnull |

            | `space.id` | `id` | eq, ne, neq, in, nin, notin, isnull,
            isnotnull, notnull |

            | `space.name` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `added_at` | `datetime` | eq, ne, neq, lt, lte, le, gt, gte, ge,
            in, nin, notin, isnull, isnotnull, notnull |


            Filtering expression. Accepts either JSON (array/tree of conditions)
            or a readable string DSL.


            You can check the full syntax at Docs `Filtering` section.


            Special values:

            - me.id — current authenticated user id (usable on fields of type
            id). Example: `id eq me.id`

            - now — current date-time. Example: `dueOn lt now`

            - sow/eow — start/end of week. Examples: `dueOn gt sow`, `dueOn lt
            eow`

            - som/eom — start/end of month. Examples: `dueOn gt som`, `dueOn lt
            eom`

            - today — special date for today; with eq it expands to the whole
            day range. Example: `dueOn eq today`

            - today±Nd — relative day offset. Examples: `today-30d`, `today+5d`.
          schema:
            type: string
          example: >-
            title contains "Acme" and (created_at >= "2024-01-01" or client.name
            contains "Corp")
        - name: sort
          in: query
          description: >-
            You can sort by multiple options by separating them with a comma. To
            sort in descending order, use `-` sign in front of the sort, for
            example: `-title`.
          schema:
            type: string
          example: sort=-created_at,title
      responses:
        '200':
          description: The cursor paginated collection of `DWI.Http.Data.Api.V1.UserData`
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    description: The list of items
                    items:
                      $ref: '#/components/schemas/UserData'
                  links:
                    type: array
                    items:
                      type: string
                  meta:
                    type: object
                    properties:
                      path:
                        type:
                          - string
                          - 'null'
                        description: Base path for paginator generated URLs.
                      per_page:
                        type: integer
                        description: Number of items shown per page.
                      next_cursor:
                        type:
                          - string
                          - 'null'
                      next_cursor_url:
                        type:
                          - string
                          - 'null'
                      prev_cursor:
                        type:
                          - string
                          - 'null'
                      prev_cursor_url:
                        type:
                          - string
                          - 'null'
                    required:
                      - path
                      - per_page
                      - next_cursor
                      - next_cursor_url
                      - prev_cursor
                      - prev_cursor_url
                required:
                  - data
                  - links
                  - meta
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '404':
          $ref: '#/components/responses/ModelNotFoundException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /projects/{id}/guests:
    get:
      operationId: projects.guests
      description: '**No specific scope required.**'
      summary: List all project guests
      tags:
        - Projects
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
              - shortcode
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id` by default it will use the integration
            slug
          schema:
            type: string
        - name: page[size]
          in: query
          description: The number of results that will be returned per page.
          schema:
            type: integer
            default: 30
        - name: page[cursor]
          in: query
          description: The cursor to start the pagination from.
          schema:
            type: string
        - name: filter
          in: query
          description: >-
            Allowed filter fields (with allowed operators):


            | Field | Type | Operators |

            |------|------|-----------|

            | `email` | `string` | in, nin, notin, eq, ne, neq, contains, like,
            startswith, endswith, isnull, isnotnull, notnull |

            | `added_at` | `datetime` | eq, ne, neq, lt, lte, le, gt, gte, ge,
            in, nin, notin, isnull, isnotnull, notnull |


            Filtering expression. Accepts either JSON (array/tree of conditions)
            or a readable string DSL.


            You can check the full syntax at Docs `Filtering` section.


            Special values:

            - me.id — current authenticated user id (usable on fields of type
            id). Example: `id eq me.id`

            - now — current date-time. Example: `dueOn lt now`

            - sow/eow — start/end of week. Examples: `dueOn gt sow`, `dueOn lt
            eow`

            - som/eom — start/end of month. Examples: `dueOn gt som`, `dueOn lt
            eom`

            - today — special date for today; with eq it expands to the whole
            day range. Example: `dueOn eq today`

            - today±Nd — relative day offset. Examples: `today-30d`, `today+5d`.
          schema:
            type: string
          example: >-
            title contains "Acme" and (created_at >= "2024-01-01" or client.name
            contains "Corp")
        - name: sort
          in: query
          description: >-
            You can sort by multiple options by separating them with a comma. To
            sort in descending order, use `-` sign in front of the sort, for
            example: `-title`.
          schema:
            type: string
          example: sort=-created_at,title
      responses:
        '200':
          description: The cursor paginated collection of `DWI.Http.Data.Api.V1.UserData`
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    description: The list of items
                    items:
                      $ref: '#/components/schemas/UserData'
                  links:
                    type: array
                    items:
                      type: string
                  meta:
                    type: object
                    properties:
                      path:
                        type:
                          - string
                          - 'null'
                        description: Base path for paginator generated URLs.
                      per_page:
                        type: integer
                        description: Number of items shown per page.
                      next_cursor:
                        type:
                          - string
                          - 'null'
                      next_cursor_url:
                        type:
                          - string
                          - 'null'
                      prev_cursor:
                        type:
                          - string
                          - 'null'
                      prev_cursor_url:
                        type:
                          - string
                          - 'null'
                    required:
                      - path
                      - per_page
                      - next_cursor
                      - next_cursor_url
                      - prev_cursor
                      - prev_cursor_url
                required:
                  - data
                  - links
                  - meta
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '404':
          $ref: '#/components/responses/ModelNotFoundException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /projects/{id}/phases:
    get:
      operationId: projects.phases
      description: '**Required scopes:** `task-management:read`'
      summary: List all project phases
      tags:
        - Projects
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
              - shortcode
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id` by default it will use the integration
            slug
          schema:
            type: string
        - name: page[size]
          in: query
          description: The number of results that will be returned per page.
          schema:
            type: integer
            default: 30
        - name: page[cursor]
          in: query
          description: The cursor to start the pagination from.
          schema:
            type: string
        - name: filter
          in: query
          description: >-
            Allowed filter fields (with allowed operators):


            | Field | Type | Operators |

            |------|------|-----------|

            | `title` | `string` | in, nin, notin, eq, ne, neq, contains, like,
            startswith, endswith, isnull, isnotnull, notnull |

            | `po_number` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `start_date` | `date` | eq, ne, neq, lt, lte, le, gt, gte, ge, in,
            nin, notin, isnull, isnotnull, notnull |

            | `end_date` | `date` | eq, ne, neq, lt, lte, le, gt, gte, ge, in,
            nin, notin, isnull, isnotnull, notnull |

            | `created_at` | `datetime` | eq, ne, neq, lt, lte, le, gt, gte, ge,
            in, nin, notin, isnull, isnotnull, notnull |

            | `group.id` | `id` | eq, ne, neq, in, nin, notin, isnull,
            isnotnull, notnull |

            | `group.title` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `type.id` | `id` | eq, ne, neq, in, nin, notin, isnull, isnotnull,
            notnull |

            | `type.title` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `tasks` | `Relation`<br /> - uri (string)<br /> - title
            (string)<br /> - assignee.id (id)<br /> - assignee.email (string)<br
            /> - status (enum) | any, none, count, all |


            Filtering expression. Accepts either JSON (array/tree of conditions)
            or a readable string DSL.


            You can check the full syntax at Docs `Filtering` section.


            Special values:

            - me.id — current authenticated user id (usable on fields of type
            id). Example: `id eq me.id`

            - now — current date-time. Example: `dueOn lt now`

            - sow/eow — start/end of week. Examples: `dueOn gt sow`, `dueOn lt
            eow`

            - som/eom — start/end of month. Examples: `dueOn gt som`, `dueOn lt
            eom`

            - today — special date for today; with eq it expands to the whole
            day range. Example: `dueOn eq today`

            - today±Nd — relative day offset. Examples: `today-30d`, `today+5d`.
          schema:
            type: string
          example: >-
            title contains "Acme" and (created_at >= "2024-01-01" or client.name
            contains "Corp")
        - name: computed_fields[alias]
          in: query
          description: >
            Dynamic computed relation fields (computed_fields[alias])


            Declare ad-hoc aggregates per request using:
            `computed_fields[<alias>] = relation.aggregate(args)`


            Syntax:

            - Count: `relation.count()` or `relation.count(<where>)`

            - Sum/Avg/Min/Max: `relation.sum(<column>)` or
            `relation.sum(<column>, <where>)`


            Where is written using the same Filter DSL and is validated against
            the relation's allowed fields.


            Use the prefix `computed_fields.` when referencing these aliases in
            `filter` or `sort`, e.g., `filter=computed_fields.tasks_done gte 1`
            or `sort=-computed_fields.tasks_done`. Bare aliases are accepted for
            backward compatibility but deprecated.


            Allowed relations for computed_fields (deny-all by default):

            - tasks (→ effort_sum): aggregates: count, sum, avg, min, max;
            coalesce default: 0


            Example:
            `?computed_fields[tasks_done]=tasks.count(status%20eq%20%22Completed%22)&filter=computed_fields.tasks_done%20gt%200`
          schema:
            type: string
          example: >-
            computed_fields[tasks_done]=tasks.count(status%20eq%20%22Completed%22)
        - name: sort
          in: query
          description: >-
            Available sorts are `computed_fields.<alias>`.<br/>You can sort by
            multiple options by separating them with a comma. To sort in
            descending order, use `-` sign in front of the sort, for example:
            `-title`.
          schema:
            type: string
          example: sort=-created_at,title
      responses:
        '200':
          description: The cursor paginated collection of `PhaseData`
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    description: The list of items
                    items:
                      $ref: '#/components/schemas/PhaseData'
                  links:
                    type: array
                    items:
                      type: string
                  meta:
                    type: object
                    properties:
                      path:
                        type:
                          - string
                          - 'null'
                        description: Base path for paginator generated URLs.
                      per_page:
                        type: integer
                        description: Number of items shown per page.
                      next_cursor:
                        type:
                          - string
                          - 'null'
                      next_cursor_url:
                        type:
                          - string
                          - 'null'
                      prev_cursor:
                        type:
                          - string
                          - 'null'
                      prev_cursor_url:
                        type:
                          - string
                          - 'null'
                    required:
                      - path
                      - per_page
                      - next_cursor
                      - next_cursor_url
                      - prev_cursor
                      - prev_cursor_url
                required:
                  - data
                  - links
                  - meta
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '404':
          $ref: '#/components/responses/ModelNotFoundException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /projects/{id}/milestones:
    get:
      operationId: projects.milestones
      description: '**Required scopes:** `task-management:read`'
      summary: List all project milestones
      tags:
        - Projects
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
              - shortcode
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id` by default it will use the integration
            slug
          schema:
            type: string
        - name: page[size]
          in: query
          description: The number of results that will be returned per page.
          schema:
            type: integer
            default: 30
        - name: page[cursor]
          in: query
          description: The cursor to start the pagination from.
          schema:
            type: string
        - name: filter
          in: query
          description: >-
            Allowed filter fields (with allowed operators):


            | Field | Type | Operators |

            |------|------|-----------|

            | `title` | `string` | in, nin, notin, eq, ne, neq, contains, like,
            startswith, endswith, isnull, isnotnull, notnull |

            | `po_number` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `date` | `date` | eq, ne, neq, lt, lte, le, gt, gte, ge, in, nin,
            notin, isnull, isnotnull, notnull |

            | `created_at` | `datetime` | eq, ne, neq, lt, lte, le, gt, gte, ge,
            in, nin, notin, isnull, isnotnull, notnull |

            | `group.id` | `id` | eq, ne, neq, in, nin, notin, isnull,
            isnotnull, notnull |

            | `group.title` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `tasks` | `Relation`<br /> - uri (string)<br /> - title
            (string)<br /> - assignee.id (id)<br /> - assignee.email (string)<br
            /> - status (enum) | any, none, count, all |


            Filtering expression. Accepts either JSON (array/tree of conditions)
            or a readable string DSL.


            You can check the full syntax at Docs `Filtering` section.


            Special values:

            - me.id — current authenticated user id (usable on fields of type
            id). Example: `id eq me.id`

            - now — current date-time. Example: `dueOn lt now`

            - sow/eow — start/end of week. Examples: `dueOn gt sow`, `dueOn lt
            eow`

            - som/eom — start/end of month. Examples: `dueOn gt som`, `dueOn lt
            eom`

            - today — special date for today; with eq it expands to the whole
            day range. Example: `dueOn eq today`

            - today±Nd — relative day offset. Examples: `today-30d`, `today+5d`.
          schema:
            type: string
          example: >-
            title contains "Acme" and (created_at >= "2024-01-01" or client.name
            contains "Corp")
        - name: computed_fields[alias]
          in: query
          description: >
            Dynamic computed relation fields (computed_fields[alias])


            Declare ad-hoc aggregates per request using:
            `computed_fields[<alias>] = relation.aggregate(args)`


            Syntax:

            - Count: `relation.count()` or `relation.count(<where>)`

            - Sum/Avg/Min/Max: `relation.sum(<column>)` or
            `relation.sum(<column>, <where>)`


            Where is written using the same Filter DSL and is validated against
            the relation's allowed fields.


            Use the prefix `computed_fields.` when referencing these aliases in
            `filter` or `sort`, e.g., `filter=computed_fields.tasks_done gte 1`
            or `sort=-computed_fields.tasks_done`. Bare aliases are accepted for
            backward compatibility but deprecated.


            Allowed relations for computed_fields (deny-all by default):

            - tasks (→ effort_sum): aggregates: count, sum, avg, min, max;
            coalesce default: 0


            Example:
            `?computed_fields[tasks_done]=tasks.count(status%20eq%20%22Completed%22)&filter=computed_fields.tasks_done%20gt%200`
          schema:
            type: string
          example: >-
            computed_fields[tasks_done]=tasks.count(status%20eq%20%22Completed%22)
        - name: sort
          in: query
          description: >-
            Available sorts are `computed_fields.<alias>`.<br/>You can sort by
            multiple options by separating them with a comma. To sort in
            descending order, use `-` sign in front of the sort, for example:
            `-title`.
          schema:
            type: string
          example: sort=-created_at,title
      responses:
        '200':
          description: The cursor paginated collection of `MilestoneData`
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    description: The list of items
                    items:
                      $ref: '#/components/schemas/MilestoneData'
                  links:
                    type: array
                    items:
                      type: string
                  meta:
                    type: object
                    properties:
                      path:
                        type:
                          - string
                          - 'null'
                        description: Base path for paginator generated URLs.
                      per_page:
                        type: integer
                        description: Number of items shown per page.
                      next_cursor:
                        type:
                          - string
                          - 'null'
                      next_cursor_url:
                        type:
                          - string
                          - 'null'
                      prev_cursor:
                        type:
                          - string
                          - 'null'
                      prev_cursor_url:
                        type:
                          - string
                          - 'null'
                    required:
                      - path
                      - per_page
                      - next_cursor
                      - next_cursor_url
                      - prev_cursor
                      - prev_cursor_url
                required:
                  - data
                  - links
                  - meta
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '404':
          $ref: '#/components/responses/ModelNotFoundException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /projects/{id}/epics:
    get:
      operationId: projects.epics
      description: '**Required scopes:** `task-management:read`'
      summary: List all project epics
      tags:
        - Projects
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
              - shortcode
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id` by default it will use the integration
            slug
          schema:
            type: string
        - name: page[size]
          in: query
          description: The number of results that will be returned per page.
          schema:
            type: integer
            default: 30
        - name: page[cursor]
          in: query
          description: The cursor to start the pagination from.
          schema:
            type: string
        - name: filter
          in: query
          description: >-
            Allowed filter fields (with allowed operators):


            | Field | Type | Operators |

            |------|------|-----------|

            | `title` | `string` | in, nin, notin, eq, ne, neq, contains, like,
            startswith, endswith, isnull, isnotnull, notnull |

            | `po_number` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `created_at` | `datetime` | eq, ne, neq, lt, lte, le, gt, gte, ge,
            in, nin, notin, isnull, isnotnull, notnull |

            | `tasks` | `Relation`<br /> - uri (string)<br /> - title
            (string)<br /> - assignee.id (id)<br /> - assignee.email (string)<br
            /> - status (enum) | any, none, count, all |


            Filtering expression. Accepts either JSON (array/tree of conditions)
            or a readable string DSL.


            You can check the full syntax at Docs `Filtering` section.


            Special values:

            - me.id — current authenticated user id (usable on fields of type
            id). Example: `id eq me.id`

            - now — current date-time. Example: `dueOn lt now`

            - sow/eow — start/end of week. Examples: `dueOn gt sow`, `dueOn lt
            eow`

            - som/eom — start/end of month. Examples: `dueOn gt som`, `dueOn lt
            eom`

            - today — special date for today; with eq it expands to the whole
            day range. Example: `dueOn eq today`

            - today±Nd — relative day offset. Examples: `today-30d`, `today+5d`.
          schema:
            type: string
          example: >-
            title contains "Acme" and (created_at >= "2024-01-01" or client.name
            contains "Corp")
        - name: computed_fields[alias]
          in: query
          description: >
            Dynamic computed relation fields (computed_fields[alias])


            Declare ad-hoc aggregates per request using:
            `computed_fields[<alias>] = relation.aggregate(args)`


            Syntax:

            - Count: `relation.count()` or `relation.count(<where>)`

            - Sum/Avg/Min/Max: `relation.sum(<column>)` or
            `relation.sum(<column>, <where>)`


            Where is written using the same Filter DSL and is validated against
            the relation's allowed fields.


            Use the prefix `computed_fields.` when referencing these aliases in
            `filter` or `sort`, e.g., `filter=computed_fields.tasks_done gte 1`
            or `sort=-computed_fields.tasks_done`. Bare aliases are accepted for
            backward compatibility but deprecated.


            Allowed relations for computed_fields (deny-all by default):

            - tasks (→ effort_sum): aggregates: count, sum, avg, min, max;
            coalesce default: 0


            Example:
            `?computed_fields[tasks_done]=tasks.count(status%20eq%20%22Completed%22)&filter=computed_fields.tasks_done%20gt%200`
          schema:
            type: string
          example: >-
            computed_fields[tasks_done]=tasks.count(status%20eq%20%22Completed%22)
        - name: sort
          in: query
          description: >-
            Available sorts are `title`, `po_number`, `created_at`,
            `computed_fields.<alias>`.<br/>You can sort by multiple options by
            separating them with a comma. To sort in descending order, use `-`
            sign in front of the sort, for example: `-title`.
          schema:
            type: string
          example: sort=-created_at,title
      responses:
        '200':
          description: The cursor paginated collection of `EpicData`
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    description: The list of items
                    items:
                      $ref: '#/components/schemas/EpicData'
                  links:
                    type: array
                    items:
                      type: string
                  meta:
                    type: object
                    properties:
                      path:
                        type:
                          - string
                          - 'null'
                        description: Base path for paginator generated URLs.
                      per_page:
                        type: integer
                        description: Number of items shown per page.
                      next_cursor:
                        type:
                          - string
                          - 'null'
                      next_cursor_url:
                        type:
                          - string
                          - 'null'
                      prev_cursor:
                        type:
                          - string
                          - 'null'
                      prev_cursor_url:
                        type:
                          - string
                          - 'null'
                    required:
                      - path
                      - per_page
                      - next_cursor
                      - next_cursor_url
                      - prev_cursor
                      - prev_cursor_url
                required:
                  - data
                  - links
                  - meta
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '404':
          $ref: '#/components/responses/ModelNotFoundException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /projects/{id}/tasks:
    get:
      operationId: projects.tasks
      description: '**Required scopes:** `task-management:read`'
      summary: List all project tasks
      tags:
        - Projects
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
              - shortcode
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id` by default it will use the integration
            slug
          schema:
            type: string
        - name: filter
          in: query
          description: >-
            Allowed filter fields (with allowed operators):


            | Field | Type | Operators |

            |------|------|-----------|

            | `title` | `string` | in, nin, notin, eq, ne, neq, contains, like,
            startswith, endswith, isnull, isnotnull, notnull |

            | `uri` | `string` | in, nin, notin, eq, ne, neq, contains, like,
            startswith, endswith, isnull, isnotnull, notnull |

            | `sub_tasks_in_list` | `enum:with, only, without` | eq |

            | `due_date` | `date` | eq, ne, neq, lt, lte, le, gt, gte, ge, in,
            nin, notin, isnull, isnotnull, notnull |

            | `status` | `enum<TaskStatus>` | eq, ne, neq, in, nin, notin |

            | `project.id` | `id<ProjectData>` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |

            | `project.external_id` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `project.shortcode` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `project.name` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `project.status` | `enum:running, closed` | eq, ne, neq, in, nin,
            notin, isnull, isnotnull, notnull |

            | `client.id` | `id<ClientFullData>` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |

            | `client.external_id` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `client.name` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `client.shortcode` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `assignee.id` | `id<UserFullData>` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |

            | `assignee.email` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `assignee.type` | `enum<UserType>` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |

            | `epic.id` | `id<EpicData>` | eq, ne, neq, in, nin, notin, isnull,
            isnotnull, notnull |

            | `epic.title` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `phase.id` | `id<PhaseData>` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |

            | `phase.title` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `phase.po_number` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `phase.start_date` | `date` | eq, ne, neq, lt, lte, le, gt, gte,
            ge, in, nin, notin, isnull, isnotnull, notnull |

            | `phase.end_date` | `date` | eq, ne, neq, lt, lte, le, gt, gte, ge,
            in, nin, notin, isnull, isnotnull, notnull |

            | `milestone.id` | `id<MilestoneData>` | eq, ne, neq, in, nin,
            notin, isnull, isnotnull, notnull |

            | `milestone.title` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `milestone.po_number` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `milestone.date` | `date` | eq, ne, neq, lt, lte, le, gt, gte, ge,
            in, nin, notin, isnull, isnotnull, notnull |

            | `parent_task.id` | `id<TaskData>` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |

            | `parent_task.title` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `parent_task.uri` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `parent_task.status` | `enum<TaskStatus>` | eq, ne, neq, in, nin,
            notin |

            | `sub_tasks` | `Relation`<br /> - title (string)<br /> - uri
            (string)<br /> - status (enum) | any, none, count, all |


            Filtering expression. Accepts either JSON (array/tree of conditions)
            or a readable string DSL.


            You can check the full syntax at Docs `Filtering` section.


            Special values:

            - me.id — current authenticated user id (usable on fields of type
            id). Example: `id eq me.id`

            - now — current date-time. Example: `dueOn lt now`

            - sow/eow — start/end of week. Examples: `dueOn gt sow`, `dueOn lt
            eow`

            - som/eom — start/end of month. Examples: `dueOn gt som`, `dueOn lt
            eom`

            - today — special date for today; with eq it expands to the whole
            day range. Example: `dueOn eq today`

            - today±Nd — relative day offset. Examples: `today-30d`, `today+5d`.
          schema:
            type: string
          example: >-
            title contains "Acme" and (created_at >= "2024-01-01" or client.name
            contains "Corp")
        - name: sort
          in: query
          description: >-
            You can sort by multiple options by separating them with a comma. To
            sort in descending order, use `-` sign in front of the sort, for
            example: `-title`.
          schema:
            type: string
          example: sort=-created_at,title
      responses:
        '200':
          description: The cursor paginated collection of `TaskData`
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    description: The list of items
                    items:
                      $ref: '#/components/schemas/TaskData'
                  links:
                    type: array
                    items:
                      type: string
                  meta:
                    type: object
                    properties:
                      path:
                        type:
                          - string
                          - 'null'
                        description: Base path for paginator generated URLs.
                      per_page:
                        type: integer
                        description: Number of items shown per page.
                      next_cursor:
                        type:
                          - string
                          - 'null'
                      next_cursor_url:
                        type:
                          - string
                          - 'null'
                      prev_cursor:
                        type:
                          - string
                          - 'null'
                      prev_cursor_url:
                        type:
                          - string
                          - 'null'
                    required:
                      - path
                      - per_page
                      - next_cursor
                      - next_cursor_url
                      - prev_cursor
                      - prev_cursor_url
                required:
                  - data
                  - links
                  - meta
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '404':
          $ref: '#/components/responses/ModelNotFoundException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /tasks:
    get:
      operationId: tasks.index
      description: '**Required scopes:** `task-management:read`'
      summary: List all tasks
      tags:
        - Tasks
      parameters:
        - name: sort
          in: query
          description: >-
            Available sorts are `title`, `uri`, `status`, `updated_at`,
            `created_at`, `due_date`.<br/>You can sort by multiple options by
            separating them with a comma. To sort in descending order, use `-`
            sign in front of the sort, for example: `-title`.
          schema:
            type: string
          example: sort=-created_at,title
        - name: include
          in: query
          description: >-
            Available includes are `project`, `watchers`, `client`,
            `parent_task`, `sub_tasks`. You can include multiple options by
            separating them with a comma.
          schema:
            type: string
        - name: page[size]
          in: query
          description: The number of results that will be returned per page.
          schema:
            type: integer
            default: 30
        - name: page[cursor]
          in: query
          description: The cursor to start the pagination from.
          schema:
            type: string
        - name: filter
          in: query
          description: >-
            Allowed filter fields (with allowed operators):


            | Field | Type | Operators |

            |------|------|-----------|

            | `title` | `string` | in, nin, notin, eq, ne, neq, contains, like,
            startswith, endswith, isnull, isnotnull, notnull |

            | `uri` | `string` | in, nin, notin, eq, ne, neq, contains, like,
            startswith, endswith, isnull, isnotnull, notnull |

            | `sub_tasks_in_list` | `enum:with, only, without` | eq |

            | `due_date` | `date` | eq, ne, neq, lt, lte, le, gt, gte, ge, in,
            nin, notin, isnull, isnotnull, notnull |

            | `status` | `enum<TaskStatus>` | eq, ne, neq, in, nin, notin |

            | `project.id` | `id<ProjectData>` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |

            | `project.external_id` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `project.shortcode` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `project.name` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `project.status` | `enum:running, closed` | eq, ne, neq, in, nin,
            notin, isnull, isnotnull, notnull |

            | `client.id` | `id<ClientFullData>` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |

            | `client.external_id` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `client.name` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `client.shortcode` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `assignee.id` | `id<UserFullData>` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |

            | `assignee.email` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `assignee.type` | `enum<UserType>` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |

            | `epic.id` | `id<EpicData>` | eq, ne, neq, in, nin, notin, isnull,
            isnotnull, notnull |

            | `epic.title` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `phase.id` | `id<PhaseData>` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |

            | `phase.title` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `phase.po_number` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `phase.start_date` | `date` | eq, ne, neq, lt, lte, le, gt, gte,
            ge, in, nin, notin, isnull, isnotnull, notnull |

            | `phase.end_date` | `date` | eq, ne, neq, lt, lte, le, gt, gte, ge,
            in, nin, notin, isnull, isnotnull, notnull |

            | `milestone.id` | `id<MilestoneData>` | eq, ne, neq, in, nin,
            notin, isnull, isnotnull, notnull |

            | `milestone.title` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `milestone.po_number` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `milestone.date` | `date` | eq, ne, neq, lt, lte, le, gt, gte, ge,
            in, nin, notin, isnull, isnotnull, notnull |

            | `parent_task.id` | `id<TaskData>` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |

            | `parent_task.title` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `parent_task.uri` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `parent_task.status` | `enum<TaskStatus>` | eq, ne, neq, in, nin,
            notin |

            | `sub_tasks` | `Relation`<br /> - title (string)<br /> - uri
            (string)<br /> - status (enum) | any, none, count, all |


            Filtering expression. Accepts either JSON (array/tree of conditions)
            or a readable string DSL.


            You can check the full syntax at Docs `Filtering` section.


            Special values:

            - me.id — current authenticated user id (usable on fields of type
            id). Example: `id eq me.id`

            - now — current date-time. Example: `dueOn lt now`

            - sow/eow — start/end of week. Examples: `dueOn gt sow`, `dueOn lt
            eow`

            - som/eom — start/end of month. Examples: `dueOn gt som`, `dueOn lt
            eom`

            - today — special date for today; with eq it expands to the whole
            day range. Example: `dueOn eq today`

            - today±Nd — relative day offset. Examples: `today-30d`, `today+5d`.
          schema:
            type: string
          example: >-
            title contains "Acme" and (created_at >= "2024-01-01" or client.name
            contains "Corp")
      responses:
        '200':
          description: The cursor paginated collection of `TaskData`
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    description: The list of items
                    items:
                      $ref: '#/components/schemas/TaskData'
                  links:
                    type: array
                    items:
                      type: string
                  meta:
                    type: object
                    properties:
                      path:
                        type:
                          - string
                          - 'null'
                        description: Base path for paginator generated URLs.
                      per_page:
                        type: integer
                        description: Number of items shown per page.
                      next_cursor:
                        type:
                          - string
                          - 'null'
                      next_cursor_url:
                        type:
                          - string
                          - 'null'
                      prev_cursor:
                        type:
                          - string
                          - 'null'
                      prev_cursor_url:
                        type:
                          - string
                          - 'null'
                    required:
                      - path
                      - per_page
                      - next_cursor
                      - next_cursor_url
                      - prev_cursor
                      - prev_cursor_url
                required:
                  - data
                  - links
                  - meta
        '401':
          $ref: '#/components/responses/AuthenticationException'
    post:
      operationId: tasks.store
      description: '**Required scopes:** `task-management:write`'
      summary: Create a task
      tags:
        - Tasks
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                external_id:
                  type:
                    - string
                    - 'null'
                  description: >-
                    Can be used to add an identifier from an external system,
                    must be unique within integration (integration's slug)
                  maxLength: 255
                external_origin:
                  type: string
                  description: If not set, integration's slug will be used as default
                  maxLength: 255
                title:
                  type: string
                  maxLength: 255
                description:
                  type: string
                  description: In HTML
                  maxLength: 65535
                estimated_hours:
                  type:
                    - number
                    - 'null'
                due_date:
                  type:
                    - string
                    - 'null'
                  format: date-time
                is_public:
                  type: boolean
                watchers:
                  type: array
                  items:
                    type: string
                status:
                  $ref: '#/components/schemas/TaskStatus'
                project_id:
                  type: string
                insert_before:
                  type:
                    - string
                    - 'null'
                insert_after:
                  type:
                    - string
                    - 'null'
                parent_task_id:
                  type:
                    - string
                    - 'null'
                assignee_id:
                  type:
                    - string
                    - 'null'
                epic_id:
                  type:
                    - string
                    - 'null'
                phase_id:
                  type:
                    - string
                    - 'null'
                milestone_id:
                  type:
                    - string
                    - 'null'
              required:
                - title
                - project_id
      responses:
        '200':
          description: '`TaskData`'
          content:
            application/json:
              schema:
                anyOf:
                  - $ref: '#/components/schemas/TaskData'
                  - type: 'null'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /tasks/{id}:
    get:
      operationId: tasks.show
      description: '**Required scopes:** `task-management:read`'
      summary: Retrieve a task
      tags:
        - Tasks
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - uri
              - external_id
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id` by default it will use the integration
            slug
          schema:
            type: string
      responses:
        '200':
          description: '`TaskData`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TaskData'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '422':
          $ref: '#/components/responses/ValidationException'
    delete:
      operationId: tasks.delete
      description: '**Required scopes:** `task-management:write`'
      summary: Archive a task
      tags:
        - Tasks
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - uri
              - external_id
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id`  by default it will use the
            integration slug
          schema:
            type: string
      responses:
        '200':
          description: '`TaskData`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TaskData'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /tasks/{task}:
    patch:
      operationId: tasks.update
      description: '**Required scopes:** `task-management:write`'
      summary: Update a task
      tags:
        - Tasks
      parameters:
        - name: task
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - uri
              - external_id
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id`  by default it will use the
            integration slug
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                title:
                  type: string
                  maxLength: 255
                description:
                  type: string
                  description: |-
                    In HTML
                    use `<mention data-id="<UserID>" />` to mention user
                  maxLength: 65535
                estimated_hours:
                  type:
                    - number
                    - 'null'
                due_date:
                  type:
                    - string
                    - 'null'
                  format: date-time
                is_public:
                  type:
                    - boolean
                    - 'null'
                watchers:
                  type: array
                  description: If present - overwrites the watch list
                  items:
                    type: string
                add_watchers:
                  type: array
                  description: Adds user to watchlist
                  items:
                    type: string
                status:
                  $ref: '#/components/schemas/TaskStatus'
                parent_task_id:
                  type:
                    - string
                    - 'null'
                assignee_id:
                  type:
                    - string
                    - 'null'
                epic_id:
                  type:
                    - string
                    - 'null'
                phase_id:
                  type:
                    - string
                    - 'null'
                milestone_id:
                  type:
                    - string
                    - 'null'
      responses:
        '200':
          description: '`TaskData`'
          content:
            application/json:
              schema:
                anyOf:
                  - $ref: '#/components/schemas/TaskData'
                  - type: 'null'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /tasks/{id}/external-identifier:
    put:
      operationId: tasks.updateExternalId
      description: '**Required scopes:** `client:write`'
      summary: Update a tasks's external identifier
      tags:
        - Tasks
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
              - shortcode
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id` by default it will use the integration
            slug
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                external_id:
                  type:
                    - string
                    - 'null'
                  description: >-
                    Can be used to add an identifier to the client from an
                    external system, must be unique within integration
                    (integration slug)
                  maxLength: 255
                external_origin:
                  type: string
                  description: If not set, integration's slug will be used as default
                  maxLength: 255
      responses:
        '200':
          description: '`TaskData`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TaskData'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /tasks/{id}/upload:
    post:
      operationId: tasks.upload
      description: '**Required scopes:** `task-management:write`'
      summary: Upload file to a task
      tags:
        - Tasks
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - uri
              - external_id
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id`  by default it will use the
            integration slug
          schema:
            type: string
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                file:
                  type: string
                  format: binary
                  description: 'File to upload - Max: 15MB'
              required:
                - file
      responses:
        '200':
          description: '`FileData`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FileData'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /tasks/comments:
    post:
      operationId: taskComments.store
      description: '**Required scopes:** `task-management:write`'
      summary: Create a new comment for a task
      tags:
        - Task Comments
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                external_id:
                  type:
                    - string
                    - 'null'
                  description: >-
                    Can be used to add an identifier from an external system,
                    must be unique within integration (integration's slug)
                  maxLength: 255
                external_origin:
                  type: string
                  description: If not set, integration's slug will be used as default
                  maxLength: 255
                task_id:
                  type: string
                parent_comment_id:
                  type:
                    - string
                    - 'null'
                comment:
                  type: string
                  description: |-
                    In HTML
                    use `<mention data-id="<UserID>" />` to mention user
                  maxLength: 65535
                is_public:
                  type: boolean
              required:
                - task_id
      responses:
        '200':
          description: '`CommentData`'
          content:
            application/json:
              schema:
                anyOf:
                  - $ref: '#/components/schemas/CommentData'
                  - type: 'null'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /tasks/comments/{id}:
    patch:
      operationId: taskComments.update
      description: |-
        **Required scopes:** `task-management:write`

        Comments can only be updated by the author of the comment
      summary: Update a tasks comment's content
      tags:
        - Task Comments
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - uri
              - external_id
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id`  by default it will use the
            integration slug
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                comment:
                  type: string
                  description: |-
                    In HTML
                    use `<mention data-id="<UserID>" />` to mention user
                  maxLength: 65535
                is_public:
                  type: boolean
      responses:
        '200':
          description: '`CommentData`'
          content:
            application/json:
              schema:
                anyOf:
                  - $ref: '#/components/schemas/CommentData'
                  - type: 'null'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '403':
          description: An error
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: Error overview.
                    example: You are not allowed to edit this comment
                required:
                  - message
        '422':
          $ref: '#/components/responses/ValidationException'
    get:
      operationId: taskComments.show
      description: '**Required scopes:** `task-management:read`'
      summary: Retrieve a tasks comment
      tags:
        - Task Comments
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - uri
              - external_id
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id`  by default it will use the
            integration slug
          schema:
            type: string
      responses:
        '200':
          description: '`CommentData`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CommentData'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '422':
          $ref: '#/components/responses/ValidationException'
    delete:
      operationId: taskComments.destroy
      description: |-
        **Required scopes:** `task-management:write`

        Comments can only be deleted by the author of the comment
      summary: Delete a tasks comment
      tags:
        - Task Comments
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - uri
              - external_id
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id`  by default it will use the
            integration slug
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                type: string
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '403':
          description: An error
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: Error overview.
                    example: You are not allowed to delete this comment
                required:
                  - message
        '422':
          $ref: '#/components/responses/ValidationException'
  /tasks/comments/{id}/upload:
    post:
      operationId: taskComments.upload
      description: |-
        **Required scopes:** `task-management:write`

        Files can only be uploaded by the author of the comment
      summary: Upload file to a task comment
      tags:
        - Task Comments
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - uri
              - external_id
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id`  by default it will use the
            integration slug
          schema:
            type: string
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                file:
                  type: string
                  format: binary
                  description: 'File to upload - Max: 15MB'
              required:
                - file
      responses:
        '200':
          description: '`FileData`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FileData'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '403':
          description: An error
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: Error overview.
                    example: You are not allowed to upload files to this comment
                required:
                  - message
        '422':
          $ref: '#/components/responses/ValidationException'
  /tasks/{id}/comments:
    get:
      operationId: taskComments.comments
      description: '**Required scopes:** `task-management:read`'
      summary: List all comments for a task
      tags:
        - Task Comments
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - uri
              - external_id
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id`  by default it will use the
            integration slug
          schema:
            type: string
        - name: sort
          in: query
          description: >-
            Available sorts are `created_at`, `updated_at`.<br/>You can sort by
            multiple options by separating them with a comma. To sort in
            descending order, use `-` sign in front of the sort, for example:
            `-title`.
          schema:
            type: string
          example: sort=-created_at,title
        - name: include
          in: query
          description: >-
            Available includes are `parent_comment`, `sub_comments`. You can
            include multiple options by separating them with a comma.
          schema:
            type: string
        - name: page[size]
          in: query
          description: The number of results that will be returned per page.
          schema:
            type: integer
            default: 30
        - name: page[cursor]
          in: query
          description: The cursor to start the pagination from.
          schema:
            type: string
        - name: filter
          in: query
          description: >-
            Allowed filter fields (with allowed operators):


            | Field | Type | Operators |

            |------|------|-----------|

            | `sub_comments_in_list` | `enum:with, only, without` | eq |

            | `is_public` | `boolean` | eq, ne, neq, isnull, isnotnull, notnull
            |

            | `author.id` | `id<UserData>` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |

            | `author.email` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `author.type` | `enum<UserType>` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |

            | `parent_comment.id` | `id<CommentData>` | eq, ne, neq, in, nin,
            notin, isnull, isnotnull, notnull |

            | `sub_comments` | `Relation`<br /> - title (string)<br /> - uri
            (string)<br /> - status (enum) | any, none, count, all |


            Filtering expression. Accepts either JSON (array/tree of conditions)
            or a readable string DSL.


            You can check the full syntax at Docs `Filtering` section.


            Special values:

            - me.id — current authenticated user id (usable on fields of type
            id). Example: `id eq me.id`

            - now — current date-time. Example: `dueOn lt now`

            - sow/eow — start/end of week. Examples: `dueOn gt sow`, `dueOn lt
            eow`

            - som/eom — start/end of month. Examples: `dueOn gt som`, `dueOn lt
            eom`

            - today — special date for today; with eq it expands to the whole
            day range. Example: `dueOn eq today`

            - today±Nd — relative day offset. Examples: `today-30d`, `today+5d`.
          schema:
            type: string
          example: >-
            title contains "Acme" and (created_at >= "2024-01-01" or client.name
            contains "Corp")
      responses:
        '200':
          description: >-
            The cursor paginated collection of
            `DWI.Http.Data.Api.V1.CommentData`
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    description: The list of items
                    items:
                      $ref: '#/components/schemas/CommentData'
                  links:
                    type: array
                    items:
                      type: string
                  meta:
                    type: object
                    properties:
                      path:
                        type:
                          - string
                          - 'null'
                        description: Base path for paginator generated URLs.
                      per_page:
                        type: integer
                        description: Number of items shown per page.
                      next_cursor:
                        type:
                          - string
                          - 'null'
                      next_cursor_url:
                        type:
                          - string
                          - 'null'
                      prev_cursor:
                        type:
                          - string
                          - 'null'
                      prev_cursor_url:
                        type:
                          - string
                          - 'null'
                    required:
                      - path
                      - per_page
                      - next_cursor
                      - next_cursor_url
                      - prev_cursor
                      - prev_cursor_url
                required:
                  - data
                  - links
                  - meta
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /efforts:
    get:
      operationId: efforts.index
      description: >-
        **Required scopes:** `efforts:read`


        If additional scope `efforts:extended:read` is granted efforts with type
        `admin` will be included.
      summary: List all efforts
      tags:
        - Efforts
      parameters:
        - name: sort
          in: query
          description: >-
            Available sorts are `date`.<br/>You can sort by multiple options by
            separating them with a comma. To sort in descending order, use `-`
            sign in front of the sort, for example: `-title`.
          schema:
            type: string
          example: sort=-created_at,title
        - name: page[size]
          in: query
          description: The number of results that will be returned per page.
          schema:
            type: integer
            default: 30
        - name: page[cursor]
          in: query
          description: The cursor to start the pagination from.
          schema:
            type: string
        - name: filter
          in: query
          description: >-
            Allowed filter fields (with allowed operators):


            | Field | Type | Operators |

            |------|------|-----------|

            | `date` | `date` | eq, ne, neq, lt, lte, le, gt, gte, ge, in, nin,
            notin, isnull, isnotnull, notnull |

            | `type` | `enum:admin, project` | eq, ne, neq, in, nin, notin |

            | `project.id` | `id<ProjectData>` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |

            | `project.external_id` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `project.shortcode` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `project.name` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `client.id` | `id<ClientData>` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |

            | `client.external_id` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `client.name` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `client.shortcode` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `user.id` | `id<UserData>` | eq, ne, neq, in, nin, notin, isnull,
            isnotnull, notnull |

            | `user.email` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `epic.id` | `id<EpicData>` | eq, ne, neq, in, nin, notin, isnull,
            isnotnull, notnull |

            | `epic.title` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `phase.id` | `id<PhaseData>` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |

            | `phase.title` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `phase.po_number` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `phase.start_date` | `date` | eq, ne, neq, lt, lte, le, gt, gte,
            ge, in, nin, notin, isnull, isnotnull, notnull |

            | `phase.end_date` | `date` | eq, ne, neq, lt, lte, le, gt, gte, ge,
            in, nin, notin, isnull, isnotnull, notnull |

            | `milestone.id` | `id<MilestoneData>` | eq, ne, neq, in, nin,
            notin, isnull, isnotnull, notnull |

            | `milestone.title` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `milestone.po_number` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `milestone.date` | `date` | eq, ne, neq, lt, lte, le, gt, gte, ge,
            in, nin, notin, isnull, isnotnull, notnull |

            | `task.id` | `id<TaskData>` | eq, ne, neq, in, nin, notin, isnull,
            isnotnull, notnull |

            | `task.title` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `task.uri` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `task.status` | `enum<TaskStatus>` | eq, ne, neq, in, nin, notin |


            Filtering expression. Accepts either JSON (array/tree of conditions)
            or a readable string DSL.


            You can check the full syntax at Docs `Filtering` section.


            Special values:

            - me.id — current authenticated user id (usable on fields of type
            id). Example: `id eq me.id`

            - now — current date-time. Example: `dueOn lt now`

            - sow/eow — start/end of week. Examples: `dueOn gt sow`, `dueOn lt
            eow`

            - som/eom — start/end of month. Examples: `dueOn gt som`, `dueOn lt
            eom`

            - today — special date for today; with eq it expands to the whole
            day range. Example: `dueOn eq today`

            - today±Nd — relative day offset. Examples: `today-30d`, `today+5d`.
          schema:
            type: string
          example: >-
            title contains "Acme" and (created_at >= "2024-01-01" or client.name
            contains "Corp")
      responses:
        '200':
          description: >-
            Computed fields are auto-attached by FilterService's apply() wrapper
            during pagination/fetch.




            The cursor paginated collection of `EffortData`
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    description: The list of items
                    items:
                      $ref: '#/components/schemas/EffortData'
                  links:
                    type: array
                    items:
                      type: string
                  meta:
                    type: object
                    properties:
                      path:
                        type:
                          - string
                          - 'null'
                        description: Base path for paginator generated URLs.
                      per_page:
                        type: integer
                        description: Number of items shown per page.
                      next_cursor:
                        type:
                          - string
                          - 'null'
                      next_cursor_url:
                        type:
                          - string
                          - 'null'
                      prev_cursor:
                        type:
                          - string
                          - 'null'
                      prev_cursor_url:
                        type:
                          - string
                          - 'null'
                    required:
                      - path
                      - per_page
                      - next_cursor
                      - next_cursor_url
                      - prev_cursor
                      - prev_cursor_url
                required:
                  - data
                  - links
                  - meta
        '401':
          $ref: '#/components/responses/AuthenticationException'
  /contacts:
    get:
      operationId: contacts.index
      description: '**Required scopes:** `contact-data:read`'
      summary: List all contacts
      tags:
        - Contacts
      parameters:
        - name: sort
          in: query
          description: >-
            Available sorts are `first_name`, `last_name`, `created_at`,
            `custom_fields.<alias>`.<br/>You can sort by multiple options by
            separating them with a comma. To sort in descending order, use `-`
            sign in front of the sort, for example: `-title`.
          schema:
            type: string
          example: sort=-created_at,title
        - name: include
          in: query
          description: >-
            Available includes are `companies`. You can include multiple options
            by separating them with a comma.
          schema:
            type: string
        - name: page[size]
          in: query
          description: The number of results that will be returned per page.
          schema:
            type: integer
            default: 30
        - name: page[cursor]
          in: query
          description: The cursor to start the pagination from.
          schema:
            type: string
        - name: filter
          in: query
          description: >-
            Allowed filter fields (with allowed operators):


            | Field | Type | Operators |

            |------|------|-----------|

            | `archived` | `enum: with, only, without` | eq |

            | `first_name` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `last_name` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `birthday` | `date` | eq, ne, neq, lt, lte, le, gt, gte, ge, in,
            nin, notin, isnull, isnotnull, notnull |

            | `email` | `string` | in, nin, notin, eq, ne, neq, contains, like,
            startswith, endswith, isnull, isnotnull, notnull |

            | `email_private` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `mobile` | `string` | in, nin, notin, eq, ne, neq, contains, like,
            startswith, endswith, isnull, isnotnull, notnull |

            | `mobile_private` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `telephone` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `telephone_private` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `fax` | `string` | in, nin, notin, eq, ne, neq, contains, like,
            startswith, endswith, isnull, isnotnull, notnull |

            | `address_street` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `address_street2` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `address_house` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `address_zip` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `address_state` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `address_town` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `address_country.name` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `owner.id` | `id` | eq, ne, neq, in, nin, notin, isnull,
            isnotnull, notnull |

            | `owner.email` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `owner.external_id` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `owner.external_origin` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `client.id` | `id` | eq, ne, neq, in, nin, notin, isnull,
            isnotnull, notnull |

            | `client.name` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `client.shortcode` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `client.external_id` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `client.external_origin` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `created_at` | `date` | eq, ne, neq, lt, lte, le, gt, gte, ge, in,
            nin, notin, isnull, isnotnull, notnull |

            | `updated_at` | `date` | eq, ne, neq, lt, lte, le, gt, gte, ge, in,
            nin, notin, isnull, isnotnull, notnull |

            | `external_origin` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `companies` | `Relation`<br /> - id (id)<br /> - external_id
            (string)<br /> - company_name (string)<br /> - external_origin
            (string)<br /> - tax_uid (string)<br /> - iban (string)<br /> - bic
            (string)<br /> - phone (string)<br /> - fax (string)<br /> - email
            (string)<br /> - email_general (string)<br /> - homepage (string) |
            any, none, count, all |

            | `custom_fields.*` — see Custom fields below | `custom` | eq, ne,
            neq, lt, lte, le, gt, gte, ge, in, nin, notin, contains, like,
            startswith, endswith, isnull, isnotnull, notnull |


            Filtering expression. Accepts either JSON (array/tree of conditions)
            or a readable string DSL.


            You can check the full syntax at Docs `Filtering` section.


            Special values:

            - me.id — current authenticated user id (usable on fields of type
            id). Example: `id eq me.id`

            - now — current date-time. Example: `dueOn lt now`

            - sow/eow — start/end of week. Examples: `dueOn gt sow`, `dueOn lt
            eow`

            - som/eom — start/end of month. Examples: `dueOn gt som`, `dueOn lt
            eom`

            - today — special date for today; with eq it expands to the whole
            day range. Example: `dueOn eq today`

            - today±Nd — relative day offset. Examples: `today-30d`, `today+5d`.


            Custom fields: when enabled, you can filter by
            `custom_fields.<slug>`. Example: `custom_fields.my_flag eq 'yes'` or
            `custom_fields.score gte 10`. Supported ops depend on the custom
            field type (eq, ne, in, nin, contains, startswith, endswith, isnull,
            isnotnull, and comparisons for numeric/date types).
          schema:
            type: string
          example: >-
            title contains "Acme" and (created_at >= "2024-01-01" or client.name
            contains "Corp")
      responses:
        '200':
          description: The cursor paginated collection of `ContactData`
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    description: The list of items
                    items:
                      $ref: '#/components/schemas/ContactData'
                  links:
                    type: array
                    items:
                      type: string
                  meta:
                    type: object
                    properties:
                      path:
                        type:
                          - string
                          - 'null'
                        description: Base path for paginator generated URLs.
                      per_page:
                        type: integer
                        description: Number of items shown per page.
                      next_cursor:
                        type:
                          - string
                          - 'null'
                      next_cursor_url:
                        type:
                          - string
                          - 'null'
                      prev_cursor:
                        type:
                          - string
                          - 'null'
                      prev_cursor_url:
                        type:
                          - string
                          - 'null'
                    required:
                      - path
                      - per_page
                      - next_cursor
                      - next_cursor_url
                      - prev_cursor
                      - prev_cursor_url
                required:
                  - data
                  - links
                  - meta
        '401':
          $ref: '#/components/responses/AuthenticationException'
    post:
      operationId: contacts.store
      description: '**Required scopes:** `contact-data:write`'
      summary: Create a contact
      tags:
        - Contacts
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                external_id:
                  type:
                    - string
                    - 'null'
                  description: >-
                    Can be used to add an identifier from an external system,
                    must be unique within integration (integration's slug)
                  maxLength: 255
                external_origin:
                  type: string
                  description: If not set, integration's slug will be used as default
                  maxLength: 255
                gender:
                  type:
                    - string
                    - 'null'
                  enum:
                    - f
                    - m
                    - x
                first_name:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                last_name:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                birthday:
                  type:
                    - string
                    - 'null'
                  format: date-time
                title:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                title_suffix:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                position:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                locale:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                fax:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                telephone:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                telephone_private:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                mobile:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                mobile_private:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                email:
                  type:
                    - string
                    - 'null'
                  format: email
                  maxLength: 255
                email_private:
                  type:
                    - string
                    - 'null'
                  format: email
                  maxLength: 255
                address_street:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_street2:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_house:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_zip:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_state:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_town:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_country:
                  type: string
                  description: >-
                    Format: `ISO 3166-1 alpha-2 / ISO 3166-1 alpha-3 /
                    ISO-3166-1 numeric / Name` <br/><br/>You can use this field
                    to associate a contact with a specific country.

                    We try to find the corresponding country based on the
                    provided value.

                    If country code/name is valid but not created yet, it will
                    be created.

                    If country is not valid, the space's default country will be
                    used.


                    Will be ignored if address_country_id is set.
                address_country_id:
                  type:
                    - string
                    - 'null'
                  format: CountryData
                  description: >-
                    You can use this field to associate a contact with a
                    specific country already present in the system.
                client_id:
                  type:
                    - string
                    - 'null'
                  format: ClientData
                owner_id:
                  type:
                    - string
                    - 'null'
                  format: UserData
                custom_fields:
                  type: array
                  format: array
                  example: '{<slug>: <value>}'
                  items:
                    type: string
      responses:
        '200':
          description: '`ContactData`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ContactData'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /contacts/{id}:
    get:
      operationId: contacts.show
      description: '**Required scopes:** `contact-data:read`'
      summary: Retrieve a contact
      tags:
        - Contacts
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id` by default it will use the integration
            slug
          schema:
            type: string
        - name: include
          in: query
          description: >-
            Available includes are `companies`. You can include multiple options
            by separating them with a comma.
          schema:
            type: string
      responses:
        '200':
          description: '`ContactData`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ContactData'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '422':
          $ref: '#/components/responses/ValidationException'
    patch:
      operationId: contacts.update
      description: >-
        **Required scopes:** `contact-data:write`


        To update `external_id` jump to
        [Endpoint](#operation/ontacts.updateExternalId)
        `/contacts/{id}/external-identifier`
      summary: Update a contact
      tags:
        - Contacts
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id` by default it will use the integration
            slug
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                gender:
                  type:
                    - string
                    - 'null'
                  enum:
                    - f
                    - m
                    - x
                first_name:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                last_name:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                birthday:
                  type:
                    - string
                    - 'null'
                  format: date-time
                title:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                title_suffix:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                position:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                locale:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                fax:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                telephone:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                telephone_private:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                mobile:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                mobile_private:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                email:
                  type:
                    - string
                    - 'null'
                  format: email
                  maxLength: 255
                email_private:
                  type:
                    - string
                    - 'null'
                  format: email
                  maxLength: 255
                address_street:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_street2:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_house:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_zip:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_state:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_town:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_country:
                  type: string
                  description: >-
                    Format: `ISO 3166-1 alpha-2 / ISO 3166-1 alpha-3 /
                    ISO-3166-1 numeric / Name` <br/><br/>You can use this field
                    to associate a contact with a specific country.

                    We try to find the corresponding country based on the
                    provided value.

                    If country code/name is valid but not created yet, it will
                    be created.

                    If country is not valid, the space's default country will be
                    used.


                    Will be ignored if address_country_id is set.
                address_country_id:
                  type:
                    - string
                    - 'null'
                  format: CountryData
                  description: >-
                    You can use this field to associate a contact with a
                    specific country already present in the system.
                client_id:
                  type:
                    - string
                    - 'null'
                  format: ClientData
                owner_id:
                  type:
                    - string
                    - 'null'
                  format: UserData
      responses:
        '200':
          description: '`ContactData`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ContactData'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '422':
          $ref: '#/components/responses/ValidationException'
    delete:
      operationId: contacts.destroy
      description: '**Required scopes:** `contact-data:write`'
      summary: Archive a contact
      tags:
        - Contacts
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id` by default it will use the integration
            slug
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    enum:
                      - Contact deleted successfully
                required:
                  - message
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /contacts/{id}/external-identifier:
    put:
      operationId: contacts.updateExternalId
      description: |-
        **Required scopes:** `contact-data:write`

        Can be used to force overwrite `external_id`
      summary: Update a contacts external identifier
      tags:
        - Contacts
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id` by default it will use the integration
            slug
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                external_id:
                  type:
                    - string
                    - 'null'
                  description: >-
                    Can be used to add an identifier to the client from an
                    external system, must be unique within integration
                    (integration slug)
                  maxLength: 255
                external_origin:
                  type: string
                  description: If not set, integration's slug will be used as default
                  maxLength: 255
      responses:
        '200':
          description: '`ContactData`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ContactData'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /contacts/{id}/company/attach:
    put:
      operationId: contacts.associateCompany
      description: '**Required scopes:** `contact-data:write`'
      summary: Attach a contact to a company
      tags:
        - Contacts
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id` by default it will use the integration
            slug
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                company_id:
                  type: string
                  format: CompanyData
                position:
                  type: string
                  description: Position the contact holds in the company
              required:
                - company_id
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    enum:
                      - Contact successfully associated with company
                required:
                  - message
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /contacts/{id}/company/detach:
    put:
      operationId: contacts.unassociateCompany
      description: '**Required scopes:** `contact-data:write`'
      summary: Detach a contact from a company
      tags:
        - Contacts
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id` by default it will use the integration
            slug
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                company_id:
                  type: string
                  format: CompanyData
              required:
                - company_id
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    enum:
                      - Contact successfully detached from company
                required:
                  - message
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /contacts/{id}/restore:
    post:
      operationId: contacts.restore
      description: '**Required scopes:** `contact-data:write`'
      summary: Restore a contact
      tags:
        - Contacts
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id` by default it will use the integration
            slug
          schema:
            type: string
      responses:
        '200':
          description: '`ContactData`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ContactData'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '409':
          description: |-
            An error

            An error
          content:
            application/json:
              schema:
                anyOf:
                  - type: object
                    properties:
                      message:
                        type: string
                        description: Error overview.
                        example: Contact not archived
                    required:
                      - message
                  - type: object
                    properties:
                      message:
                        type: string
                        description: Error overview.
                    required:
                      - message
        '422':
          $ref: '#/components/responses/ValidationException'
  /companies:
    get:
      operationId: companies.index
      description: '**Required scopes:** `contact-data:read`'
      summary: List all companies
      tags:
        - Companies
      parameters:
        - name: sort
          in: query
          description: >-
            Available sorts are `company_name`, `updated_at`, `created_at`,
            `custom_fields.<alias>`.<br/>You can sort by multiple options by
            separating them with a comma. To sort in descending order, use `-`
            sign in front of the sort, for example: `-title`.
          schema:
            type: string
          example: sort=-created_at,title
        - name: include
          in: query
          description: >-
            Available includes are `contacts`. You can include multiple options
            by separating them with a comma.
          schema:
            type: string
        - name: page[size]
          in: query
          description: The number of results that will be returned per page.
          schema:
            type: integer
            default: 30
        - name: page[cursor]
          in: query
          description: The cursor to start the pagination from.
          schema:
            type: string
        - name: filter
          in: query
          description: >-
            Allowed filter fields (with allowed operators):


            | Field | Type | Operators |

            |------|------|-----------|

            | `archived` | `enum: with, only, without` | eq |

            | `company_name` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `tax_uid` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `iban` | `string` | in, nin, notin, eq, ne, neq, contains, like,
            startswith, endswith, isnull, isnotnull, notnull |

            | `bic` | `string` | in, nin, notin, eq, ne, neq, contains, like,
            startswith, endswith, isnull, isnotnull, notnull |

            | `phone` | `string` | in, nin, notin, eq, ne, neq, contains, like,
            startswith, endswith, isnull, isnotnull, notnull |

            | `fax` | `string` | in, nin, notin, eq, ne, neq, contains, like,
            startswith, endswith, isnull, isnotnull, notnull |

            | `email` | `string` | in, nin, notin, eq, ne, neq, contains, like,
            startswith, endswith, isnull, isnotnull, notnull |

            | `email_general` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `homepage` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `invoices_by_post` | `boolean` | eq, ne, neq, isnull, isnotnull,
            notnull |

            | `invoices_by_email` | `boolean` | eq, ne, neq, isnull, isnotnull,
            notnull |

            | `business_field.id` | `id` | eq, ne, neq, in, nin, notin, isnull,
            isnotnull, notnull |

            | `business_field.name` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `person_attention_to` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `address_invoice_title` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `address_invoice_street` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `address_invoice_street2` | `string` | in, nin, notin, eq, ne,
            neq, contains, like, startswith, endswith, isnull, isnotnull,
            notnull |

            | `address_invoice_house` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `address_invoice_zip` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `address_invoice_state` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `address_invoice_town` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `address_invoice_country.name` | `string` | in, nin, notin, eq,
            ne, neq, contains, like, startswith, endswith, isnull, isnotnull,
            notnull |

            | `address_invoice_is_delivery` | `bool` | eq, ne, neq, isnull,
            isnotnull, notnull |

            | `delivery_person_attention_to` | `string` | in, nin, notin, eq,
            ne, neq, contains, like, startswith, endswith, isnull, isnotnull,
            notnull |

            | `address_delivery_title` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `address_delivery_street` | `string` | in, nin, notin, eq, ne,
            neq, contains, like, startswith, endswith, isnull, isnotnull,
            notnull |

            | `address_delivery_street2` | `string` | in, nin, notin, eq, ne,
            neq, contains, like, startswith, endswith, isnull, isnotnull,
            notnull |

            | `address_delivery_house` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `address_delivery_zip` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `address_delivery_state` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `address_delivery_town` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `address_delivery_country.name` | `string` | in, nin, notin, eq,
            ne, neq, contains, like, startswith, endswith, isnull, isnotnull,
            notnull |

            | `client.id` | `id` | eq, ne, neq, in, nin, notin, isnull,
            isnotnull, notnull |

            | `client.name` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `client.shortcode` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `client.external_id` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `client.external_origin` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `created_at` | `date` | eq, ne, neq, lt, lte, le, gt, gte, ge, in,
            nin, notin, isnull, isnotnull, notnull |

            | `updated_at` | `date` | eq, ne, neq, lt, lte, le, gt, gte, ge, in,
            nin, notin, isnull, isnotnull, notnull |

            | `contacts` | `Relation`<br /> - id (id)<br /> - external_id
            (string)<br /> - external_origin (string)<br /> - first_name
            (string)<br /> - last_name (string)<br /> - birthday (date)<br /> -
            email (string)<br /> - email_private (string)<br /> - mobile
            (string)<br /> - mobile_private (string)<br /> - telephone
            (string)<br /> - telephone_private (string) | any, none, count, all
            |

            | `tags` | `Relation`<br /> - id (id)<br /> - title (string) | any,
            none, count, all |

            | `custom_fields.*` — see Custom fields below | `custom` | eq, ne,
            neq, lt, lte, le, gt, gte, ge, in, nin, notin, contains, like,
            startswith, endswith, isnull, isnotnull, notnull |


            Filtering expression. Accepts either JSON (array/tree of conditions)
            or a readable string DSL.


            You can check the full syntax at Docs `Filtering` section.


            Special values:

            - me.id — current authenticated user id (usable on fields of type
            id). Example: `id eq me.id`

            - now — current date-time. Example: `dueOn lt now`

            - sow/eow — start/end of week. Examples: `dueOn gt sow`, `dueOn lt
            eow`

            - som/eom — start/end of month. Examples: `dueOn gt som`, `dueOn lt
            eom`

            - today — special date for today; with eq it expands to the whole
            day range. Example: `dueOn eq today`

            - today±Nd — relative day offset. Examples: `today-30d`, `today+5d`.


            Custom fields: when enabled, you can filter by
            `custom_fields.<slug>`. Example: `custom_fields.my_flag eq 'yes'` or
            `custom_fields.score gte 10`. Supported ops depend on the custom
            field type (eq, ne, in, nin, contains, startswith, endswith, isnull,
            isnotnull, and comparisons for numeric/date types).
          schema:
            type: string
          example: >-
            title contains "Acme" and (created_at >= "2024-01-01" or client.name
            contains "Corp")
      responses:
        '200':
          description: The cursor paginated collection of `CompanyData`
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    description: The list of items
                    items:
                      $ref: '#/components/schemas/CompanyData'
                  links:
                    type: array
                    items:
                      type: string
                  meta:
                    type: object
                    properties:
                      path:
                        type:
                          - string
                          - 'null'
                        description: Base path for paginator generated URLs.
                      per_page:
                        type: integer
                        description: Number of items shown per page.
                      next_cursor:
                        type:
                          - string
                          - 'null'
                      next_cursor_url:
                        type:
                          - string
                          - 'null'
                      prev_cursor:
                        type:
                          - string
                          - 'null'
                      prev_cursor_url:
                        type:
                          - string
                          - 'null'
                    required:
                      - path
                      - per_page
                      - next_cursor
                      - next_cursor_url
                      - prev_cursor
                      - prev_cursor_url
                required:
                  - data
                  - links
                  - meta
        '401':
          $ref: '#/components/responses/AuthenticationException'
    post:
      operationId: companies.store
      description: '**Required scopes:** `contact-data:write`'
      summary: Create a company
      tags:
        - Companies
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                external_id:
                  type:
                    - string
                    - 'null'
                  description: >-
                    Can be used to add an identifier from an external system,
                    must be unique within integration (integration's slug)
                  maxLength: 255
                external_origin:
                  type: string
                  description: If not set, integration's slug will be used as default
                  maxLength: 255
                vendor_identifier:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                company_name:
                  type: string
                  maxLength: 255
                locale:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                tax_uid:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                taxation:
                  type: boolean
                iban:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                bic:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                fax:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                phone:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                homepage:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                email:
                  type:
                    - string
                    - 'null'
                  description: Can be comma separated list of emails
                  maxLength: 255
                email_general:
                  type:
                    - string
                    - 'null'
                  format: email
                  maxLength: 255
                invoice_by_post:
                  type: boolean
                invoices_by_email:
                  type: boolean
                person_attention_to:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_invoice_title:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_invoice_street:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_invoice_street2:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_invoice_house:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_invoice_zip:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_invoice_state:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_invoice_town:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_invoice_is_delivery:
                  type: boolean
                address_invoice_country:
                  type: string
                  description: >-
                    Format: `ISO 3166-1 alpha-2 / ISO 3166-1 alpha-3 /
                    ISO-3166-1 numeric / Name` <br/><br/>You can use this field
                    to associate a contact with a specific country.

                    We try to find the corresponding country based on the
                    provided value.

                    If country code/name is valid but not created yet, it will
                    be created.

                    If country is not valid, the space's default country will be
                    used.


                    Will be ignored if `address_invoice_country_id` is set.
                address_invoice_country_id:
                  type:
                    - string
                    - 'null'
                  format: CountryData
                  description: >-
                    You can use this field to associate a contact with a
                    specific country already present in the system.
                delivery_person_attention_to:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_delivery_title:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_delivery_street:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_delivery_street2:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_delivery_house:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_delivery_zip:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_delivery_state:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_delivery_town:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_delivery_country:
                  type: string
                  description: >-
                    Format: `ISO 3166-1 alpha-2 / ISO 3166-1 alpha-3 /
                    ISO-3166-1 numeric / Name` <br/><br/>You can use this field
                    to associate a contact with a specific country.

                    We try to find the corresponding country based on the
                    provided value.

                    If country code/name is valid but not created yet, it will
                    be created.

                    If country is not valid, the space's default country will be
                    used.


                    Will be ignored if `address_delivery_country_id` is set.
                address_delivery_country_id:
                  type:
                    - string
                    - 'null'
                  format: CountryData
                  description: >-
                    You can use this field to associate a contact with a
                    specific country already present in the system.
                client_id:
                  type:
                    - string
                    - 'null'
                  format: ClientData
                business_field:
                  type:
                    - string
                    - 'null'
                  description: If field not exists, a new one will be created
                company_size:
                  type:
                    - string
                    - 'null'
                company_revenue:
                  type:
                    - string
                    - 'null'
                tags:
                  type: array
                  format: string[]
                  items:
                    type: string
                custom_fields:
                  type: array
                  format: array
                  example: '{<slug>: <value>}'
                  items:
                    type: string
              required:
                - company_name
      responses:
        '200':
          description: '`CompanyData`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CompanyData'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /companies/{id}:
    get:
      operationId: companies.show
      description: '**Required scopes:** `contact-data:read`'
      summary: Retrieve a company
      tags:
        - Companies
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id` by default it will use the integration
            slug
          schema:
            type: string
        - name: include
          in: query
          description: >-
            Available includes are `contacts`. You can include multiple options
            by separating them with a comma.
          schema:
            type: string
      responses:
        '200':
          description: '`CompanyData`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CompanyData'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '422':
          $ref: '#/components/responses/ValidationException'
    patch:
      operationId: companies.update
      description: >-
        **Required scopes:** `contact-data:write`


        To update `external_id` jump to
        [Endpoint](#operation/companies.updateExternalId)
        `/companies/{id}/external-identifier`
      summary: Update a company
      tags:
        - Companies
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id` by default it will use the integration
            slug
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                vendor_identifier:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                company_name:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                locale:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                tax_uid:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                taxation:
                  type: boolean
                iban:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                bic:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                fax:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                phone:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                homepage:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                email:
                  type:
                    - string
                    - 'null'
                  description: Can be comma separated list of emails
                  maxLength: 255
                email_general:
                  type:
                    - string
                    - 'null'
                  format: email
                  maxLength: 255
                invoice_by_post:
                  type: boolean
                invoices_by_email:
                  type: boolean
                person_attention_to:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_invoice_title:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_invoice_street:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_invoice_street2:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_invoice_house:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_invoice_zip:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_invoice_state:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_invoice_town:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_invoice_is_delivery:
                  type: boolean
                address_invoice_country:
                  type: string
                  description: >-
                    Format: `ISO 3166-1 alpha-2 / ISO 3166-1 alpha-3 /
                    ISO-3166-1 numeric / Name` <br/><br/>You can use this field
                    to associate a contact with a specific country.

                    We try to find the corresponding country based on the
                    provided value.

                    If country code/name is valid but not created yet, it will
                    be created.

                    If country is not valid, the space's default country will be
                    used.


                    Will be ignored if `address_invoice_country_id` is set.
                address_invoice_country_id:
                  type:
                    - string
                    - 'null'
                  format: CountryData
                  description: >-
                    You can use this field to associate a contact with a
                    specific country already present in the system.
                delivery_person_attention_to:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_delivery_title:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_delivery_street:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_delivery_street2:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_delivery_house:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_delivery_zip:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_delivery_state:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_delivery_town:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                address_delivery_country:
                  type: string
                  description: >-
                    Format: `ISO 3166-1 alpha-2 / ISO 3166-1 alpha-3 /
                    ISO-3166-1 numeric / Name` <br/><br/>You can use this field
                    to associate a contact with a specific country.

                    We try to find the corresponding country based on the
                    provided value.

                    If country code/name is valid but not created yet, it will
                    be created.

                    If country is not valid, the space's default country will be
                    used.


                    Will be ignored if `address_delivery_country_id` is set.
                address_delivery_country_id:
                  type:
                    - string
                    - 'null'
                  format: CountryData
                  description: >-
                    You can use this field to associate a contact with a
                    specific country already present in the system.
                client_id:
                  type:
                    - string
                    - 'null'
                  format: ClientData
                business_field:
                  type:
                    - string
                    - 'null'
                  description: If field not exists, a new one will be created
                company_size:
                  type:
                    - string
                    - 'null'
                company_revenue:
                  type:
                    - string
                    - 'null'
                tags:
                  type: array
                  format: string[]
                  items:
                    type: string
                custom_fields:
                  type: array
                  format: array
                  example: '{<slug>: <value>}'
                  items:
                    type: string
      responses:
        '200':
          description: '`CompanyData`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CompanyData'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '422':
          $ref: '#/components/responses/ValidationException'
    delete:
      operationId: companies.destroy
      description: '**Required scopes:** `contact-data:write`'
      summary: Archive a company
      tags:
        - Companies
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id` by default it will use the integration
            slug
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    enum:
                      - Company deleted successfully
                required:
                  - message
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /companies/{id}/external-identifier:
    put:
      operationId: companies.updateExternalId
      description: |-
        **Required scopes:** `contact-data:write`

        Can be used to force overwrite `external_id`
      summary: Update a companys external identifier
      tags:
        - Companies
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id` by default it will use the integration
            slug
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                external_id:
                  type:
                    - string
                    - 'null'
                  description: >-
                    Can be used to add an identifier from an external system,
                    must be unique within integration (integration slug)
                  maxLength: 255
                external_origin:
                  type: string
                  description: If not set, integration's slug will be used as default
                  maxLength: 255
      responses:
        '200':
          description: '`CompanyData`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CompanyData'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /companies/{id}/restore:
    post:
      operationId: companies.restore
      description: '**Required scopes:** `contact-data:write`'
      summary: Restore a company
      tags:
        - Companies
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id` by default it will use the integration
            slug
          schema:
            type: string
      responses:
        '200':
          description: '`CompanyData`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CompanyData'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '409':
          description: |-
            An error

            An error
          content:
            application/json:
              schema:
                anyOf:
                  - type: object
                    properties:
                      message:
                        type: string
                        description: Error overview.
                        example: Company not archived
                    required:
                      - message
                  - type: object
                    properties:
                      message:
                        type: string
                        description: Error overview.
                    required:
                      - message
        '422':
          $ref: '#/components/responses/ValidationException'
  /offers:
    get:
      operationId: offers.index
      description: '**Required scopes:** `offer:read`'
      summary: List all offers
      tags:
        - Offers
      parameters:
        - name: sort
          in: query
          description: >-
            Available sorts are `offer_number`, `title`, `date_of_offer`,
            `sum_net`, `sum_tax`, `sum_external_costs`, `sum_gross`,
            `created_at`, `updated_at`, `computed_fields.<alias>`.<br/>You can
            sort by multiple options by separating them with a comma. To sort in
            descending order, use `-` sign in front of the sort, for example:
            `-title`.
          schema:
            type: string
          example: sort=-created_at,title
        - name: include
          in: query
          description: >-
            Available includes are `external_costs`, `line_items`, `discounts`.
            You can include multiple options by separating them with a comma.
          schema:
            type: string
        - name: page[size]
          in: query
          description: The number of results that will be returned per page.
          schema:
            type: integer
            default: 30
        - name: page[cursor]
          in: query
          description: The cursor to start the pagination from.
          schema:
            type: string
        - name: filter
          in: query
          description: >-
            Allowed filter fields (with allowed operators):


            | Field | Type | Operators |

            |------|------|-----------|

            | `archived` | `enum: with, only, without` | eq |

            | `title` | `string` | in, nin, notin, eq, ne, neq, contains, like,
            startswith, endswith, isnull, isnotnull, notnull |

            | `offer_number` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `date_of_offer` | `date` | eq, ne, neq, lt, lte, le, gt, gte, ge,
            in, nin, notin, isnull, isnotnull, notnull |

            | `date_of_expiry` | `date` | eq, ne, neq, lt, lte, le, gt, gte, ge,
            in, nin, notin, isnull, isnotnull, notnull |

            | `sum_net` | `currency` | eq, ne, neq, lt, lte, le, gt, gte, ge,
            in, nin, notin, contains, like, startswith, endswith, isnull,
            isnotnull, notnull |

            | `sum_tax` | `currency` | eq, ne, neq, lt, lte, le, gt, gte, ge,
            in, nin, notin, contains, like, startswith, endswith, isnull,
            isnotnull, notnull |

            | `sum_gross` | `currency` | eq, ne, neq, lt, lte, le, gt, gte, ge,
            in, nin, notin, contains, like, startswith, endswith, isnull,
            isnotnull, notnull |

            | `editor.id` | `id<UserData>` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |

            | `editor.external_id` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `editor.email` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `client.id` | `id<ClientData>` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |

            | `client.name` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `client.external_id` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `client.shortcode` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `project.id` | `id<ProjectData>` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |

            | `project.title` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `project.external_id` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `project.shortcode` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `company.id` | `id<CompanyData>` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |

            | `company.company_name:string` | `string` | in, nin, notin, eq, ne,
            neq, contains, like, startswith, endswith, isnull, isnotnull,
            notnull |

            | `line_items` | `Relation`<br /> - title (string)<br /> - price
            (currency)<br /> - amount (float)<br /> - project.id (id)<br /> -
            project.title (string)<br /> - project.external_id (string)<br /> -
            project.shortcode (string)<br /> - total_net (currency)<br /> -
            total_net_base (currency)<br /> - total_gross (currency)<br /> -
            total_gross_base (currency)<br /> - purchase_total (currency)<br />
            - type (enum) | any, none, count, all |

            | `external_costs` | `Relation`<br /> - title (string)<br /> -
            amount (float)<br /> - project.id (id)<br /> - project.title
            (string)<br /> - project.external_id (string)<br /> -
            project.shortcode (string)<br /> - supplier.id (id)<br /> -
            supplier.name (string)<br /> - price (currency)<br /> - total
            (currency) | any, none, count, all |


            Filtering expression. Accepts either JSON (array/tree of conditions)
            or a readable string DSL.


            You can check the full syntax at Docs `Filtering` section.


            Special values:

            - me.id — current authenticated user id (usable on fields of type
            id). Example: `id eq me.id`

            - now — current date-time. Example: `dueOn lt now`

            - sow/eow — start/end of week. Examples: `dueOn gt sow`, `dueOn lt
            eow`

            - som/eom — start/end of month. Examples: `dueOn gt som`, `dueOn lt
            eom`

            - today — special date for today; with eq it expands to the whole
            day range. Example: `dueOn eq today`

            - today±Nd — relative day offset. Examples: `today-30d`, `today+5d`.
          schema:
            type: string
          example: >-
            title contains "Acme" and (created_at >= "2024-01-01" or client.name
            contains "Corp")
        - name: computed_fields[alias]
          in: query
          description: >
            Dynamic computed relation fields (computed_fields[alias])


            Declare ad-hoc aggregates per request using:
            `computed_fields[<alias>] = relation.aggregate(args)`


            Syntax:

            - Count: `relation.count()` or `relation.count(<where>)`

            - Sum/Avg/Min/Max: `relation.sum(<column>)` or
            `relation.sum(<column>, <where>)`


            Where is written using the same Filter DSL and is validated against
            the relation's allowed fields.


            Use the prefix `computed_fields.` when referencing these aliases in
            `filter` or `sort`, e.g., `filter=computed_fields.tasks_done gte 1`
            or `sort=-computed_fields.tasks_done`. Bare aliases are accepted for
            backward compatibility but deprecated.


            Allowed relations for computed_fields (deny-all by default):

            - line_items (→ lineItems): aggregates: count, sum, avg, min, max;
            coalesce default: 0

            - external_costs (→ internalCosts): aggregates: count, sum, avg,
            min, max; coalesce default: 0


            Example:
            `?computed_fields[tasks_done]=tasks.count(status%20eq%20%22Completed%22)&filter=computed_fields.tasks_done%20gt%200`
          schema:
            type: string
          example: >-
            computed_fields[tasks_done]=tasks.count(status%20eq%20%22Completed%22)
      responses:
        '200':
          description: The cursor paginated collection of `OfferData`
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    description: The list of items
                    items:
                      $ref: '#/components/schemas/OfferData'
                  links:
                    type: array
                    items:
                      type: string
                  meta:
                    type: object
                    properties:
                      path:
                        type:
                          - string
                          - 'null'
                        description: Base path for paginator generated URLs.
                      per_page:
                        type: integer
                        description: Number of items shown per page.
                      next_cursor:
                        type:
                          - string
                          - 'null'
                      next_cursor_url:
                        type:
                          - string
                          - 'null'
                      prev_cursor:
                        type:
                          - string
                          - 'null'
                      prev_cursor_url:
                        type:
                          - string
                          - 'null'
                    required:
                      - path
                      - per_page
                      - next_cursor
                      - next_cursor_url
                      - prev_cursor
                      - prev_cursor_url
                required:
                  - data
                  - links
                  - meta
        '401':
          $ref: '#/components/responses/AuthenticationException'
  /offers/{id}:
    get:
      operationId: offers.show
      description: '**Required scopes:** `offer:read`'
      summary: Retrieve an offer
      tags:
        - Offers
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id` by default it will use the integration
            slug
          schema:
            type: string
      responses:
        '200':
          description: '`OfferData`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OfferData'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /offers/{id}/line-items:
    get:
      operationId: offers.lineItems
      description: '**Required scopes:** `offer:read`'
      summary: List all offer lineItems
      tags:
        - Offers
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id` by default it will use the integration
            slug
          schema:
            type: string
        - name: sort
          in: query
          description: >-
            Available sorts are `title`, `price`, `total`, `purchase_price`,
            `purchase_total`, `created_at`, `updated_at`.<br/>You can sort by
            multiple options by separating them with a comma. To sort in
            descending order, use `-` sign in front of the sort, for example:
            `-title`.
          schema:
            type: string
          example: sort=-created_at,title
        - name: page[size]
          in: query
          description: The number of results that will be returned per page.
          schema:
            type: integer
            default: 30
        - name: page[cursor]
          in: query
          description: The cursor to start the pagination from.
          schema:
            type: string
        - name: filter
          in: query
          description: >-
            Allowed filter fields (with allowed operators):


            | Field | Type | Operators |

            |------|------|-----------|

            | `title` | `string` | in, nin, notin, eq, ne, neq, contains, like,
            startswith, endswith, isnull, isnotnull, notnull |

            | `price` | `float` | eq, ne, neq, lt, lte, le, gt, gte, ge, in,
            nin, notin, isnull, isnotnull, notnull |

            | `amount` | `float` | eq, ne, neq, lt, lte, le, gt, gte, ge, in,
            nin, notin, isnull, isnotnull, notnull |

            | `project.id` | `id<ProjectData>` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |

            | `project.title` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `project.external_id` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `project.shortcode` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `total` | `currency` | eq, ne, neq, lt, lte, le, gt, gte, ge, in,
            nin, notin, contains, like, startswith, endswith, isnull, isnotnull,
            notnull |

            | `purchase_price` | `currency` | eq, ne, neq, lt, lte, le, gt, gte,
            ge, in, nin, notin, contains, like, startswith, endswith, isnull,
            isnotnull, notnull |

            | `purchase_total` | `currency` | eq, ne, neq, lt, lte, le, gt, gte,
            ge, in, nin, notin, contains, like, startswith, endswith, isnull,
            isnotnull, notnull |

            | `type` | `enum<AccountingLineItemType>` | eq, ne, neq, in, nin,
            notin |

            | `metric.id` | `id<MetricData>` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |

            | `metric.title` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |


            Filtering expression. Accepts either JSON (array/tree of conditions)
            or a readable string DSL.


            You can check the full syntax at Docs `Filtering` section.


            Special values:

            - me.id — current authenticated user id (usable on fields of type
            id). Example: `id eq me.id`

            - now — current date-time. Example: `dueOn lt now`

            - sow/eow — start/end of week. Examples: `dueOn gt sow`, `dueOn lt
            eow`

            - som/eom — start/end of month. Examples: `dueOn gt som`, `dueOn lt
            eom`

            - today — special date for today; with eq it expands to the whole
            day range. Example: `dueOn eq today`

            - today±Nd — relative day offset. Examples: `today-30d`, `today+5d`.
          schema:
            type: string
          example: >-
            title contains "Acme" and (created_at >= "2024-01-01" or client.name
            contains "Corp")
      responses:
        '200':
          description: The cursor paginated collection of `OfferLineItemData`
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    description: The list of items
                    items:
                      $ref: '#/components/schemas/OfferLineItemData'
                  links:
                    type: array
                    items:
                      type: string
                  meta:
                    type: object
                    properties:
                      path:
                        type:
                          - string
                          - 'null'
                        description: Base path for paginator generated URLs.
                      per_page:
                        type: integer
                        description: Number of items shown per page.
                      next_cursor:
                        type:
                          - string
                          - 'null'
                      next_cursor_url:
                        type:
                          - string
                          - 'null'
                      prev_cursor:
                        type:
                          - string
                          - 'null'
                      prev_cursor_url:
                        type:
                          - string
                          - 'null'
                    required:
                      - path
                      - per_page
                      - next_cursor
                      - next_cursor_url
                      - prev_cursor
                      - prev_cursor_url
                required:
                  - data
                  - links
                  - meta
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /offers/{id}/pdf:
    get:
      operationId: offers.pdf
      description: '**Required scopes:** `offer:read`'
      summary: Download offer PDF
      tags:
        - Offers
      parameters:
        - name: id
          in: path
          required: true
          description: The ID of the offer to be downloaded.
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id` by default it will use the integration
            slug
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/octet-stream:
              schema:
                type: string
                format: binary
          headers:
            Content-Disposition:
              required: true
              schema:
                type: string
              example: attachment
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '404':
          $ref: '#/components/responses/ModelNotFoundException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /outgoing-invoices:
    get:
      operationId: outgoingInvoices.index
      description: '**Required scopes:** `outgoing-invoice:read`'
      summary: List all invoices
      tags:
        - Outgoing Invoices
      parameters:
        - name: sort
          in: query
          description: >-
            Available sorts are `invoice_number`, `title`, `date_of_invoice`,
            `sum_net`, `sum_tax`, `sum_external_costs`, `sum_gross`,
            `created_at`, `updated_at`, `computed_fields.<alias>`.<br/>You can
            sort by multiple options by separating them with a comma. To sort in
            descending order, use `-` sign in front of the sort, for example:
            `-title`.
          schema:
            type: string
          example: sort=-created_at,title
        - name: include
          in: query
          description: >-
            Available includes are `external_costs`, `line_items`, `discounts`.
            You can include multiple options by separating them with a comma.
          schema:
            type: string
        - name: page[size]
          in: query
          description: The number of results that will be returned per page.
          schema:
            type: integer
            default: 30
        - name: page[cursor]
          in: query
          description: The cursor to start the pagination from.
          schema:
            type: string
        - name: filter
          in: query
          description: >-
            Allowed filter fields (with allowed operators):


            | Field | Type | Operators |

            |------|------|-----------|

            | `archived` | `enum: with, only, without` | eq |

            | `title` | `string` | in, nin, notin, eq, ne, neq, contains, like,
            startswith, endswith, isnull, isnotnull, notnull |

            | `status` | `enum<OutgoingInvoiceStatus>` | eq, ne, neq, in, nin,
            notin |

            | `payment_status` | `enum<OutgoingInvoicePaymentStatus>` | eq, ne,
            neq, in, nin, notin |

            | `invoice_number` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `is_credit` | `boolean` | eq, ne, neq, isnull, isnotnull, notnull
            |

            | `date_of_invoice` | `date` | eq, ne, neq, lt, lte, le, gt, gte,
            ge, in, nin, notin, isnull, isnotnull, notnull |

            | `payment_due_date` | `date` | eq, ne, neq, lt, lte, le, gt, gte,
            ge, in, nin, notin, isnull, isnotnull, notnull |

            | `sum_net` | `currency` | eq, ne, neq, lt, lte, le, gt, gte, ge,
            in, nin, notin, contains, like, startswith, endswith, isnull,
            isnotnull, notnull |

            | `sum_tax` | `currency` | eq, ne, neq, lt, lte, le, gt, gte, ge,
            in, nin, notin, contains, like, startswith, endswith, isnull,
            isnotnull, notnull |

            | `sum_gross` | `currency` | eq, ne, neq, lt, lte, le, gt, gte, ge,
            in, nin, notin, contains, like, startswith, endswith, isnull,
            isnotnull, notnull |

            | `editor.id` | `id<UserData>` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |

            | `editor.external_id` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `editor.email` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `client.id` | `id<ClientData>` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |

            | `client.name` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `client.external_id` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `client.shortcode` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `project.id` | `id<ProjectData>` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |

            | `project.title` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `project.external_id` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `project.shortcode` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `company.id` | `id<CompanyData>` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |

            | `company.company_name:string` | `string` | in, nin, notin, eq, ne,
            neq, contains, like, startswith, endswith, isnull, isnotnull,
            notnull |

            | `line_items` | `Relation`<br /> - title (string)<br /> - price
            (currency)<br /> - amount (float)<br /> - project.id (id)<br /> -
            project.title (string)<br /> - project.external_id (string)<br /> -
            project.shortcode (string)<br /> - total_net (currency)<br /> -
            total_net_base (currency)<br /> - total_net_without_discount
            (currency)<br /> - total_gross (currency)<br /> - total_gross_base
            (currency)<br /> - total_gross_without_discount (currency)<br /> -
            purchase_total (currency)<br /> - purchase_total_base (currency)<br
            /> - type (enum) | any, none, count, all |

            | `external_costs` | `Relation`<br /> - title (string)<br /> -
            amount (float)<br /> - project.id (id)<br /> - project.title
            (string)<br /> - project.external_id (string)<br /> -
            project.shortcode (string)<br /> - supplier.id (id)<br /> -
            supplier.name (string)<br /> - price (currency)<br /> - total
            (currency) | any, none, count, all |


            Filtering expression. Accepts either JSON (array/tree of conditions)
            or a readable string DSL.


            You can check the full syntax at Docs `Filtering` section.


            Special values:

            - me.id — current authenticated user id (usable on fields of type
            id). Example: `id eq me.id`

            - now — current date-time. Example: `dueOn lt now`

            - sow/eow — start/end of week. Examples: `dueOn gt sow`, `dueOn lt
            eow`

            - som/eom — start/end of month. Examples: `dueOn gt som`, `dueOn lt
            eom`

            - today — special date for today; with eq it expands to the whole
            day range. Example: `dueOn eq today`

            - today±Nd — relative day offset. Examples: `today-30d`, `today+5d`.
          schema:
            type: string
          example: >-
            title contains "Acme" and (created_at >= "2024-01-01" or client.name
            contains "Corp")
        - name: computed_fields[alias]
          in: query
          description: >
            Dynamic computed relation fields (computed_fields[alias])


            Declare ad-hoc aggregates per request using:
            `computed_fields[<alias>] = relation.aggregate(args)`


            Syntax:

            - Count: `relation.count()` or `relation.count(<where>)`

            - Sum/Avg/Min/Max: `relation.sum(<column>)` or
            `relation.sum(<column>, <where>)`


            Where is written using the same Filter DSL and is validated against
            the relation's allowed fields.


            Use the prefix `computed_fields.` when referencing these aliases in
            `filter` or `sort`, e.g., `filter=computed_fields.tasks_done gte 1`
            or `sort=-computed_fields.tasks_done`. Bare aliases are accepted for
            backward compatibility but deprecated.


            Allowed relations for computed_fields (deny-all by default):

            - line_items (→ lineItems): aggregates: count, sum, avg, min, max;
            coalesce default: 0

            - external_costs (→ internalCosts): aggregates: count, sum, avg,
            min, max; coalesce default: 0


            Example:
            `?computed_fields[tasks_done]=tasks.count(status%20eq%20%22Completed%22)&filter=computed_fields.tasks_done%20gt%200`
          schema:
            type: string
          example: >-
            computed_fields[tasks_done]=tasks.count(status%20eq%20%22Completed%22)
      responses:
        '200':
          description: The cursor paginated collection of `OutgoingInvoiceData`
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    description: The list of items
                    items:
                      $ref: '#/components/schemas/OutgoingInvoiceData'
                  links:
                    type: array
                    items:
                      type: string
                  meta:
                    type: object
                    properties:
                      path:
                        type:
                          - string
                          - 'null'
                        description: Base path for paginator generated URLs.
                      per_page:
                        type: integer
                        description: Number of items shown per page.
                      next_cursor:
                        type:
                          - string
                          - 'null'
                      next_cursor_url:
                        type:
                          - string
                          - 'null'
                      prev_cursor:
                        type:
                          - string
                          - 'null'
                      prev_cursor_url:
                        type:
                          - string
                          - 'null'
                    required:
                      - path
                      - per_page
                      - next_cursor
                      - next_cursor_url
                      - prev_cursor
                      - prev_cursor_url
                required:
                  - data
                  - links
                  - meta
        '401':
          $ref: '#/components/responses/AuthenticationException'
  /outgoing-invoices/master:
    get:
      operationId: outgoingInvoices.masterPlans
      description: '**Required scopes:** `outgoing-invoice:read`'
      summary: List all invoice master plans
      tags:
        - Outgoing Invoices
      parameters:
        - name: sort
          in: query
          description: >-
            Available sorts are `title`, `performance_range_start`,
            `performance_range_end`, `sum_net`, `sum_tax`, `sum_external_costs`,
            `sum_gross`, `created_at`, `updated_at`,
            `computed_fields.<alias>`.<br/>You can sort by multiple options by
            separating them with a comma. To sort in descending order, use `-`
            sign in front of the sort, for example: `-title`.
          schema:
            type: string
          example: sort=-created_at,title
        - name: include
          in: query
          description: >-
            Available includes are `external_costs`, `line_items`, `discounts`.
            You can include multiple options by separating them with a comma.
          schema:
            type: string
        - name: page[size]
          in: query
          description: The number of results that will be returned per page.
          schema:
            type: integer
            default: 30
        - name: page[cursor]
          in: query
          description: The cursor to start the pagination from.
          schema:
            type: string
        - name: filter
          in: query
          description: >-
            Allowed filter fields (with allowed operators):


            | Field | Type | Operators |

            |------|------|-----------|

            | `archived` | `enum: with, only, without` | eq |

            | `title` | `string` | in, nin, notin, eq, ne, neq, contains, like,
            startswith, endswith, isnull, isnotnull, notnull |

            | `sum_net` | `currency` | eq, ne, neq, lt, lte, le, gt, gte, ge,
            in, nin, notin, contains, like, startswith, endswith, isnull,
            isnotnull, notnull |

            | `sum_tax` | `currency` | eq, ne, neq, lt, lte, le, gt, gte, ge,
            in, nin, notin, contains, like, startswith, endswith, isnull,
            isnotnull, notnull |

            | `sum_gross` | `currency` | eq, ne, neq, lt, lte, le, gt, gte, ge,
            in, nin, notin, contains, like, startswith, endswith, isnull,
            isnotnull, notnull |

            | `editor.id` | `id<UserData>` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |

            | `editor.external_id` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `editor.email` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `client.id` | `id<ClientData>` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |

            | `client.name` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `client.external_id` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `client.shortcode` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `project.id` | `id<ProjectData>` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |

            | `project.title` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `project.external_id` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `project.shortcode` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `company.id` | `id<CompanyData>` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |

            | `company.company_name:string` | `string` | in, nin, notin, eq, ne,
            neq, contains, like, startswith, endswith, isnull, isnotnull,
            notnull |

            | `line_items` | `Relation`<br /> - title (string)<br /> - price
            (currency)<br /> - amount (float)<br /> - project.id (id)<br /> -
            project.title (string)<br /> - project.external_id (string)<br /> -
            project.shortcode (string)<br /> - total_net (currency)<br /> -
            total_net_base (currency)<br /> - total_net_without_discount
            (currency)<br /> - total_gross (currency)<br /> - total_gross_base
            (currency)<br /> - total_gross_without_discount (currency)<br /> -
            purchase_total (currency)<br /> - purchase_total_base (currency)<br
            /> - type (enum) | any, none, count, all |

            | `external_costs` | `Relation`<br /> - title (string)<br /> -
            amount (float)<br /> - project.id (id)<br /> - project.title
            (string)<br /> - project.external_id (string)<br /> -
            project.shortcode (string)<br /> - supplier.id (id)<br /> -
            supplier.name (string)<br /> - price (currency)<br /> - total
            (currency) | any, none, count, all |


            Filtering expression. Accepts either JSON (array/tree of conditions)
            or a readable string DSL.


            You can check the full syntax at Docs `Filtering` section.


            Special values:

            - me.id — current authenticated user id (usable on fields of type
            id). Example: `id eq me.id`

            - now — current date-time. Example: `dueOn lt now`

            - sow/eow — start/end of week. Examples: `dueOn gt sow`, `dueOn lt
            eow`

            - som/eom — start/end of month. Examples: `dueOn gt som`, `dueOn lt
            eom`

            - today — special date for today; with eq it expands to the whole
            day range. Example: `dueOn eq today`

            - today±Nd — relative day offset. Examples: `today-30d`, `today+5d`.
          schema:
            type: string
          example: >-
            title contains "Acme" and (created_at >= "2024-01-01" or client.name
            contains "Corp")
        - name: computed_fields[alias]
          in: query
          description: >
            Dynamic computed relation fields (computed_fields[alias])


            Declare ad-hoc aggregates per request using:
            `computed_fields[<alias>] = relation.aggregate(args)`


            Syntax:

            - Count: `relation.count()` or `relation.count(<where>)`

            - Sum/Avg/Min/Max: `relation.sum(<column>)` or
            `relation.sum(<column>, <where>)`


            Where is written using the same Filter DSL and is validated against
            the relation's allowed fields.


            Use the prefix `computed_fields.` when referencing these aliases in
            `filter` or `sort`, e.g., `filter=computed_fields.tasks_done gte 1`
            or `sort=-computed_fields.tasks_done`. Bare aliases are accepted for
            backward compatibility but deprecated.


            Allowed relations for computed_fields (deny-all by default):

            - line_items (→ lineItems): aggregates: count, sum, avg, min, max;
            coalesce default: 0

            - external_costs (→ internalCosts): aggregates: count, sum, avg,
            min, max; coalesce default: 0


            Example:
            `?computed_fields[tasks_done]=tasks.count(status%20eq%20%22Completed%22)&filter=computed_fields.tasks_done%20gt%200`
          schema:
            type: string
          example: >-
            computed_fields[tasks_done]=tasks.count(status%20eq%20%22Completed%22)
      responses:
        '200':
          description: The cursor paginated collection of `OutgoingInvoiceMasterData`
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    description: The list of items
                    items:
                      $ref: '#/components/schemas/OutgoingInvoiceMasterData'
                  links:
                    type: array
                    items:
                      type: string
                  meta:
                    type: object
                    properties:
                      path:
                        type:
                          - string
                          - 'null'
                        description: Base path for paginator generated URLs.
                      per_page:
                        type: integer
                        description: Number of items shown per page.
                      next_cursor:
                        type:
                          - string
                          - 'null'
                      next_cursor_url:
                        type:
                          - string
                          - 'null'
                      prev_cursor:
                        type:
                          - string
                          - 'null'
                      prev_cursor_url:
                        type:
                          - string
                          - 'null'
                    required:
                      - path
                      - per_page
                      - next_cursor
                      - next_cursor_url
                      - prev_cursor
                      - prev_cursor_url
                required:
                  - data
                  - links
                  - meta
        '401':
          $ref: '#/components/responses/AuthenticationException'
  /outgoing-invoices/master/{id}:
    get:
      operationId: outgoingInvoices.showMaster
      description: '**Required scopes:** `outgoing-invoice:read`'
      summary: Retrieve an invoice master plan
      tags:
        - Outgoing Invoices
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id` by default it will use the integration
            slug
          schema:
            type: string
      responses:
        '200':
          description: '`OutgoingInvoiceMasterData`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OutgoingInvoiceMasterData'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /outgoing-invoices/{id}:
    get:
      operationId: outgoingInvoices.show
      description: '**Required scopes:** `outgoing-invoice:read`'
      summary: Retrieve an invoice
      tags:
        - Outgoing Invoices
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id` by default it will use the integration
            slug
          schema:
            type: string
      responses:
        '200':
          description: '`OutgoingInvoiceData`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OutgoingInvoiceData'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /outgoing-invoices/{id}/line-items:
    get:
      operationId: outgoingInvoices.lineItems
      description: '**Required scopes:** `outgoing-invoice:read`'
      summary: List all invoice lineItems
      tags:
        - Outgoing Invoices
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id` by default it will use the integration
            slug
          schema:
            type: string
        - name: sort
          in: query
          description: >-
            Available sorts are `title`, `price`, `total_net_base`,
            `total_net_without_discount`, `total_net`, `total_gross_base`,
            `total_gross_without_discount`, `total_gross`, `purchase_total`,
            `purchase_total_base`, `purchase_price`, `created_at`,
            `updated_at`.<br/>You can sort by multiple options by separating
            them with a comma. To sort in descending order, use `-` sign in
            front of the sort, for example: `-title`.
          schema:
            type: string
          example: sort=-created_at,title
        - name: page[size]
          in: query
          description: The number of results that will be returned per page.
          schema:
            type: integer
            default: 30
        - name: page[cursor]
          in: query
          description: The cursor to start the pagination from.
          schema:
            type: string
        - name: filter
          in: query
          description: >-
            Allowed filter fields (with allowed operators):


            | Field | Type | Operators |

            |------|------|-----------|

            | `title` | `string` | in, nin, notin, eq, ne, neq, contains, like,
            startswith, endswith, isnull, isnotnull, notnull |

            | `price` | `float` | eq, ne, neq, lt, lte, le, gt, gte, ge, in,
            nin, notin, isnull, isnotnull, notnull |

            | `amount` | `float` | eq, ne, neq, lt, lte, le, gt, gte, ge, in,
            nin, notin, isnull, isnotnull, notnull |

            | `tax_factor` | `float` | eq, ne, neq, lt, lte, le, gt, gte, ge,
            in, nin, notin, isnull, isnotnull, notnull |

            | `project.id` | `id<ProjectData>` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |

            | `project.title` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `project.external_id` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `project.shortcode` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `total_net_base` | `currency` | eq, ne, neq, lt, lte, le, gt, gte,
            ge, in, nin, notin, contains, like, startswith, endswith, isnull,
            isnotnull, notnull |

            | `total_net_without_discount` | `currency` | eq, ne, neq, lt, lte,
            le, gt, gte, ge, in, nin, notin, contains, like, startswith,
            endswith, isnull, isnotnull, notnull |

            | `total_net` | `currency` | eq, ne, neq, lt, lte, le, gt, gte, ge,
            in, nin, notin, contains, like, startswith, endswith, isnull,
            isnotnull, notnull |

            | `total_gross_base` | `currency` | eq, ne, neq, lt, lte, le, gt,
            gte, ge, in, nin, notin, contains, like, startswith, endswith,
            isnull, isnotnull, notnull |

            | `total_gross_without_discount` | `currency` | eq, ne, neq, lt,
            lte, le, gt, gte, ge, in, nin, notin, contains, like, startswith,
            endswith, isnull, isnotnull, notnull |

            | `total_gross` | `currency` | eq, ne, neq, lt, lte, le, gt, gte,
            ge, in, nin, notin, contains, like, startswith, endswith, isnull,
            isnotnull, notnull |

            | `purchase_price` | `currency` | eq, ne, neq, lt, lte, le, gt, gte,
            ge, in, nin, notin, contains, like, startswith, endswith, isnull,
            isnotnull, notnull |

            | `purchase_total_base` | `currency` | eq, ne, neq, lt, lte, le, gt,
            gte, ge, in, nin, notin, contains, like, startswith, endswith,
            isnull, isnotnull, notnull |

            | `purchase_total` | `currency` | eq, ne, neq, lt, lte, le, gt, gte,
            ge, in, nin, notin, contains, like, startswith, endswith, isnull,
            isnotnull, notnull |

            | `type` | `enum<AccountingLineItemType>` | eq, ne, neq, in, nin,
            notin |

            | `metric.id` | `id<MetricData>` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |

            | `metric.title` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |


            Filtering expression. Accepts either JSON (array/tree of conditions)
            or a readable string DSL.


            You can check the full syntax at Docs `Filtering` section.


            Special values:

            - me.id — current authenticated user id (usable on fields of type
            id). Example: `id eq me.id`

            - now — current date-time. Example: `dueOn lt now`

            - sow/eow — start/end of week. Examples: `dueOn gt sow`, `dueOn lt
            eow`

            - som/eom — start/end of month. Examples: `dueOn gt som`, `dueOn lt
            eom`

            - today — special date for today; with eq it expands to the whole
            day range. Example: `dueOn eq today`

            - today±Nd — relative day offset. Examples: `today-30d`, `today+5d`.
          schema:
            type: string
          example: >-
            title contains "Acme" and (created_at >= "2024-01-01" or client.name
            contains "Corp")
      responses:
        '200':
          description: The cursor paginated collection of `OutgoingInvoiceLineItemData`
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    description: The list of items
                    items:
                      $ref: '#/components/schemas/OutgoingInvoiceLineItemData'
                  links:
                    type: array
                    items:
                      type: string
                  meta:
                    type: object
                    properties:
                      path:
                        type:
                          - string
                          - 'null'
                        description: Base path for paginator generated URLs.
                      per_page:
                        type: integer
                        description: Number of items shown per page.
                      next_cursor:
                        type:
                          - string
                          - 'null'
                      next_cursor_url:
                        type:
                          - string
                          - 'null'
                      prev_cursor:
                        type:
                          - string
                          - 'null'
                      prev_cursor_url:
                        type:
                          - string
                          - 'null'
                    required:
                      - path
                      - per_page
                      - next_cursor
                      - next_cursor_url
                      - prev_cursor
                      - prev_cursor_url
                required:
                  - data
                  - links
                  - meta
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /outgoing-invoices/external:
    post:
      operationId: outgoingInvoices.createExternal
      description: >-
        **Required scopes:** `outgoing-invoice:upload`


        Endpoint can be used to upload outgoing invoices not created within
        Kanbert.

        <br/><br/>

        **Be careful:**

        <br/>Invoice Enumeration & consistency is in your responsibility.

        <br/>Make sure not to interfere with the invoice numbering of Kanbert.
      summary: Upload a manual invoice
      tags:
        - Outgoing Invoices
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                external_id:
                  type:
                    - string
                    - 'null'
                  description: >-
                    Can be used to add an identifier from an external system,
                    must be unique within integration (integration's slug)
                  maxLength: 255
                external_origin:
                  type: string
                  description: If not set, integration's slug will be used as default
                  maxLength: 255
                client_id:
                  type: string
                title:
                  type: string
                status:
                  type: string
                  description: 'Allowed values: `booked`'
                  enum:
                    - booked
                invoice_number:
                  type: string
                  description: >-
                    Required if status is `booked`.

                    <br/>We do check whether an invoice with the same
                    `invoice_number` exists already.

                    <br/>We do not check if the invoice interferes with invoice
                    number cycles in Kanbert.
                date_of_invoice:
                  type: string
                  format: date-time
                performance_range_start:
                  type: string
                  format: date-time
                performance_range_end:
                  type: string
                  format: date-time
                payment_due_date:
                  type: string
                  format: date-time
                booked_at:
                  type: string
                  format: date-time
                currency:
                  type: string
                  description: 'Allowed values: `EUR`'
                  enum:
                    - EUR
                sum_net:
                  type: number
                sum_tax:
                  type: number
                  description: Can be used to indicate reverse charge
                  default: 0
                taxation_enabled:
                  type: boolean
                  description: Can be used to indicate reverse charge
                  default: true
                is_credit:
                  type: boolean
                address:
                  type: string
                reference:
                  type: string
                po_number:
                  type: string
                project_id:
                  type: string
                company_id:
                  type: string
                editor_id:
                  type: string
                file_url:
                  type: string
                  format: uri
                  description: >-
                    A public url to download the invoice PDF from - either
                    `file_url` or `file` are required
                file:
                  type: string
                  format: binary
                  description: >-
                    PDF to upload - Max: 15MB - either `file_url` or `file` are
                    required
                vats:
                  type: array
                  items:
                    type: object
                    properties:
                      vat:
                        type: number
                      value:
                        type: number
                    required:
                      - vat
                      - value
              required:
                - client_id
                - title
                - status
                - date_of_invoice
                - performance_range_start
                - performance_range_end
                - payment_due_date
                - currency
                - sum_net
      responses:
        '200':
          description: '`OutgoingInvoiceData`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OutgoingInvoiceData'
        '400':
          description: |-
            An error

            An error

            An error
          content:
            application/json:
              schema:
                anyOf:
                  - type: object
                    properties:
                      message:
                        type: string
                        description: Error overview.
                        example: Failed to download file from provided URL
                    required:
                      - message
                  - type: object
                    properties:
                      message:
                        type: string
                        description: Error overview.
                        example: Downloaded file is not a valid PDF
                    required:
                      - message
                  - type: object
                    properties:
                      message:
                        type: string
                        description: Error overview.
                        example: Uploaded file is not a valid PDF
                    required:
                      - message
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '409':
          description: An error
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: Error overview.
                    example: Invoice number already exists
                required:
                  - message
        '413':
          description: An error
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: Error overview.
                    example: Downloaded file exceeds maximum size of 15MB
                required:
                  - message
        '422':
          $ref: '#/components/responses/ValidationException'
  /outgoing-invoices/{id}/pdf:
    get:
      operationId: outgoingInvoices.pdf
      description: '**Required scopes:** `outgoing-invoice:read`'
      summary: Download invoice PDF
      tags:
        - Outgoing Invoices
      parameters:
        - name: id
          in: path
          required: true
          description: The ID of the invoice to be downloaded.
          schema:
            type: string
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id` by default it will use the integration
            slug
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/octet-stream:
              schema:
                type: string
                format: binary
          headers:
            Content-Disposition:
              required: true
              schema:
                type: string
              example: attachment
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '404':
          $ref: '#/components/responses/ModelNotFoundException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /payment-accounts:
    get:
      operationId: payments.accounts
      description: '**Required scopes:** `payments:read`'
      summary: List all payment accounts
      tags:
        - Payments
      parameters:
        - name: page[size]
          in: query
          description: The number of results that will be returned per page.
          schema:
            type: integer
            default: 30
        - name: page[cursor]
          in: query
          description: The cursor to start the pagination from.
          schema:
            type: string
        - name: filter
          in: query
          description: >-
            Allowed filter fields (with allowed operators):


            | Field | Type | Operators |

            |------|------|-----------|

            | `archived` | `enum: with, only, without` | eq |

            | `title` | `string` | in, nin, notin, eq, ne, neq, contains, like,
            startswith, endswith, isnull, isnotnull, notnull |

            | `type` | `enum<PaymentAccountType>` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |

            | `organisation` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `created_at` | `datetime` | eq, ne, neq, lt, lte, le, gt, gte, ge,
            in, nin, notin, isnull, isnotnull, notnull |

            | `owner.id` | `id<UserData>` | eq, ne, neq, in, nin, notin, isnull,
            isnotnull, notnull |

            | `owner.email` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |


            Filtering expression. Accepts either JSON (array/tree of conditions)
            or a readable string DSL.


            You can check the full syntax at Docs `Filtering` section.


            Special values:

            - me.id — current authenticated user id (usable on fields of type
            id). Example: `id eq me.id`

            - now — current date-time. Example: `dueOn lt now`

            - sow/eow — start/end of week. Examples: `dueOn gt sow`, `dueOn lt
            eow`

            - som/eom — start/end of month. Examples: `dueOn gt som`, `dueOn lt
            eom`

            - today — special date for today; with eq it expands to the whole
            day range. Example: `dueOn eq today`

            - today±Nd — relative day offset. Examples: `today-30d`, `today+5d`.
          schema:
            type: string
          example: >-
            title contains "Acme" and (created_at >= "2024-01-01" or client.name
            contains "Corp")
        - name: sort
          in: query
          description: >-
            Available sorts are `title`, `type`, `organization`, `identifier`,
            `created_at`.<br/>You can sort by multiple options by separating
            them with a comma. To sort in descending order, use `-` sign in
            front of the sort, for example: `-title`.
          schema:
            type: string
          example: sort=-created_at,title
      responses:
        '200':
          description: The cursor paginated collection of `PaymentAccountData`
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    description: The list of items
                    items:
                      $ref: '#/components/schemas/PaymentAccountData'
                  links:
                    type: array
                    items:
                      type: string
                  meta:
                    type: object
                    properties:
                      path:
                        type:
                          - string
                          - 'null'
                        description: Base path for paginator generated URLs.
                      per_page:
                        type: integer
                        description: Number of items shown per page.
                      next_cursor:
                        type:
                          - string
                          - 'null'
                      next_cursor_url:
                        type:
                          - string
                          - 'null'
                      prev_cursor:
                        type:
                          - string
                          - 'null'
                      prev_cursor_url:
                        type:
                          - string
                          - 'null'
                    required:
                      - path
                      - per_page
                      - next_cursor
                      - next_cursor_url
                      - prev_cursor
                      - prev_cursor_url
                required:
                  - data
                  - links
                  - meta
        '401':
          $ref: '#/components/responses/AuthenticationException'
  /payments:
    get:
      operationId: payments.payments
      description: '**Required scopes:** `payments:read`'
      summary: List all payments
      tags:
        - Payments
      parameters:
        - name: page[size]
          in: query
          description: The number of results that will be returned per page.
          schema:
            type: integer
            default: 30
        - name: page[cursor]
          in: query
          description: The cursor to start the pagination from.
          schema:
            type: string
        - name: filter
          in: query
          description: >-
            Allowed filter fields (with allowed operators):


            | Field | Type | Operators |

            |------|------|-----------|

            | `archived` | `enum: with, only, without` | eq |

            | `reference` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |

            | `type` | `enum` | eq, ne, neq, in, nin, notin, isnull, isnotnull,
            notnull |

            | `iban` | `string` | in, nin, notin, eq, ne, neq, contains, like,
            startswith, endswith, isnull, isnotnull, notnull |

            | `payment_account.id` | `id<PaymentAccountData>` | eq, ne, neq, in,
            nin, notin, isnull, isnotnull, notnull |

            | `payment_account.type` | `enum<PaymentAccountType>` | eq, ne, neq,
            in, nin, notin, isnull, isnotnull, notnull |

            | `payment_account.iban` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

            | `outgoing_invoice.id` | `id<OutgoingInvoiceData>` | eq, ne, neq,
            in, nin, notin, isnull, isnotnull, notnull |

            | `date_of_payment` | `date` | eq, ne, neq, lt, lte, le, gt, gte,
            ge, in, nin, notin, isnull, isnotnull, notnull |


            Filtering expression. Accepts either JSON (array/tree of conditions)
            or a readable string DSL.


            You can check the full syntax at Docs `Filtering` section.


            Special values:

            - me.id — current authenticated user id (usable on fields of type
            id). Example: `id eq me.id`

            - now — current date-time. Example: `dueOn lt now`

            - sow/eow — start/end of week. Examples: `dueOn gt sow`, `dueOn lt
            eow`

            - som/eom — start/end of month. Examples: `dueOn gt som`, `dueOn lt
            eom`

            - today — special date for today; with eq it expands to the whole
            day range. Example: `dueOn eq today`

            - today±Nd — relative day offset. Examples: `today-30d`, `today+5d`.
          schema:
            type: string
          example: >-
            title contains "Acme" and (created_at >= "2024-01-01" or client.name
            contains "Corp")
        - name: sort
          in: query
          description: >-
            Available sorts are `reference`, `iban`, `date_of_payment`,
            `created_at`.<br/>You can sort by multiple options by separating
            them with a comma. To sort in descending order, use `-` sign in
            front of the sort, for example: `-title`.
          schema:
            type: string
          example: sort=-created_at,title
      responses:
        '200':
          description: The cursor paginated collection of `PaymentData`
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    description: The list of items
                    items:
                      $ref: '#/components/schemas/PaymentData'
                  links:
                    type: array
                    items:
                      type: string
                  meta:
                    type: object
                    properties:
                      path:
                        type:
                          - string
                          - 'null'
                        description: Base path for paginator generated URLs.
                      per_page:
                        type: integer
                        description: Number of items shown per page.
                      next_cursor:
                        type:
                          - string
                          - 'null'
                      next_cursor_url:
                        type:
                          - string
                          - 'null'
                      prev_cursor:
                        type:
                          - string
                          - 'null'
                      prev_cursor_url:
                        type:
                          - string
                          - 'null'
                    required:
                      - path
                      - per_page
                      - next_cursor
                      - next_cursor_url
                      - prev_cursor
                      - prev_cursor_url
                required:
                  - data
                  - links
                  - meta
        '401':
          $ref: '#/components/responses/AuthenticationException'
  /payments/outgoing-invoice:
    post:
      operationId: payments.createOutgoingInvoicePayment
      description: '**Required scopes:** `payments:write`'
      summary: Add payment for an outgoing invoice
      tags:
        - Payments
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                type:
                  type: string
                  enum:
                    - in
                    - out
                payment_account_id:
                  type: string
                reference:
                  type: string
                  maxLength: 255
                date_of_payment:
                  type: string
                  format: date-time
                customer_name:
                  type: string
                  maxLength: 255
                iban:
                  type: string
                  maxLength: 255
                bic:
                  type: string
                  maxLength: 255
                bookings:
                  type: array
                  items:
                    type: object
                    properties:
                      outgoing_invoice_id:
                        type: string
                        description: Invoice needs to be booked
                      value:
                        type: number
                    required:
                      - outgoing_invoice_id
                      - value
              required:
                - type
                - payment_account_id
                - reference
                - date_of_payment
                - bookings
      responses:
        '200':
          description: '`PaymentData`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaymentData'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '422':
          $ref: '#/components/responses/ValidationException'
        '500':
          description: An error
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: Error overview.
                    example: Payment could not be saved
                required:
                  - message
  /payments/outgoing-invoice-credit:
    post:
      operationId: payments.createOutgoingInvoiceReferenceBooking
      description: '**Required scopes:** `payments:write`'
      summary: Associate an outgoing invoice with an outgoing credit
      tags:
        - Payments
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                reference:
                  type: string
                  maxLength: 255
                date_of_payment:
                  type: string
                  format: date-time
                outgoing_invoice_id:
                  type: string
                  description: Invoice needs to be booked & `is_credit = false`
                outgoing_credit_id:
                  type: string
                  description: Invoice needs to be booked & `is_credit = true`
                value:
                  type: number
              required:
                - reference
                - date_of_payment
                - outgoing_invoice_id
                - outgoing_credit_id
                - value
      responses:
        '200':
          description: The collection of `OutgoingInvoicePaymentBookingData`
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/OutgoingInvoicePaymentBookingData'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /user-group:
    get:
      operationId: usergroups.index
      description: '**Required scopes:** `user_group:read`'
      summary: List all usergroups
      tags:
        - Usergroups & Teams
      parameters:
        - name: sort
          in: query
          description: >-
            Available sorts are `name`, `is_team`.<br/>You can sort by multiple
            options by separating them with a comma. To sort in descending
            order, use `-` sign in front of the sort, for example: `-title`.
          schema:
            type: string
          example: sort=-created_at,title
        - name: include
          in: query
          description: >-
            Available includes are `users`. You can include multiple options by
            separating them with a comma.
          schema:
            type: string
        - name: page[size]
          in: query
          description: The number of results that will be returned per page.
          schema:
            type: integer
            default: 30
        - name: page[cursor]
          in: query
          description: The cursor to start the pagination from.
          schema:
            type: string
        - name: filter
          in: query
          description: >-
            Allowed filter fields (with allowed operators):


            | Field | Type | Operators |

            |------|------|-----------|

            | `name` | `string` | in, nin, notin, eq, ne, neq, contains, like,
            startswith, endswith, isnull, isnotnull, notnull |

            | `is_team` | `boolean` | eq, ne, neq, isnull, isnotnull, notnull |


            Filtering expression. Accepts either JSON (array/tree of conditions)
            or a readable string DSL.


            You can check the full syntax at Docs `Filtering` section.


            Special values:

            - me.id — current authenticated user id (usable on fields of type
            id). Example: `id eq me.id`

            - now — current date-time. Example: `dueOn lt now`

            - sow/eow — start/end of week. Examples: `dueOn gt sow`, `dueOn lt
            eow`

            - som/eom — start/end of month. Examples: `dueOn gt som`, `dueOn lt
            eom`

            - today — special date for today; with eq it expands to the whole
            day range. Example: `dueOn eq today`

            - today±Nd — relative day offset. Examples: `today-30d`, `today+5d`.
          schema:
            type: string
          example: >-
            title contains "Acme" and (created_at >= "2024-01-01" or client.name
            contains "Corp")
      responses:
        '200':
          description: The cursor paginated collection of `UsergroupData`
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    description: The list of items
                    items:
                      $ref: '#/components/schemas/UsergroupData'
                  links:
                    type: array
                    items:
                      type: string
                  meta:
                    type: object
                    properties:
                      path:
                        type:
                          - string
                          - 'null'
                        description: Base path for paginator generated URLs.
                      per_page:
                        type: integer
                        description: Number of items shown per page.
                      next_cursor:
                        type:
                          - string
                          - 'null'
                      next_cursor_url:
                        type:
                          - string
                          - 'null'
                      prev_cursor:
                        type:
                          - string
                          - 'null'
                      prev_cursor_url:
                        type:
                          - string
                          - 'null'
                    required:
                      - path
                      - per_page
                      - next_cursor
                      - next_cursor_url
                      - prev_cursor
                      - prev_cursor_url
                required:
                  - data
                  - links
                  - meta
        '401':
          $ref: '#/components/responses/AuthenticationException'
  /user-group/{id}:
    get:
      operationId: usergroups.show
      description: '**Required scopes:** `user_group:read`'
      summary: Retrieve a usergroup
      tags:
        - Usergroups & Teams
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: integer
        - name: find_by
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
              - shortcode
            default: id
        - name: origin
          in: query
          description: >-
            Used if `find_by=external_id` by default it will use the integration
            slug
          schema:
            type: string
        - name: include
          in: query
          description: >-
            Available includes are `users`. You can include multiple options by
            separating them with a comma.
          schema:
            type: string
      responses:
        '200':
          description: '`UsergroupData`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UsergroupData'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '404':
          $ref: '#/components/responses/ModelNotFoundException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /settings/countries:
    get:
      operationId: settings.countries
      description: '**No specific scope required.**'
      summary: Retrieve all countries
      tags:
        - Settings
      parameters:
        - name: sort
          in: query
          description: >-
            Available sorts are `name`.<br/>You can sort by multiple options by
            separating them with a comma. To sort in descending order, use `-`
            sign in front of the sort, for example: `-title`.
          schema:
            type: string
          example: sort=-created_at,title
        - name: page[size]
          in: query
          description: The number of results that will be returned per page.
          schema:
            type: integer
            default: 30
        - name: page[cursor]
          in: query
          description: The cursor to start the pagination from.
          schema:
            type: string
        - name: filter
          in: query
          description: >-
            Allowed filter fields (with allowed operators):


            | Field | Type | Operators |

            |------|------|-----------|

            | `name` | `string` | in, nin, notin, eq, ne, neq, contains, like,
            startswith, endswith, isnull, isnotnull, notnull |

            | `code` | `string` | in, nin, notin, eq, ne, neq, contains, like,
            startswith, endswith, isnull, isnotnull, notnull |


            Filtering expression. Accepts either JSON (array/tree of conditions)
            or a readable string DSL.


            You can check the full syntax at Docs `Filtering` section.


            Special values:

            - me.id — current authenticated user id (usable on fields of type
            id). Example: `id eq me.id`

            - now — current date-time. Example: `dueOn lt now`

            - sow/eow — start/end of week. Examples: `dueOn gt sow`, `dueOn lt
            eow`

            - som/eom — start/end of month. Examples: `dueOn gt som`, `dueOn lt
            eom`

            - today — special date for today; with eq it expands to the whole
            day range. Example: `dueOn eq today`

            - today±Nd — relative day offset. Examples: `today-30d`, `today+5d`.
          schema:
            type: string
          example: >-
            title contains "Acme" and (created_at >= "2024-01-01" or client.name
            contains "Corp")
      responses:
        '200':
          description: The cursor paginated collection of `CountryData`
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    description: The list of items
                    items:
                      $ref: '#/components/schemas/CountryData'
                  links:
                    type: array
                    items:
                      type: string
                  meta:
                    type: object
                    properties:
                      path:
                        type:
                          - string
                          - 'null'
                        description: Base path for paginator generated URLs.
                      per_page:
                        type: integer
                        description: Number of items shown per page.
                      next_cursor:
                        type:
                          - string
                          - 'null'
                      next_cursor_url:
                        type:
                          - string
                          - 'null'
                      prev_cursor:
                        type:
                          - string
                          - 'null'
                      prev_cursor_url:
                        type:
                          - string
                          - 'null'
                    required:
                      - path
                      - per_page
                      - next_cursor
                      - next_cursor_url
                      - prev_cursor
                      - prev_cursor_url
                required:
                  - data
                  - links
                  - meta
        '401':
          $ref: '#/components/responses/AuthenticationException'
  /integration:
    get:
      operationId: integration.show
      description: '**No specific scope required.**'
      summary: Retrieve current integration's information
      tags:
        - Integration
      responses:
        '200':
          description: '`IntegrationData`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IntegrationData'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '403':
          description: An error
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: Error overview.
                    example: Only integration users can access this endpoint
                required:
                  - message
  /files/{id}:
    get:
      operationId: file.show
      description: '**No specific scope required.**'
      summary: Retrieve a file's data
      tags:
        - Files
      parameters:
        - name: id
          in: path
          required: true
          description: The ID of the file to be retrieved.
          schema:
            type: string
      responses:
        '200':
          description: '`FileData`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FileData'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /files/{id}/download:
    get:
      operationId: file.download
      description: '**No specific scope required.**'
      summary: Download a file
      tags:
        - Files
      parameters:
        - name: id
          in: path
          required: true
          description: The ID of the file to be downloaded.
          schema:
            type: string
      responses:
        '200':
          description: ''
          content:
            application/octet-stream:
              schema:
                type: string
                format: binary
          headers:
            Content-Disposition:
              required: true
              schema:
                type: string
              example: attachment
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /custom-fields:
    get:
      operationId: customFields.index
      description: '**Required scopes:** `integration`'
      summary: List all custom fields
      tags:
        - Custom Fields
      parameters:
        - name: sort
          in: query
          description: >-
            Available sorts are `name`, `slug`, `created_at`.<br/>You can sort
            by multiple options by separating them with a comma. To sort in
            descending order, use `-` sign in front of the sort, for example:
            `-title`.
          schema:
            type: string
          example: sort=-created_at,title
        - name: page[size]
          in: query
          description: The number of results that will be returned per page.
          schema:
            type: integer
            default: 30
        - name: page[cursor]
          in: query
          description: The cursor to start the pagination from.
          schema:
            type: string
        - name: filter
          in: query
          description: >-
            Allowed filter fields (with allowed operators):


            | Field | Type | Operators |

            |------|------|-----------|

            | `archived` | `enum: with, only, without` | eq |

            | `title` | `string` | in, nin, notin, eq, ne, neq, contains, like,
            startswith, endswith, isnull, isnotnull, notnull |

            | `type` | `enum<CustomFieldType>` | eq, ne, neq, in, nin, notin,
            isnull, isnotnull, notnull |

            | `entity_type` | `string` | in, nin, notin, eq, ne, neq, contains,
            like, startswith, endswith, isnull, isnotnull, notnull |


            Filtering expression. Accepts either JSON (array/tree of conditions)
            or a readable string DSL.


            You can check the full syntax at Docs `Filtering` section.


            Special values:

            - me.id — current authenticated user id (usable on fields of type
            id). Example: `id eq me.id`

            - now — current date-time. Example: `dueOn lt now`

            - sow/eow — start/end of week. Examples: `dueOn gt sow`, `dueOn lt
            eow`

            - som/eom — start/end of month. Examples: `dueOn gt som`, `dueOn lt
            eom`

            - today — special date for today; with eq it expands to the whole
            day range. Example: `dueOn eq today`

            - today±Nd — relative day offset. Examples: `today-30d`, `today+5d`.
          schema:
            type: string
          example: >-
            title contains "Acme" and (created_at >= "2024-01-01" or client.name
            contains "Corp")
      responses:
        '200':
          description: The cursor paginated collection of `CustomFieldData`
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    description: The list of items
                    items:
                      $ref: '#/components/schemas/CustomFieldData'
                  links:
                    type: array
                    items:
                      type: string
                  meta:
                    type: object
                    properties:
                      path:
                        type:
                          - string
                          - 'null'
                        description: Base path for paginator generated URLs.
                      per_page:
                        type: integer
                        description: Number of items shown per page.
                      next_cursor:
                        type:
                          - string
                          - 'null'
                      next_cursor_url:
                        type:
                          - string
                          - 'null'
                      prev_cursor:
                        type:
                          - string
                          - 'null'
                      prev_cursor_url:
                        type:
                          - string
                          - 'null'
                    required:
                      - path
                      - per_page
                      - next_cursor
                      - next_cursor_url
                      - prev_cursor
                      - prev_cursor_url
                required:
                  - data
                  - links
                  - meta
        '401':
          $ref: '#/components/responses/AuthenticationException'
  /webhooks:
    get:
      operationId: webhooks.index
      description: '**Required scopes:** `integration`'
      summary: List all registered webhooks
      tags:
        - Webhook Management
      parameters:
        - name: sort
          in: query
          description: >-
            Available sorts are `url`, `is_active`, `created_at`.<br/>You can
            sort by multiple options by separating them with a comma. To sort in
            descending order, use `-` sign in front of the sort, for example:
            `-title`.
          schema:
            type: string
          example: sort=-created_at,title
        - name: page[size]
          in: query
          description: The number of results that will be returned per page.
          schema:
            type: integer
            default: 30
        - name: page[cursor]
          in: query
          description: The cursor to start the pagination from.
          schema:
            type: string
        - name: filter
          in: query
          description: >-
            Allowed filter fields (with allowed operators):


            | Field | Type | Operators |

            |------|------|-----------|

            | `url` | `string` | in, nin, notin, eq, ne, neq, contains, like,
            startswith, endswith, isnull, isnotnull, notnull |

            | `created_at` | `datetime` | eq, ne, neq, lt, lte, le, gt, gte, ge,
            in, nin, notin, isnull, isnotnull, notnull |


            Filtering expression. Accepts either JSON (array/tree of conditions)
            or a readable string DSL.


            You can check the full syntax at Docs `Filtering` section.


            Special values:

            - me.id — current authenticated user id (usable on fields of type
            id). Example: `id eq me.id`

            - now — current date-time. Example: `dueOn lt now`

            - sow/eow — start/end of week. Examples: `dueOn gt sow`, `dueOn lt
            eow`

            - som/eom — start/end of month. Examples: `dueOn gt som`, `dueOn lt
            eom`

            - today — special date for today; with eq it expands to the whole
            day range. Example: `dueOn eq today`

            - today±Nd — relative day offset. Examples: `today-30d`, `today+5d`.
          schema:
            type: string
          example: >-
            title contains "Acme" and (created_at >= "2024-01-01" or client.name
            contains "Corp")
      responses:
        '200':
          description: The cursor paginated collection of `WebhookData`
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    description: The list of items
                    items:
                      $ref: '#/components/schemas/WebhookData'
                  links:
                    type: array
                    items:
                      type: string
                  meta:
                    type: object
                    properties:
                      path:
                        type:
                          - string
                          - 'null'
                        description: Base path for paginator generated URLs.
                      per_page:
                        type: integer
                        description: Number of items shown per page.
                      next_cursor:
                        type:
                          - string
                          - 'null'
                      next_cursor_url:
                        type:
                          - string
                          - 'null'
                      prev_cursor:
                        type:
                          - string
                          - 'null'
                      prev_cursor_url:
                        type:
                          - string
                          - 'null'
                    required:
                      - path
                      - per_page
                      - next_cursor
                      - next_cursor_url
                      - prev_cursor
                      - prev_cursor_url
                required:
                  - data
                  - links
                  - meta
        '401':
          $ref: '#/components/responses/AuthenticationException'
    post:
      operationId: webhooks.store
      description: >-
        **Required scopes:** `integration`


        Returns a `signature_secret_key` field, make sure to save it somewhere
        safe. It won't be returned again.
      summary: Register a new webhook
      tags:
        - Webhook Management
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                url:
                  type: string
                  format: uri
                  description: Needs to be unique
                  maxLength: 180
                project_id:
                  type:
                    - string
                    - 'null'
                  description: >-
                    Scope a webhook to a specific project to reduce the number
                    of events sent

                    <br/>`task:*` and `comment:*` events have to be
                    project-scoped
                client_id:
                  type:
                    - string
                    - 'null'
                  description: >-
                    Scope a webhook to a specific client to reduce the number of
                    events sent
                event:
                  description: Event to subscribe to type `WebhookEvent`
                  $ref: '#/components/schemas/WebhookEvent'
              required:
                - url
                - event
      responses:
        '200':
          description: '`WebhookCreateData`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WebhookCreateData'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '409':
          description: An error
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: Error overview.
                    example: Webhook already exists
                required:
                  - message
        '422':
          $ref: '#/components/responses/ValidationException'
  /webhooks/{id}:
    delete:
      operationId: webhooks.destroy
      description: '**Required scopes:** `integration`'
      summary: Delete a webhook
      tags:
        - Webhook Management
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: ''
        '401':
          $ref: '#/components/responses/AuthenticationException'
components:
  securitySchemes:
    http:
      type: http
      scheme: bearer
    oauth2:
      type: oauth2
      flows:
        authorizationCode:
          authorizationUrl: https://api.kanbert.com/oauth/authorize
          tokenUrl: https://api.kanbert.com/oauth/token
          scopes:
            integration: Act as own user, with all permissions
            user:read: Retrieve full user info of others
            client:read: Retrieve full clients info
            client:write: Create & update clients
            contact-data:read: Retrieve contacts & companies
            contact-data:write: Create & update contacts & companies
            task-management:read: Read tasks, phases, milestones, epics
            task-management:write: Create & update tasks, phases, milestones, epics
            efforts:read: Retrieve project efforts
            efforts:extended:read: Retrieve admin & project efforts
            user_group:read: Retrieve user groups
            offer:read: Retrieve offers
            outgoing-invoice:read: Retrieve invoices
            outgoing-invoice:upload: Upload external invoices
            payments:read: Retrieve payment accounts & payments
            payments:write: Create & update payment accounts & payments
  schemas:
    AccountingLineItemType:
      type: string
      enum:
        - unit
        - category
        - page_break
      title: AccountingLineItemType
    BusinessFieldData:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
      required:
        - id
        - name
      title: BusinessFieldData
    ClientData:
      type: object
      properties:
        id:
          type: string
        external_id:
          type:
            - string
            - 'null'
          description: >-
            Can be used to add an identifier to the client from an external
            system, must be unique
        external_origin:
          type:
            - string
            - 'null'
          description: If originated from external system origin is added
        name:
          type: string
        shortcode:
          type:
            - string
            - 'null'
        primary_contact:
          anyOf:
            - $ref: '#/components/schemas/UserData'
            - type: 'null'
        origin_space:
          anyOf:
            - description: >-
                Shared space which the client is shared from, if `null` client
                is not shared
              $ref: '#/components/schemas/SpaceData'
            - type: 'null'
      required:
        - id
        - external_id
        - external_origin
        - name
        - shortcode
        - primary_contact
        - origin_space
      title: ClientData
    ClientFullData:
      type: object
      properties:
        id:
          type: string
        external_id:
          type:
            - string
            - 'null'
          description: >-
            Can be used to add an identifier to the client from an external
            system, must be unique
        external_origin:
          type:
            - string
            - 'null'
          description: If originated from external system origin is added
        name:
          type: string
        shortcode:
          type:
            - string
            - 'null'
        segment:
          default: B
          $ref: '#/components/schemas/ClientSegment'
        updated_at:
          type: string
          format: date-time
        created_at:
          type: string
          format: date-time
        primary_contact:
          anyOf:
            - $ref: '#/components/schemas/UserData'
            - type: 'null'
        projects:
          type: array
          items:
            $ref: '#/components/schemas/ProjectData'
        origin_space:
          anyOf:
            - description: >-
                Shared space which the client is shared from, if `null` client
                is not shared
              $ref: '#/components/schemas/SpaceData'
            - type: 'null'
      required:
        - id
        - external_id
        - external_origin
        - name
        - shortcode
        - segment
        - updated_at
        - created_at
        - primary_contact
        - origin_space
      title: ClientFullData
    ClientSegment:
      type: string
      enum:
        - A
        - B
        - C
      title: ClientSegment
    CommentData:
      type: object
      properties:
        id:
          type: string
        external_id:
          type:
            - string
            - 'null'
        external_origin:
          type:
            - string
            - 'null'
          description: If originated from external system origin is added
        parent_comment_id:
          type:
            - string
            - 'null'
        parent_comment:
          anyOf:
            - $ref: '#/components/schemas/CommentData'
            - type: 'null'
        task:
          anyOf:
            - $ref: '#/components/schemas/TaskData'
            - type: 'null'
        sub_comments:
          type: array
          items:
            $ref: '#/components/schemas/CommentData'
        author:
          $ref: '#/components/schemas/UserData'
        comment:
          type:
            - string
            - 'null'
        attachements:
          type: array
          default: []
          items:
            $ref: '#/components/schemas/FileData'
        is_public:
          type: boolean
          description: >-
            If false, the task is only visible to the project team - not guest
            users
        created_at:
          type:
            - string
            - 'null'
          format: date-time
        updated_at:
          type:
            - string
            - 'null'
          format: date-time
      required:
        - id
        - external_id
        - external_origin
        - parent_comment_id
        - sub_comments
        - author
        - comment
        - attachements
        - is_public
        - created_at
        - updated_at
      title: CommentData
    CompanyData:
      type: object
      properties:
        id:
          type: string
        external_id:
          type:
            - string
            - 'null'
          description: >-
            Can be used to add an identifier to the client from an external
            system, must be unique
        external_origin:
          type:
            - string
            - 'null'
          description: If originated from external system origin is added
        vendor_identifier:
          type:
            - string
            - 'null'
        company_name:
          type:
            - string
            - 'null'
        locale:
          type:
            - string
            - 'null'
        tax_uid:
          type:
            - string
            - 'null'
        taxation_enabled:
          type: boolean
          description: Can be used to indicate reverse charge ie
        iban:
          type:
            - string
            - 'null'
        bic:
          type:
            - string
            - 'null'
        email:
          type:
            - string
            - 'null'
        email_general:
          type:
            - string
            - 'null'
        phone:
          type:
            - string
            - 'null'
        fax:
          type:
            - string
            - 'null'
        homepage:
          type:
            - string
            - 'null'
        invoices_by_post:
          type: boolean
          default: false
        invoices_by_email:
          type: boolean
          default: false
        business_field:
          anyOf:
            - $ref: '#/components/schemas/BusinessFieldData'
            - type: 'null'
        company_size:
          anyOf:
            - $ref: '#/components/schemas/TagData'
            - type: 'null'
        company_revenue:
          anyOf:
            - $ref: '#/components/schemas/TagData'
            - type: 'null'
        person_attention_to:
          type:
            - string
            - 'null'
        address_invoice_title:
          type:
            - string
            - 'null'
        address_invoice_street:
          type:
            - string
            - 'null'
        address_invoice_house:
          type:
            - string
            - 'null'
        address_invoice_street2:
          type:
            - string
            - 'null'
        address_invoice_zip:
          type:
            - string
            - 'null'
        address_invoice_state:
          type:
            - string
            - 'null'
        address_invoice_town:
          type:
            - string
            - 'null'
        address_invoice_country:
          anyOf:
            - $ref: '#/components/schemas/CountryData'
            - type: 'null'
        address_invoice_is_delivery:
          type: boolean
        delivery_person_attention_to:
          type:
            - string
            - 'null'
        address_delivery_title:
          type:
            - string
            - 'null'
        address_delivery_street:
          type:
            - string
            - 'null'
        address_delivery_house:
          type:
            - string
            - 'null'
        address_delivery_street2:
          type:
            - string
            - 'null'
        address_delivery_zip:
          type:
            - string
            - 'null'
        address_delivery_state:
          type:
            - string
            - 'null'
        address_delivery_town:
          type:
            - string
            - 'null'
        address_delivery_country:
          anyOf:
            - $ref: '#/components/schemas/CountryData'
            - type: 'null'
        client:
          anyOf:
            - $ref: '#/components/schemas/ClientData'
            - type: 'null'
        tags:
          type: array
          items:
            $ref: '#/components/schemas/TagData'
        contacts:
          type: array
          items:
            $ref: '#/components/schemas/ContactData'
        custom_fields:
          type: object
          description: >-
            The key is the field name for your custom field, value type depends
            on the field type
          examples:
            - '[''custom_field_1'' => ''value'', ''custom_field_2'' => true]'
          additionalProperties:
            anyOf:
              - type: string
              - type: boolean
              - type: integer
              - type: 'null'
        created_at:
          type: string
          format: date-time
        updated_at:
          type:
            - string
            - 'null'
          format: date-time
        deleted_at:
          type:
            - string
            - 'null'
          format: date-time
        contact_company:
          description: >-
            Added included via relationship (contact -> companies or company ->
            contacts)
          $ref: '#/components/schemas/ContactCompanyPivotData'
      required:
        - id
        - external_id
        - external_origin
        - vendor_identifier
        - company_name
        - locale
        - tax_uid
        - taxation_enabled
        - iban
        - bic
        - email
        - email_general
        - phone
        - fax
        - homepage
        - invoices_by_post
        - invoices_by_email
        - business_field
        - company_size
        - company_revenue
        - person_attention_to
        - address_invoice_title
        - address_invoice_street
        - address_invoice_house
        - address_invoice_street2
        - address_invoice_zip
        - address_invoice_state
        - address_invoice_town
        - address_invoice_country
        - address_invoice_is_delivery
        - delivery_person_attention_to
        - address_delivery_title
        - address_delivery_street
        - address_delivery_house
        - address_delivery_street2
        - address_delivery_zip
        - address_delivery_state
        - address_delivery_town
        - address_delivery_country
        - client
        - custom_fields
        - created_at
        - updated_at
        - deleted_at
      title: CompanyData
    ContactCompanyPivotData:
      type: object
      properties:
        position:
          type: string
      required:
        - position
      title: ContactCompanyPivotData
    ContactData:
      type: object
      properties:
        id:
          type: string
        external_id:
          type:
            - string
            - 'null'
          description: >-
            Can be used to add an identifier to the client from an external
            system, must be unique
        external_origin:
          type:
            - string
            - 'null'
          description: If originated from external system origin is added
        gender:
          type:
            - string
            - 'null'
        first_name:
          type:
            - string
            - 'null'
        last_name:
          type:
            - string
            - 'null'
        title:
          type:
            - string
            - 'null'
        title_suffix:
          type:
            - string
            - 'null'
        position:
          type:
            - string
            - 'null'
        locale:
          type:
            - string
            - 'null'
        birthday:
          type:
            - string
            - 'null'
          format: date
        fax:
          type:
            - string
            - 'null'
        telephone:
          type:
            - string
            - 'null'
        telephone_private:
          type:
            - string
            - 'null'
        mobile:
          type:
            - string
            - 'null'
        mobile_private:
          type:
            - string
            - 'null'
        email:
          type:
            - string
            - 'null'
          format: email
        email_private:
          type:
            - string
            - 'null'
          format: email
        address_street:
          type:
            - string
            - 'null'
        address_house:
          type:
            - string
            - 'null'
        address_street2:
          type:
            - string
            - 'null'
        address_zip:
          type:
            - string
            - 'null'
        address_state:
          type:
            - string
            - 'null'
        address_town:
          type:
            - string
            - 'null'
        address_country:
          anyOf:
            - $ref: '#/components/schemas/CountryData'
            - type: 'null'
        owner:
          anyOf:
            - $ref: '#/components/schemas/UserData'
            - type: 'null'
        client:
          anyOf:
            - $ref: '#/components/schemas/ClientData'
            - type: 'null'
        companies:
          type: array
          items:
            $ref: '#/components/schemas/CompanyData'
        custom_fields:
          type: object
          description: >-
            The key is the field name for your custom field, value type depends
            on the field type
          examples:
            - '[''custom_field_1'' => ''value'', ''custom_field_2'' => true]'
          additionalProperties:
            anyOf:
              - type: string
              - type: boolean
              - type: integer
              - type: 'null'
        created_at:
          type: string
          format: date-time
        updated_at:
          type:
            - string
            - 'null'
          format: date-time
        deleted_at:
          type:
            - string
            - 'null'
          format: date-time
        contact_company:
          description: >-
            Added included via relationship (contact -> companies or company ->
            contacts)
          $ref: '#/components/schemas/ContactCompanyPivotData'
      required:
        - id
        - external_id
        - external_origin
        - gender
        - first_name
        - last_name
        - title
        - title_suffix
        - position
        - locale
        - birthday
        - fax
        - telephone
        - telephone_private
        - mobile
        - mobile_private
        - email
        - email_private
        - address_street
        - address_house
        - address_street2
        - address_zip
        - address_state
        - address_town
        - address_country
        - owner
        - client
        - custom_fields
        - created_at
        - updated_at
        - deleted_at
      title: ContactData
    CountryData:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        code:
          type: string
          format: ISO 3166-1 alpha-2
      required:
        - id
        - name
        - code
      title: CountryData
    CustomFieldData:
      type: object
      properties:
        id:
          type: string
        title:
          type: string
        field_name:
          type: string
          description: The field name/slug defined for your custom field
        type:
          $ref: '#/components/schemas/CustomFieldType'
        entity_type:
          $ref: '#/components/schemas/CustomFieldEntityType'
        default_value:
          description: Depending on the field type, this can be a string, int, bool or null
          anyOf:
            - type: string
            - type: integer
            - type: boolean
            - type: 'null'
        is_filterable:
          type: boolean
          description: If true, this field can be used for filtering in the UI
        created_at:
          type: string
          format: date-time
        deleted_at:
          type:
            - string
            - 'null'
          format: date-time
      required:
        - id
        - title
        - field_name
        - type
        - entity_type
        - default_value
        - is_filterable
        - created_at
        - deleted_at
      title: CustomFieldData
    CustomFieldEntityType:
      type: string
      enum:
        - user
        - contact
        - company
      title: CustomFieldEntityType
    CustomFieldType:
      type: string
      enum:
        - input
        - number
        - checkbox
        - select
      title: CustomFieldType
    DiscountData:
      type: object
      properties:
        id:
          type: string
        title:
          type: string
        discount_factor:
          type:
            - number
            - 'null'
          description: Discount in percent
        discount_absolute:
          type:
            - number
            - 'null'
          description: Is not calculated with invoices partial_factor in mind
        from_parent:
          type: boolean
          description: If true, the discount was set in invoice master
        is_payment_discount:
          type: boolean
          description: If true this discount was granted due to payment discount rules
        order:
          type: integer
          description: The order how discounts are applied
      required:
        - id
        - title
        - discount_factor
        - discount_absolute
        - from_parent
        - is_payment_discount
        - order
      title: DiscountData
    EffortAdminCategoryData:
      type: object
      properties:
        id:
          type: string
        title:
          type: string
      required:
        - id
        - title
      title: EffortAdminCategoryData
    EffortData:
      type: object
      properties:
        id:
          type: string
        user:
          $ref: '#/components/schemas/UserData'
        comments:
          type: string
        type:
          type: string
        date:
          type: string
          format: date
        hours:
          type: number
        effort_type:
          anyOf:
            - $ref: '#/components/schemas/EffortTypeData'
            - type: 'null'
        task:
          anyOf:
            - $ref: '#/components/schemas/TaskData'
            - type: 'null'
        project:
          anyOf:
            - $ref: '#/components/schemas/ProjectData'
            - type: 'null'
        epic:
          anyOf:
            - $ref: '#/components/schemas/EpicData'
            - type: 'null'
        phase:
          anyOf:
            - $ref: '#/components/schemas/PhaseData'
            - type: 'null'
        milestone:
          anyOf:
            - $ref: '#/components/schemas/MilestoneData'
            - type: 'null'
        admin_category:
          anyOf:
            - $ref: '#/components/schemas/EffortAdminCategoryData'
            - type: 'null'
      required:
        - id
        - user
        - comments
        - type
        - date
        - hours
        - effort_type
        - task
        - project
        - epic
        - phase
        - milestone
        - admin_category
      title: EffortData
    EffortTypeData:
      type: object
      properties:
        id:
          type: string
        title:
          type: string
      required:
        - id
        - title
      title: EffortTypeData
    EpicData:
      type: object
      properties:
        id:
          type: string
        title:
          type: string
        po_number:
          type:
            - string
            - 'null'
        computed_fields:
          type: object
          additionalProperties:
            type: number
      required:
        - id
        - title
        - po_number
      title: EpicData
    ExternalCostData:
      type: object
      properties:
        id:
          type: string
        title:
          type: string
        type:
          type: string
        indent:
          type: integer
        order:
          type: integer
        is_credit:
          type: boolean
          description: if `true` this cost is a credit
        is_optional:
          type: boolean
        price:
          type: number
        amount:
          type: number
        total:
          type: number
        supplier:
          anyOf:
            - $ref: '#/components/schemas/SupplierData'
            - type: 'null'
        client:
          anyOf:
            - $ref: '#/components/schemas/ClientData'
            - type: 'null'
        project:
          anyOf:
            - $ref: '#/components/schemas/ProjectData'
            - type: 'null'
        status:
          type:
            - string
            - 'null'
        payment_partial_type:
          $ref: '#/components/schemas/OfferUnitIntervalType'
        payment_partial_interval:
          type:
            - integer
            - 'null'
          description: |-
            Interval if payment partial type is `monthly` or `yearly
            | Type | Interval | Description |
            | ---- | -------- | ----------- |
            | `once` | `any` | Once per offer |
            | `monthly` | `1` | Every month in performance range |
            | `monthly` | `3` | Every 3 months in performance range |
            | `monthly` | `6` | Every 6 monthsin performance range  |
            | `yearly` | `1` | Every year in performance range  |
            | `yearly` | `3` | Every 3 years in performance range |
            | `yearly` | `6` | Every 6 years in performance range |
        created_at:
          type: string
          format: date-time
        updated_at:
          type:
            - string
            - 'null'
          format: date-time
      required:
        - id
        - title
        - type
        - indent
        - order
        - is_credit
        - is_optional
        - price
        - amount
        - total
        - supplier
        - client
        - project
        - status
        - payment_partial_type
        - payment_partial_interval
        - created_at
        - updated_at
      title: ExternalCostData
    FileData:
      type: object
      properties:
        id:
          type: string
        file_name:
          type: string
        mime_type:
          type: string
        size:
          type: integer
          description: File size in bytes
        entity_id:
          type: string
          description: ID of the entity that the file belongs to
        entity_type:
          type: string
          description: Type of the entity that the file belongs to
        created_at:
          type: string
      required:
        - id
        - file_name
        - mime_type
        - size
        - entity_id
        - entity_type
        - created_at
      title: FileData
    IntegrationData:
      type: object
      properties:
        slug:
          type: string
        granted_scopes:
          type: array
          items:
            type: string
      required:
        - slug
        - granted_scopes
      title: IntegrationData
    MetricData:
      type: object
      properties:
        id:
          type: string
        title:
          type: string
        title_plural:
          type: string
      required:
        - id
        - title
        - title_plural
      title: MetricData
    MilestoneData:
      type: object
      properties:
        id:
          type: string
        title:
          type: string
        po_number:
          type:
            - string
            - 'null'
        group:
          anyOf:
            - $ref: '#/components/schemas/PhaseGroupData'
            - type: 'null'
        dependency_phase_id:
          type:
            - string
            - 'null'
        dependency_milestone_id:
          type:
            - string
            - 'null'
        date:
          type: string
          format: date
        created_at:
          type:
            - string
            - 'null'
          format: date-time
        computed_fields:
          type: object
          additionalProperties:
            type: number
      required:
        - id
        - title
        - po_number
        - group
        - dependency_phase_id
        - dependency_milestone_id
        - date
        - created_at
      title: MilestoneData
    OfferData:
      type: object
      properties:
        id:
          type: string
        offer_number:
          type:
            - string
            - 'null'
        title:
          type: string
        status:
          $ref: '#/components/schemas/OfferStatus'
        approvals_needed:
          type:
            - integer
            - 'null'
        is_direct_approved:
          type:
            - boolean
            - 'null'
          description: >-
            Offer skipped internal approval process - can also be true if offer
            is still `open`, due to reopening
        date_of_offer:
          type: string
          format: date-time
        date_of_expiry:
          type: string
          format: date-time
        performance_range_start:
          type: string
          format: date-time
        performance_range_end:
          type: string
          format: date-time
        locale:
          type: string
        currency:
          type: string
        address:
          type: string
        address_changed:
          type: boolean
          description: If `true` the user manually overwrote the companies address
        company:
          anyOf:
            - $ref: '#/components/schemas/CompanyData'
            - type: 'null'
        editor:
          anyOf:
            - $ref: '#/components/schemas/UserData'
            - type: 'null'
        client:
          $ref: '#/components/schemas/ClientData'
        project:
          anyOf:
            - $ref: '#/components/schemas/ProjectData'
            - type: 'null'
        taxation_enabled:
          type: boolean
          description: Can be used to indicate reverse charge ie
        sum_net:
          type: number
        sum_tax:
          type: number
        sum_gross:
          type: number
        sum_external_costs:
          type: number
        line_items:
          type: array
          items:
            $ref: '#/components/schemas/OfferLineItemData'
        external_costs:
          type: array
          items:
            $ref: '#/components/schemas/ExternalCostData'
        created_at:
          type: string
          format: date-time
        updated_at:
          type:
            - string
            - 'null'
          format: date-time
        deleted_at:
          type:
            - string
            - 'null'
          format: date-time
        computed_fields:
          type: object
          additionalProperties:
            type: number
      required:
        - id
        - offer_number
        - title
        - status
        - approvals_needed
        - is_direct_approved
        - date_of_offer
        - date_of_expiry
        - performance_range_start
        - performance_range_end
        - locale
        - currency
        - address
        - address_changed
        - company
        - editor
        - client
        - project
        - taxation_enabled
        - sum_net
        - sum_tax
        - sum_gross
        - sum_external_costs
        - line_items
        - external_costs
        - created_at
        - updated_at
        - deleted_at
      title: OfferData
    OfferLineItemData:
      type: object
      properties:
        id:
          type: string
        title:
          type: string
        type:
          $ref: '#/components/schemas/AccountingLineItemType'
        indent:
          type: integer
        order:
          type: integer
        is_optional:
          type: boolean
        price:
          type: number
        amount:
          type: number
        total_net_base:
          type: number
          description: |-
            Excluding all discounts
            <br/>Does not reflect total value over performance range
        total_net:
          type: number
          description: |-
            Including unit discount (not offer discounts)
            <br/>Does not reflect total value over performance range
        total_gross_base:
          type: number
          description: |-
            Excluding all discounts
            <br/>Does not reflect total value over performance range
        tax_factor:
          type: number
        total_gross:
          type: number
          description: |-
            Including unit discount (not offer discounts)
            <br/>Does not reflect total value over performance range
        metric:
          $ref: '#/components/schemas/MetricData'
        project:
          anyOf:
            - $ref: '#/components/schemas/ProjectData'
            - type: 'null'
        exclude_from_discount:
          type: boolean
          description: If true, the unit will be excluded from offer-wide discounts
          default: false
        discount_factor:
          type:
            - number
            - 'null'
        discount_absolute:
          type:
            - number
            - 'null'
        discount_bound:
          type: boolean
          description: If true, the amount will multiply discount absolute
          default: false
        purchase_price:
          type: number
          default: 0
        purchase_amount:
          type: number
          default: 1
        purchase_total:
          type: number
          default: 0
        purchase_price_bound:
          type: boolean
          description: If true, `purchase_amount` will be in sync with `amount`
          default: false
        description:
          type: string
        payment_partial_type:
          $ref: '#/components/schemas/OfferUnitIntervalType'
        payment_partial_interval:
          type:
            - integer
            - 'null'
          description: |-
            Interval if payment partial type is `monthly` or `yearly
            | Type | Interval | Description |
            | ---- | -------- | ----------- |
            | `once` | `any` | Once per offer |
            | `monthly` | `1` | Every month in performance range |
            | `monthly` | `3` | Every 3 months in performance range |
            | `monthly` | `6` | Every 6 monthsin performance range  |
            | `yearly` | `1` | Every year in performance range  |
            | `yearly` | `3` | Every 3 years in performance range |
            | `yearly` | `6` | Every 6 years in performance range |
      required:
        - id
        - title
        - type
        - indent
        - order
        - is_optional
        - price
        - amount
        - total_net_base
        - total_net
        - total_gross_base
        - tax_factor
        - total_gross
        - metric
        - project
        - exclude_from_discount
        - discount_factor
        - discount_absolute
        - discount_bound
        - purchase_price
        - purchase_amount
        - purchase_total
        - purchase_price_bound
        - description
        - payment_partial_type
        - payment_partial_interval
      title: OfferLineItemData
    OfferStatus:
      type: string
      description: |-
        | |
        |---|
        | `open` <br/> Offer in draft |
        | `approval_pending` <br/> Offer was submitted for internal approval |
        | `approval_approved` <br/> Offer was internally approved |
        | `transformed` <br/> Customer approved offer |
        | `cancelled` <br/> Customer declined offer |
      enum:
        - open
        - approval_pending
        - approval_approved
        - transformed
        - cancelled
      title: OfferStatus
    OfferUnitIntervalType:
      type: string
      enum:
        - once
        - monthly
        - yearly
      title: OfferUnitIntervalType
    OutgoingInvoiceData:
      type: object
      properties:
        id:
          type: string
        external_id:
          type:
            - string
            - 'null'
        external_origin:
          type:
            - string
            - 'null'
        master_invoice_id:
          type:
            - string
            - 'null'
          format: OutgoingInvoiceMasterData
          description: If invoice is part of a master invoice plan
        invoice_number:
          type:
            - string
            - 'null'
        title:
          type: string
        status:
          $ref: '#/components/schemas/OutgoingInvoiceStatus'
        payment_status:
          $ref: '#/components/schemas/OutgoingInvoicePaymentStatus'
        is_credit:
          type: boolean
          default: false
        date_of_invoice:
          type: string
          format: date-time
        payment_due_date:
          type: string
          format: date-time
        payment_due_date_org:
          type: string
          format: date-time
          description: Is the payment due date originally set
        performance_range_start:
          type:
            - string
            - 'null'
          format: date-time
        performance_range_end:
          type:
            - string
            - 'null'
          format: date-time
        po_number:
          type:
            - string
            - 'null'
        reference:
          type:
            - string
            - 'null'
        locale:
          type: string
        currency:
          type: string
        address:
          type: string
        address_changed:
          type: boolean
          description: If `true` the user manually overwrote the companies address
        company:
          anyOf:
            - $ref: '#/components/schemas/CompanyData'
            - type: 'null'
        editor:
          anyOf:
            - $ref: '#/components/schemas/UserData'
            - type: 'null'
        client:
          $ref: '#/components/schemas/ClientData'
        project:
          anyOf:
            - $ref: '#/components/schemas/ProjectData'
            - type: 'null'
        taxation_enabled:
          type: boolean
          description: Can be used to indicate reverse charge ie
        sum_net:
          type: number
        sum_tax:
          type: number
        sum_gross:
          type: number
        sum_external_costs:
          type: number
        partial_indent:
          type:
            - string
            - 'null'
          description: |-
            Indicator for partial invoices
            `<currentInvoice>/<numberOfInvoices>`
          examples:
            - 1/2
        partial_factor:
          type:
            - number
            - 'null'
          description: Factor in percentage for partial invoices
        payment_discount_due_date:
          type:
            - string
            - 'null'
          format: date-time
        payment_discount:
          type:
            - number
            - 'null'
          description: Factor in percentage
        discounts:
          type: array
          items:
            $ref: '#/components/schemas/DiscountData'
        line_items:
          type: array
          items:
            $ref: '#/components/schemas/OutgoingInvoiceLineItemData'
        external_costs:
          type: array
          description: >-
            For partial invoices external costs will be empty - these are part
            of the invoice master plan
          items:
            $ref: '#/components/schemas/ExternalCostData'
        created_at:
          type: string
          format: date-time
        updated_at:
          type:
            - string
            - 'null'
          format: date-time
        deleted_at:
          type:
            - string
            - 'null'
          format: date-time
        computed_fields:
          type: object
          additionalProperties:
            type: number
      required:
        - id
        - external_id
        - external_origin
        - master_invoice_id
        - invoice_number
        - title
        - status
        - payment_status
        - is_credit
        - date_of_invoice
        - payment_due_date
        - payment_due_date_org
        - performance_range_start
        - performance_range_end
        - po_number
        - reference
        - locale
        - currency
        - address
        - address_changed
        - company
        - editor
        - client
        - project
        - taxation_enabled
        - sum_net
        - sum_tax
        - sum_gross
        - sum_external_costs
        - partial_indent
        - partial_factor
        - payment_discount_due_date
        - payment_discount
        - discounts
        - line_items
        - external_costs
        - created_at
        - updated_at
        - deleted_at
      title: OutgoingInvoiceData
    OutgoingInvoiceLineItemData:
      type: object
      properties:
        id:
          type: string
        title:
          type: string
        type:
          $ref: '#/components/schemas/AccountingLineItemType'
        indent:
          type: integer
        order:
          type: integer
        price:
          type: number
          description: |-
            Is always the full price of the unit (without `partial_factor`)
            See `partial_factor` if element is part of an partial invoice
        amount:
          type: number
        total_net_base:
          type: number
          description: |-
            Excluding `partial_factor` and all discounts
            <br/>See `partial_factor` if element is part of an partial invoice
        total_net_without_discount:
          type: number
          description: |-
            Including `partial_factor`, excluding all discounts
            <br/>See `partial_factor` if element is part of an partial invoice
        total_net:
          type: number
          description: |-
            Including unit discount (not invoice discounts) and `partial_factor`
            <br/>See `partial_factor` if element is part of an partial invoice
        total_gross_base:
          type: number
          description: |-
            Excluding `partial_factor` and all discounts
            <br/>See `partial_factor` if element is part of an partial invoice
        total_gross_without_discount:
          type: number
          description: |-
            Including `partial_factor`, excluding all discounts
            <br/>See `partial_factor` if element is part of an partial invoice
        total_gross:
          type: number
          description: |-
            Including unit discount (not invoice discounts) and `partial_factor`
            <br/>See `partial_factor` if element is part of an partial invoice
        tax_factor:
          type: number
        metric:
          $ref: '#/components/schemas/MetricData'
        project:
          anyOf:
            - $ref: '#/components/schemas/ProjectData'
            - type: 'null'
        partial_factor:
          type:
            - integer
            - 'null'
          description: >-
            Value in percent. Describes the part of the unit that is included in
            the invoice
        exclude_from_discount:
          type: boolean
          description: If true, the unit will be excluded from offer-wide discounts
          default: false
        discount_factor:
          type:
            - number
            - 'null'
        discount_absolute:
          type:
            - number
            - 'null'
        discount_bound:
          type: boolean
          description: If true, the amount will multiply discount absolute
          default: false
        purchase_price:
          type: number
          default: 0
        purchase_amount:
          type: number
          default: 1
        purchase_total_base:
          type: number
          description: |-
            Excluding `partial_factor` and all discounts
            <br/>See `partial_factor` if element is part of an partial invoice
          default: 0
        purchase_total:
          type: number
          description: |-
            Including `partial_factor`, excluding all discounts
            <br/>See `partial_factor` if element is part of an partial invoice
          default: 0
        purchase_price_bound:
          type: boolean
          description: If true, `purchase_amount` will be in sync with `amount`
          default: false
        description:
          type: string
        payment_partial_type:
          $ref: '#/components/schemas/OfferUnitIntervalType'
        payment_partial_interval:
          type:
            - integer
            - 'null'
          description: |-
            Interval if payment partial type is `monthly` or `yearly
            | Type | Interval | Description |
            | ---- | -------- | ----------- |
            | `once` | `any` | Once per offer |
            | `monthly` | `1` | Every month in performance range |
            | `monthly` | `3` | Every 3 months in performance range |
            | `monthly` | `6` | Every 6 monthsin performance range  |
            | `yearly` | `1` | Every year in performance range  |
            | `yearly` | `3` | Every 3 years in performance range |
            | `yearly` | `6` | Every 6 years in performance range |
      required:
        - id
        - title
        - type
        - indent
        - order
        - price
        - amount
        - total_net_base
        - total_net_without_discount
        - total_net
        - total_gross_base
        - total_gross_without_discount
        - total_gross
        - tax_factor
        - metric
        - project
        - partial_factor
        - exclude_from_discount
        - discount_factor
        - discount_absolute
        - discount_bound
        - purchase_price
        - purchase_amount
        - purchase_total_base
        - purchase_total
        - purchase_price_bound
        - description
        - payment_partial_type
        - payment_partial_interval
      title: OutgoingInvoiceLineItemData
    OutgoingInvoiceMasterData:
      type: object
      properties:
        id:
          type: string
        title:
          type: string
        type:
          $ref: '#/components/schemas/OutgoingInvoiceMasterType'
        performance_range_start:
          type:
            - string
            - 'null'
          format: date-time
        performance_range_end:
          type:
            - string
            - 'null'
          format: date-time
        locale:
          type: string
        currency:
          type: string
        address:
          type: string
        address_changed:
          type: boolean
          description: If `true` the user manually overwrote the companies address
        company:
          anyOf:
            - $ref: '#/components/schemas/CompanyData'
            - type: 'null'
        editor:
          anyOf:
            - $ref: '#/components/schemas/UserData'
            - type: 'null'
        client:
          anyOf:
            - $ref: '#/components/schemas/ClientData'
            - type: 'null'
        project:
          anyOf:
            - $ref: '#/components/schemas/ProjectData'
            - type: 'null'
        taxation_enabled:
          type: boolean
          description: Can be used to indicate reverse charge ie
        sum_net:
          type: number
        sum_tax:
          type: number
        sum_gross:
          type: number
        sum_external_costs:
          type: number
        payment_discount:
          type:
            - number
            - 'null'
          description: Factor in percentage
        discounts:
          type: array
          items:
            $ref: '#/components/schemas/DiscountData'
        line_items:
          type: array
          items:
            $ref: '#/components/schemas/OutgoingInvoiceLineItemData'
        external_costs:
          type: array
          description: >-
            For partial invoices external costs will be empty - these are part
            of the invoice master plan
          items:
            $ref: '#/components/schemas/ExternalCostData'
        created_at:
          type: string
          format: date-time
        updated_at:
          type:
            - string
            - 'null'
          format: date-time
        deleted_at:
          type:
            - string
            - 'null'
          format: date-time
        computed_fields:
          type: object
          additionalProperties:
            type: number
      required:
        - id
        - title
        - type
        - performance_range_start
        - performance_range_end
        - locale
        - currency
        - address
        - address_changed
        - company
        - editor
        - client
        - project
        - taxation_enabled
        - sum_net
        - sum_tax
        - sum_gross
        - sum_external_costs
        - payment_discount
        - discounts
        - line_items
        - external_costs
        - created_at
        - updated_at
        - deleted_at
      title: OutgoingInvoiceMasterData
    OutgoingInvoiceMasterType:
      type: string
      description: |-
        | |
        |---|
        | `once` <br/> If type is once, then the master is a partial plan |
        | `recurring1` <br/> Recurring every month |
        | `recurring3` <br/> Recurring every 3 months |
        | `recurring6` <br/> Recurring every 6 months |
        | `recurring12` <br/> Recurring every 12 months |
      enum:
        - once
        - recurring1
        - recurring3
        - recurring6
        - recurring12
      title: OutgoingInvoiceMasterType
    OutgoingInvoicePaymentBookingData:
      type: object
      properties:
        id:
          type: string
        type:
          type: string
        payment_type:
          type: string
        reference:
          type: string
        value:
          type: number
        outgoing_invoice_id:
          type:
            - string
            - 'null'
        reference_outgoing_invoice_id:
          type:
            - string
            - 'null'
        updated_at:
          type:
            - string
            - 'null'
          format: date-time
        created_at:
          type: string
          format: date-time
        deleted_at:
          type:
            - string
            - 'null'
          format: date-time
      required:
        - id
        - type
        - payment_type
        - reference
        - value
        - outgoing_invoice_id
        - reference_outgoing_invoice_id
        - updated_at
        - created_at
        - deleted_at
      title: OutgoingInvoicePaymentBookingData
    OutgoingInvoicePaymentStatus:
      type: string
      enum:
        - open
        - partly_paid
        - paid
        - cancelled
      title: OutgoingInvoicePaymentStatus
    OutgoingInvoiceStatus:
      type: string
      description: |-
        | |
        |---|
        | `estimate` <br/> Invoice is meant as estimate |
        | `open` <br/> Invoice in draft |
        | `bookable` <br/> Invoice is ready to be booked |
        | `booked` <br/> Invoice was booked |
      enum:
        - estimate
        - open
        - bookable
        - booked
      title: OutgoingInvoiceStatus
    PaymentAccountData:
      type: object
      properties:
        id:
          type: string
        is_default:
          type: boolean
        title:
          type: string
        organization:
          type:
            - string
            - 'null'
        identifier:
          type:
            - string
            - 'null'
        type:
          $ref: '#/components/schemas/PaymentAccountType'
        owner:
          anyOf:
            - $ref: '#/components/schemas/UserData'
            - type: 'null'
        updated_at:
          type:
            - string
            - 'null'
          format: date-time
        created_at:
          type: string
          format: date-time
        deleted_at:
          type:
            - string
            - 'null'
          format: date-time
      required:
        - id
        - is_default
        - title
        - organization
        - identifier
        - type
        - owner
        - updated_at
        - created_at
        - deleted_at
      title: PaymentAccountData
    PaymentAccountType:
      type: string
      enum:
        - account
        - employee_expenses
      title: PaymentAccountType
    PaymentBookingData:
      type: object
      properties:
        id:
          type: string
        payment_type:
          type: string
        reference:
          type: string
        value:
          type: number
        outgoing_invoice_id:
          type:
            - string
            - 'null'
        updated_at:
          type:
            - string
            - 'null'
          format: date-time
        created_at:
          type: string
          format: date-time
        deleted_at:
          type:
            - string
            - 'null'
          format: date-time
      required:
        - id
        - payment_type
        - reference
        - value
        - outgoing_invoice_id
        - updated_at
        - created_at
        - deleted_at
      title: PaymentBookingData
    PaymentData:
      type: object
      properties:
        id:
          type: string
        type:
          type: string
        date_of_payment:
          type:
            - string
            - 'null'
          format: date
        reference:
          type: string
        iban:
          type:
            - string
            - 'null'
        bic:
          type:
            - string
            - 'null'
        value:
          type: number
        payment_account:
          $ref: '#/components/schemas/PaymentAccountData'
        bookings:
          type: array
          items:
            $ref: '#/components/schemas/PaymentBookingData'
        updated_at:
          type:
            - string
            - 'null'
          format: date-time
        created_at:
          type: string
          format: date-time
        deleted_at:
          type:
            - string
            - 'null'
          format: date-time
      required:
        - id
        - type
        - date_of_payment
        - reference
        - iban
        - bic
        - value
        - payment_account
        - bookings
        - updated_at
        - created_at
        - deleted_at
      title: PaymentData
    PhaseData:
      type: object
      properties:
        id:
          type: string
        title:
          type: string
        po_number:
          type:
            - string
            - 'null'
        group:
          anyOf:
            - $ref: '#/components/schemas/PhaseGroupData'
            - type: 'null'
        type:
          anyOf:
            - $ref: '#/components/schemas/PhaseTypeData'
            - type: 'null'
        dependency_phase_id:
          type:
            - string
            - 'null'
        dependency_milestone_id:
          type:
            - string
            - 'null'
        start_date:
          type:
            - string
            - 'null'
          format: date
        end_date:
          type:
            - string
            - 'null'
          format: date
        created_at:
          type:
            - string
            - 'null'
          format: date-time
        computed_fields:
          type: object
          additionalProperties:
            type: number
      required:
        - id
        - title
        - po_number
        - group
        - type
        - dependency_phase_id
        - dependency_milestone_id
        - start_date
        - end_date
        - created_at
      title: PhaseData
    PhaseGroupData:
      type: object
      properties:
        id:
          type: string
        title:
          type: string
      required:
        - id
        - title
      title: PhaseGroupData
    PhaseTypeData:
      type: object
      properties:
        id:
          type: string
        title:
          type: string
        color:
          type: string
      required:
        - id
        - title
        - color
      title: PhaseTypeData
    ProjectData:
      type: object
      properties:
        id:
          type: string
        external_id:
          type:
            - string
            - 'null'
          description: >-
            Can be used to add an identifier to the project from an external
            system, must be unique
        external_origin:
          type:
            - string
            - 'null'
          description: If originated from external system origin is added
        title:
          type: string
        shortcode:
          type: string
        po_number:
          type:
            - string
            - 'null'
        project_type:
          $ref: '#/components/schemas/ProjectTypeData'
        status:
          type: string
        is_acquisition:
          type: boolean
        is_private:
          type: boolean
        start_date:
          type:
            - string
            - 'null'
          format: date
        end_date:
          type:
            - string
            - 'null'
          format: date
        client:
          $ref: '#/components/schemas/ClientData'
        tags:
          type: array
          items:
            $ref: '#/components/schemas/ProjectTagData'
        custom_fields:
          type: object
          description: >-
            The key is the field name for your custom field, value type depends
            on the field type
          examples:
            - '[''custom_field_1'' => ''value'', ''custom_field_2'' => true]'
          additionalProperties:
            anyOf:
              - type: string
              - type: boolean
              - type: integer
              - type: 'null'
        origin_space:
          anyOf:
            - description: >-
                Shared space which the project is shared from, if `null` project
                is not shared
              $ref: '#/components/schemas/SpaceData'
            - type: 'null'
        team:
          type: array
          description: Project team
          items:
            $ref: '#/components/schemas/TeamMemberData'
        guests:
          type: array
          description: Project guests
          items:
            $ref: '#/components/schemas/TeamMemberData'
        computed_fields:
          type: object
          additionalProperties:
            type: number
      required:
        - id
        - external_id
        - external_origin
        - title
        - shortcode
        - po_number
        - project_type
        - status
        - is_acquisition
        - is_private
        - start_date
        - end_date
        - client
        - custom_fields
        - origin_space
      title: ProjectData
    ProjectTagData:
      type: object
      properties:
        id:
          type: string
        title:
          type: string
      required:
        - id
        - title
      title: ProjectTagData
    ProjectTypeData:
      type: object
      properties:
        id:
          type: string
        title:
          type: string
        shortcode:
          type: string
        color:
          type: string
        order:
          type: integer
        is_default:
          type: boolean
      required:
        - id
        - title
        - shortcode
        - color
        - order
        - is_default
      title: ProjectTypeData
    SpaceData:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
      required:
        - id
        - name
      title: SpaceData
    SupplierData:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
      required:
        - id
        - name
      title: SupplierData
    TagData:
      type: object
      properties:
        id:
          type: string
        title:
          type: string
      required:
        - id
        - title
      title: TagData
    TaskData:
      type: object
      properties:
        id:
          type: string
        project_id:
          type: string
        client_id:
          type: string
        parent_task_id:
          type: string
        external_id:
          type:
            - string
            - 'null'
        external_origin:
          type:
            - string
            - 'null'
          description: If originated from external system origin is added
        uri:
          type: string
        title:
          type: string
        description:
          type:
            - string
            - 'null'
        status:
          $ref: '#/components/schemas/TaskStatus'
        type:
          type: string
        estimated_hours:
          type:
            - number
            - 'null'
        is_onhold:
          type: boolean
        is_public:
          type: boolean
          description: >-
            If false, the task is only visible to the project team - not guest
            users
        due_date:
          type:
            - string
            - 'null'
          format: date
        due_date_settings:
          $ref: '#/components/schemas/TaskDueDateSettingsData'
        assignee:
          anyOf:
            - $ref: '#/components/schemas/UserData'
            - type: 'null'
        priorityOption:
          anyOf:
            - $ref: '#/components/schemas/TaskPriorityOptionData'
            - type: 'null'
        phase:
          anyOf:
            - $ref: '#/components/schemas/PhaseData'
            - type: 'null'
        milestone:
          anyOf:
            - $ref: '#/components/schemas/MilestoneData'
            - type: 'null'
        epic:
          anyOf:
            - $ref: '#/components/schemas/EpicData'
            - type: 'null'
        parent_task:
          anyOf:
            - $ref: '#/components/schemas/TaskData'
            - type: 'null'
        attachements:
          type: array
          default: []
          items:
            $ref: '#/components/schemas/FileData'
        watchers:
          type: array
          items:
            $ref: '#/components/schemas/UserData'
        sub_tasks:
          type: array
          items:
            $ref: '#/components/schemas/TaskData'
        completed_at:
          type:
            - string
            - 'null'
          format: date-time
        closed_at:
          type:
            - string
            - 'null'
          format: date-time
        updated_at:
          type:
            - string
            - 'null'
          format: date-time
        created_at:
          type:
            - string
            - 'null'
          format: date-time
        list_sorting:
          type: integer
      required:
        - id
        - project_id
        - client_id
        - parent_task_id
        - external_id
        - external_origin
        - uri
        - title
        - description
        - status
        - type
        - estimated_hours
        - is_onhold
        - is_public
        - due_date
        - due_date_settings
        - assignee
        - priorityOption
        - attachements
        - sub_tasks
        - completed_at
        - closed_at
        - updated_at
        - created_at
        - list_sorting
      title: TaskData
    TaskDueDateRecurringType:
      type: string
      enum:
        - daily
        - weekly
        - monthly
      title: TaskDueDateRecurringType
    TaskDueDateSettingsData:
      type: object
      properties:
        is_hard_deadline:
          type: boolean
          default: false
        recurring_type:
          anyOf:
            - $ref: '#/components/schemas/TaskDueDateRecurringType'
            - type: 'null'
        recurring_interval:
          type:
            - integer
            - 'null'
          description: >-
            Integer offset

            if `recurring_type` = `daily` or `NULL` -> offset ignored <br />

            if `recurring_type` = `weekly` -> 1 = every Monday, 2 = every
            Tuesday, etc <br />

            if `recurring_type` = `monthly` -> 1 = every month, 2 = every 2
            months, etc
      required:
        - is_hard_deadline
        - recurring_type
        - recurring_interval
      title: TaskDueDateSettingsData
    TaskPriorityOptionData:
      type: object
      properties:
        id:
          type: string
        label:
          type: string
      required:
        - id
        - label
      title: TaskPriorityOptionData
    TaskStatus:
      type: string
      description: |-
        | |
        |---|
        | `Backlog` <br/>  |
        | `New` <br/> In Todo |
        | `WIP` <br/> In progress |
        | `Completed` <br/>  |
        | `Approved` <br/>  |
        | `Closed` <br/> Task was archived |
      enum:
        - Backlog
        - New
        - WIP
        - Completed
        - Approved
        - Closed
      title: TaskStatus
    TeamMemberData:
      type: object
      properties:
        id:
          type: string
        first_name:
          type: string
        last_name:
          type: string
        email:
          type: string
        type:
          $ref: '#/components/schemas/UserType'
        added_at:
          type: string
          format: date-time
        space:
          $ref: '#/components/schemas/SpaceData'
      required:
        - id
        - first_name
        - last_name
        - email
        - type
        - added_at
        - space
      title: TeamMemberData
    UserData:
      type: object
      properties:
        id:
          type: string
        first_name:
          type: string
        last_name:
          type: string
        email:
          type: string
        type:
          $ref: '#/components/schemas/UserType'
        space:
          $ref: '#/components/schemas/SpaceData'
      required:
        - id
        - first_name
        - last_name
        - email
        - type
        - space
      title: UserData
    UserFullData:
      type: object
      properties:
        id:
          type: string
        external_id:
          type:
            - string
            - 'null'
          description: >-
            Can be used to add an identifier to the client from an external
            system, must be unique
        external_origin:
          type:
            - string
            - 'null'
          description: If originated from external system origin is added
        first_name:
          type: string
        last_name:
          type: string
        title:
          type:
            - string
            - 'null'
        title_suffix:
          type:
            - string
            - 'null'
        email:
          type: string
          format: email
        birthday:
          type:
            - string
            - 'null'
          format: date
        gender:
          type:
            - string
            - 'null'
        position:
          type:
            - string
            - 'null'
        special_roles:
          type:
            - string
            - 'null'
        skills:
          type:
            - string
            - 'null'
        profile:
          type:
            - string
            - 'null'
        language:
          type:
            - string
            - 'null'
          description: UI language
        languages:
          type:
            - string
            - 'null'
          description: Spoken languages
        telephone_office:
          type:
            - string
            - 'null'
          description: Mobile phone (Office)
        phone_extension:
          type:
            - string
            - 'null'
          description: Landline phone (Office)
        telephone:
          type:
            - string
            - 'null'
          description: Mobile phone (Private)
        entry_date:
          type:
            - string
            - 'null'
          format: date
          description: Date of joining the company
        leave_date:
          type:
            - string
            - 'null'
          format: date
          description: >-
            Date of leaving the company - if set in the future, the employee
            will be archived on that date
        type:
          $ref: '#/components/schemas/UserType'
        plan:
          $ref: '#/components/schemas/UserPlan'
        is_owner:
          type: boolean
          description: Is Kanbert space owner
        avatar:
          anyOf:
            - $ref: '#/components/schemas/FileData'
            - type: 'null'
        userGroups:
          type: array
          items:
            $ref: '#/components/schemas/UsergroupData'
        custom_fields:
          type: object
          description: >-
            The key is the field name for your custom field, value type depends
            on the field type
          examples:
            - '[''custom_field_1'' => ''value'', ''custom_field_2'' => true]'
          additionalProperties:
            anyOf:
              - type: string
              - type: boolean
              - type: integer
              - type: 'null'
        created_at:
          type: string
          format: date-time
        deleted_at:
          type:
            - string
            - 'null'
          format: date-time
      required:
        - id
        - external_id
        - external_origin
        - first_name
        - last_name
        - title
        - title_suffix
        - email
        - birthday
        - gender
        - position
        - special_roles
        - skills
        - profile
        - language
        - languages
        - telephone_office
        - phone_extension
        - telephone
        - entry_date
        - leave_date
        - type
        - plan
        - is_owner
        - avatar
        - custom_fields
        - created_at
        - deleted_at
      title: UserFullData
    UserPlan:
      type: string
      enum:
        - basic
        - standard
        - external
        - advanced
        - expert
        - guest
        - tax_advisor
        - integration
        - not_assigned
      title: UserPlan
    UserType:
      type: string
      enum:
        - user
        - guest
        - tax_advisor
        - integration
      title: UserType
    UsergroupData:
      type: object
      properties:
        id:
          type: string
        external_id:
          type:
            - string
            - 'null'
          description: >-
            Can be used to add an identifier to the client from an external
            system, must be unique
        name:
          type: string
        is_team:
          type: boolean
          description: If true, this usergroup is shown as team
        users:
          type: array
          items:
            $ref: '#/components/schemas/UserData'
      required:
        - id
        - external_id
        - name
        - is_team
        - users
      title: UsergroupData
    WebhookCreateData:
      type: object
      properties:
        id:
          type: string
        url:
          type: string
        client_id:
          type:
            - string
            - 'null'
        project_id:
          type:
            - string
            - 'null'
        signature_secret_key:
          type: string
        event:
          $ref: '#/components/schemas/WebhookEvent'
        created_at:
          type: string
          format: date-time
      required:
        - id
        - url
        - client_id
        - project_id
        - signature_secret_key
        - event
        - created_at
      title: WebhookCreateData
    WebhookData:
      type: object
      properties:
        id:
          type: string
        url:
          type: string
        client_id:
          type:
            - string
            - 'null'
        project_id:
          type:
            - string
            - 'null'
        event:
          $ref: '#/components/schemas/WebhookEvent'
        created_at:
          type: string
          format: date-time
      required:
        - id
        - url
        - client_id
        - project_id
        - event
        - created_at
      title: WebhookData
    WebhookEvent:
      type: string
      enum:
        - contact:create
        - contact:update
        - contact:delete
        - company:create
        - company:update
        - company:delete
        - task:create
        - task:update
        - task:delete
        - comment:create
        - comment:update
        - comment:delete
      title: WebhookEvent
  responses:
    AuthenticationException:
      description: Unauthenticated
      content:
        application/json:
          schema:
            type: object
            properties:
              message:
                type: string
                description: Error overview.
            required:
              - message
    ValidationException:
      description: Validation error
      content:
        application/json:
          schema:
            type: object
            properties:
              message:
                type: string
                description: Errors overview.
              errors:
                type: object
                description: A detailed description of each field that failed validation.
                additionalProperties:
                  type: array
                  items:
                    type: string
            required:
              - message
              - errors
    ModelNotFoundException:
      description: Not found
      content:
        application/json:
          schema:
            type: object
            properties:
              message:
                type: string
                description: Error overview.
            required:
              - message
webhooks:
  contact:created:
    post:
      tags:
        - Contacts
      summary: Contact created
      description: '`contact:create` - Fired when a new contact was created'
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                event:
                  type: string
                  description: the event identifier
                  example: contact:create
                resource:
                  type: object
                  properties:
                    type:
                      type: string
                      description: The resource type
                      example: contact
                    id:
                      type: string
                      description: The resource id
                triggered_by:
                  $ref: '#/components/schemas/UserData'
                data:
                  $ref: '#/components/schemas/ContactData'
  contact:update:
    post:
      tags:
        - Contacts
      summary: Contact updated
      description: '`contact:update` - Fired when a contact was updated'
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                event:
                  type: string
                  description: the event identifier
                  example: contact:update
                resource:
                  type: object
                  properties:
                    type:
                      type: string
                      description: The resource type
                      example: contact
                    id:
                      type: string
                      description: The resource id
                triggered_by:
                  $ref: '#/components/schemas/UserData'
                data:
                  $ref: '#/components/schemas/ContactData'
      responses:
        '200':
          description: >-
            Return a 200 within 10 seconds to indicate a that the data was
            received successfully. Otherwise it will try 2 more times.
  contact:deleted:
    post:
      tags:
        - Contacts
      summary: Contact deleted
      description: '`contact:delete` - A contact was deleted'
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                event:
                  type: string
                  description: the event identifier
                  example: contact:delete
                resource:
                  type: object
                  properties:
                    type:
                      type: string
                      description: The resource type
                      example: contact
                    id:
                      type: string
                      description: The resource id
                triggered_by:
                  $ref: '#/components/schemas/UserData'
                data:
                  $ref: '#/components/schemas/ContactData'
      responses:
        '200':
          description: >-
            Return a 200 within 10 seconds to indicate a that the data was
            received successfully. Otherwise it will try 2 more times.
  company:created:
    post:
      tags:
        - Companies
      summary: Company created
      description: '`company:create` - A new company was created'
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                event:
                  type: string
                  description: the event identifier
                  example: company:create
                resource:
                  type: object
                  properties:
                    type:
                      type: string
                      description: The resource type
                      example: company
                    id:
                      type: string
                      description: The resource id
                triggered_by:
                  $ref: '#/components/schemas/UserData'
                data:
                  $ref: '#/components/schemas/CompanyData'
      responses:
        '200':
          description: >-
            Return a 200 within 10 seconds to indicate a that the data was
            received successfully. Otherwise it will try 2 more times.
  company:updated:
    post:
      tags:
        - Companies
      summary: Company updated
      description: '`company:update` A company was updated'
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                event:
                  type: string
                  description: the event identifier
                  example: company:update
                resource:
                  type: object
                  properties:
                    type:
                      type: string
                      description: The resource type
                      example: company
                    id:
                      type: string
                      description: The resource id
                triggered_by:
                  $ref: '#/components/schemas/UserData'
                data:
                  $ref: '#/components/schemas/CompanyData'
      responses:
        '200':
          description: >-
            Return a 200 within 10 seconds to indicate a that the data was
            received successfully. Otherwise it will try 2 more times.
  company:deleted:
    post:
      tags:
        - Companies
      summary: Company deleted
      description: '`company:delete` - A company was deleted'
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                event:
                  type: string
                  description: the event identifier
                  example: company:delete
                resource:
                  type: object
                  properties:
                    type:
                      type: string
                      description: The resource type
                      example: company
                    id:
                      type: string
                      description: The resource id
                triggered_by:
                  $ref: '#/components/schemas/UserData'
                data:
                  $ref: '#/components/schemas/CompanyData'
      responses:
        '200':
          description: >-
            Return a 200 within 10 seconds to indicate a that the data was
            received successfully. Otherwise it will try 2 more times.
  task:created:
    post:
      tags:
        - Tasks
      summary: Task created
      description: '`task:create` - A new task was created'
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                event:
                  type: string
                  description: the event identifier
                  example: task:create
                resource:
                  type: object
                  properties:
                    type:
                      type: string
                      description: The resource type
                      example: task
                    id:
                      type: string
                      description: The resource id
                triggered_by:
                  $ref: '#/components/schemas/UserData'
                data:
                  $ref: '#/components/schemas/TaskData'
      responses:
        '200':
          description: >-
            Return a 200 within 10 seconds to indicate a that the data was
            received successfully. Otherwise it will try 2 more times.
  task:updated:
    post:
      tags:
        - Tasks
      summary: Task updated
      description: '`task:update` A Task was updated'
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                event:
                  type: string
                  description: the event identifier
                  example: task:update
                resource:
                  type: object
                  properties:
                    type:
                      type: string
                      description: The resource type
                      example: task
                    id:
                      type: string
                      description: The resource id
                triggered_by:
                  $ref: '#/components/schemas/UserData'
                data:
                  $ref: '#/components/schemas/TaskData'
      responses:
        '200':
          description: >-
            Return a 200 within 10 seconds to indicate a that the data was
            received successfully. Otherwise it will try 2 more times.
  task:deleted:
    post:
      tags:
        - Tasks
      summary: Task deleted
      description: '`task:delete` - A task was deleted'
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                event:
                  type: string
                  description: the event identifier
                  example: task:delete
                resource:
                  type: object
                  properties:
                    type:
                      type: string
                      description: The resource type
                      example: task
                    id:
                      type: string
                      description: The resource id
                triggered_by:
                  $ref: '#/components/schemas/UserData'
                data:
                  $ref: '#/components/schemas/TaskData'
      responses:
        '200':
          description: >-
            Return a 200 within 10 seconds to indicate a that the data was
            received successfully. Otherwise it will try 2 more times.
  comment:created:
    post:
      tags:
        - Task Comments
      summary: Comment created
      description: '`comment:create` - A new comment was created'
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                event:
                  type: string
                  description: the event identifier
                  example: comment:create
                resource:
                  type: object
                  properties:
                    type:
                      type: string
                      description: The resource type
                      example: comment
                    id:
                      type: string
                      description: The resource id
                triggered_by:
                  $ref: '#/components/schemas/UserData'
                data:
                  $ref: '#/components/schemas/CommentData'
      responses:
        '200':
          description: >-
            Return a 200 within 10 seconds to indicate a that the data was
            received successfully. Otherwise it will try 2 more times.
  comment:updated:
    post:
      tags:
        - Task Comments
      summary: Comment updated
      description: '`comment:update` A Comment was updated'
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                event:
                  type: string
                  description: the event identifier
                  example: comment:update
                resource:
                  type: object
                  properties:
                    type:
                      type: string
                      description: The resource type
                      example: comment
                    id:
                      type: string
                      description: The resource id
                triggered_by:
                  $ref: '#/components/schemas/UserData'
                data:
                  $ref: '#/components/schemas/CommentData'
      responses:
        '200':
          description: >-
            Return a 200 within 10 seconds to indicate a that the data was
            received successfully. Otherwise it will try 2 more times.
  comment:deleted:
    post:
      tags:
        - Task Comments
      summary: Comment deleted
      description: '`comment:delete` - A comment was deleted'
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                event:
                  type: string
                  description: the event identifier
                  example: comment:delete
                resource:
                  type: object
                  properties:
                    type:
                      type: string
                      description: The resource type
                      example: task
                    id:
                      type: string
                      description: The resource id
                triggered_by:
                  $ref: '#/components/schemas/UserData'
                data:
                  $ref: '#/components/schemas/CommentData'
      responses:
        '200':
          description: >-
            Return a 200 within 10 seconds to indicate a that the data was
            received successfully. Otherwise it will try 2 more times.
