openapi: 3.1.0
info:
  title: Kanbert
  version: v1
servers:
  - url: https://api.kanbert.int/api/v1
security:
  - http: []
paths:
  /clients:
    get:
      operationId: clients.index
      summary: Filter all clients
      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 `primaryContact`, `projects`, `originSpace`.
            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 `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
      summary: Create new 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 to the client from an
                    external system, must be unique
                  maxLength: 255
                name:
                  type: string
                  maxLength: 255
                shortcode:
                  type:
                    - string
                    - 'null'
                  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 account manager
              required:
                - name
      responses:
        '200':
          description: '`ClientData`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ClientData'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /clients/{id}:
    get:
      operationId: clients.show
      summary: Show single client
      tags:
        - Clients
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: findBy
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
              - shortcode
            default: id
        - name: include
          in: query
          description: >-
            Available includes are `primaryContact`, `projects`, `originSpace`.
            You can include multiple options by separating them with a comma.
          schema:
            type: string
      responses:
        '200':
          description: '`ClientData`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ClientData'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '404':
          $ref: '#/components/responses/ModelNotFoundException'
        '422':
          $ref: '#/components/responses/ValidationException'
    put:
      operationId: clients.update
      summary: Update client
      tags:
        - Clients
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: findBy
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
              - shortcode
            default: id
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                external_id:
                  type:
                    - string
                    - 'null'
                  maxLength: 255
                name:
                  type: string
                  maxLength: 255
                shortcode:
                  type:
                    - string
                    - 'null'
                  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 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
      summary: Archive client
      tags:
        - Clients
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: findBy
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
              - shortcode
            default: id
      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}/restore:
    put:
      operationId: clients.restore
      summary: Restore client
      tags:
        - Clients
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: findBy
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
              - shortcode
            default: id
      responses:
        '200':
          description: '`ClientData`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ClientData'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /custom-fields:
    get:
      operationId: custom-fields.index
      summary: Filter all custom fields
      tags:
        - CustomFields
      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'
  /efforts:
    get:
      operationId: efforts.index
      summary: Filter all efforts
      tags:
        - Efforts
      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 |

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

            | `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")
        - 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: >-
            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'
  /files/{id}/download:
    get:
      operationId: file.download
      summary: Downloads file
      tags:
        - File
      parameters:
        - name: id
          in: path
          required: true
          description: The ID of the file to be downloaded.
          schema:
            type: integer
      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'
  /files/{id}:
    get:
      operationId: file.show
      summary: Show file data
      tags:
        - File
      parameters:
        - name: id
          in: path
          required: true
          description: The ID of the file to be retrieved.
          schema:
            type: integer
      responses:
        '200':
          description: '`FileData`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FileData'
        '401':
          $ref: '#/components/responses/AuthenticationException'
  /projects:
    get:
      operationId: projects.index
      summary: Filter all projects
      tags:
        - Projects
      parameters:
        - name: include
          in: query
          description: >-
            Available includes are `team`, `guests`, `tags`, `originSpace`,
            `client`, `client.primaryContact`. 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 |

            | `name` | `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<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.shortcode` | `string` | in, nin, notin, eq, ne, neq,
            contains, like, startswith, endswith, isnull, isnotnull, notnull |

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

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

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

            | `projectType.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 |


            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 `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
      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
      summary: Show single project
      tags:
        - Projects
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: findBy
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
              - shortcode
            default: id
        - 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
      summary: Get project team
      tags:
        - Projects
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: findBy
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
              - shortcode
            default: id
        - 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 `ProjectTeamData`
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    description: The list of items
                    items:
                      $ref: '#/components/schemas/ProjectTeamData'
                  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
      summary: Get project guests
      tags:
        - Projects
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: findBy
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
              - shortcode
            default: id
        - 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 `ProjectTeamData`
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    description: The list of items
                    items:
                      $ref: '#/components/schemas/ProjectTeamData'
                  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
      summary: Get project phases
      tags:
        - Projects
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: findBy
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
              - shortcode
            default: id
        - 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 |


            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 `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
      summary: Get project milestones
      tags:
        - Projects
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: findBy
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
              - shortcode
            default: id
        - 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 |


            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 `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
      summary: Get project epics
      tags:
        - Projects
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: findBy
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
              - shortcode
            default: id
        - 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 /> - 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: aggregates: count, sum, avg, min, max; columns: effort_sum;
            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
      summary: Get project tasks
      tags:
        - Projects
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: findBy
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
              - shortcode
            default: id
        - name: sort
          in: query
          description: >-
            Available sorts are `title`, `uri`, `status`, `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 `parentTask`, `subTasks`. 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 |

            | `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 |

            | `assignee.id` | `id<UserData>` | 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 |

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

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

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

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

            | `subTasks` | `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'
        '404':
          $ref: '#/components/responses/ModelNotFoundException'
        '422':
          $ref: '#/components/responses/ValidationException'
  /tasks:
    get:
      operationId: tasks.index
      summary: Filter all tasks
      tags:
        - Tasks
      parameters:
        - name: sort
          in: query
          description: >-
            Available sorts are `title`, `uri`, `status`, `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`, `client`, `parentTask`,
            `subTasks`. 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 |

            | `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 |

            | `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 |

            | `assignee.id` | `id<UserData>` | 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 |

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

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

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

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

            | `subTasks` | `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'
  /user-groups:
    get:
      operationId: user-groups.index
      summary: Filter all usergroups
      tags:
        - Usergroups
      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-groups/{id}:
    get:
      operationId: user-groups.show
      summary: Show single usergroup
      tags:
        - Usergroups
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: integer
        - name: findBy
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
            default: id
        - 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'
  /users:
    get:
      operationId: users.index
      summary: Filter all employees
      tags:
        - Users
      parameters:
        - name: sort
          in: query
          description: >-
            Available sorts are `first_name`, `last_name`, `email`,
            `created_at`, `custom_field.<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 `userGroups`. 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_field.*` — 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_field.<slug>`. Example: `custom_field.my_flag eq 'yes'` or
            `custom_field.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 `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/{id}:
    get:
      operationId: users.show
      summary: Show single user object
      tags:
        - Users
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
        - name: findBy
          in: query
          description: The field to search by
          schema:
            type: string
            enum:
              - id
              - external_id
            default: id
        - name: include
          in: query
          description: >-
            Available includes are `userGroups`. You can include multiple
            options by separating them with a comma.
          schema:
            type: string
      responses:
        '200':
          description: '`UserData`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserData'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '404':
          $ref: '#/components/responses/ModelNotFoundException'
        '422':
          $ref: '#/components/responses/ValidationException'
components:
  securitySchemes:
    http:
      type: http
      scheme: bearer
  schemas:
    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
        name:
          type: string
        shortcode:
          type:
            - string
            - 'null'
        segment:
          default: B
          $ref: '#/components/schemas/ClientSegment'
        created_at:
          type: string
          format: date-time
        primary_contact_id:
          type:
            - string
            - 'null'
        primaryContact:
          $ref: '#/components/schemas/UserData'
        projects:
          type: array
          items:
            $ref: '#/components/schemas/ProjectData'
        origin_space_id:
          type:
            - string
            - 'null'
          description: If set the client is shared from another Space
        originSpace:
          description: Shared space which the client is shared from
          $ref: '#/components/schemas/SpaceData'
      required:
        - id
        - external_id
        - name
        - shortcode
        - segment
        - created_at
        - primary_contact_id
        - origin_space_id
      title: ClientData
    ClientSegment:
      type: string
      enum:
        - A
        - B
        - C
      title: ClientSegment
    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
    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/ProjectTeamData'
        comments:
          type: string
        type:
          type: string
        date:
          type: string
          format: date
        hours:
          type: number
        effortType:
          anyOf:
            - $ref: '#/components/schemas/EffortTypeData'
            - type: 'null'
        task_id:
          type:
            - string
            - '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'
        adminCategory:
          anyOf:
            - $ref: '#/components/schemas/EffortAdminCategoryData'
            - type: 'null'
      required:
        - id
        - user
        - comments
        - type
        - date
        - hours
        - effortType
        - task_id
        - task
        - project
        - epic
        - phase
        - milestone
        - adminCategory
      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
    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
    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
      required:
        - id
        - title
        - po_number
        - group
        - dependency_phase_id
        - dependency_milestone_id
        - date
        - created_at
      title: MilestoneData
    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
      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
        title:
          type: string
        shortcode:
          type: string
        po_number:
          type:
            - string
            - 'null'
        projectType:
          $ref: '#/components/schemas/ProjectTypeData'
        status:
          type: string
        is_acquisition:
          type: boolean
        is_private:
          type: boolean
        client_id:
          type: string
        project_type_id:
          type:
            - string
            - 'null'
        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'
        origin_space_id:
          type:
            - string
            - 'null'
          description: If set the client is shared from another Space
        originSpace:
          description: Shared space which the client is shared from
          $ref: '#/components/schemas/SpaceData'
        team:
          type: array
          description: Project team
          items:
            $ref: '#/components/schemas/ProjectTeamData'
        guests:
          type: array
          description: Project guests
          items:
            $ref: '#/components/schemas/ProjectTeamData'
      required:
        - id
        - external_id
        - title
        - shortcode
        - po_number
        - projectType
        - status
        - is_acquisition
        - is_private
        - client_id
        - project_type_id
        - start_date
        - end_date
        - origin_space_id
      title: ProjectData
    ProjectTagData:
      type: object
      properties:
        id:
          type: string
        title:
          type: string
      required:
        - id
        - title
      title: ProjectTagData
    ProjectTeamData:
      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: ProjectTeamData
    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
    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'
        uri:
          type: string
        title:
          type: string
        status:
          $ref: '#/components/schemas/TaskStatus'
        type:
          type: string
        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'
        phase:
          anyOf:
            - $ref: '#/components/schemas/PhaseData'
            - type: 'null'
        milestone:
          anyOf:
            - $ref: '#/components/schemas/MilestoneData'
            - type: 'null'
        epic:
          anyOf:
            - $ref: '#/components/schemas/EpicData'
            - type: 'null'
        parentTask:
          anyOf:
            - $ref: '#/components/schemas/TaskData'
            - type: 'null'
        subTasks:
          type: array
          items:
            $ref: '#/components/schemas/TaskData'
        completed_at:
          type:
            - string
            - 'null'
          format: date-time
        closed_at:
          type:
            - string
            - 'null'
          format: date-time
        created_at:
          type:
            - string
            - 'null'
          format: date-time
        assignee:
          $ref: '#/components/schemas/ProjectTeamData'
        list_sorting:
          type: integer
      required:
        - id
        - project_id
        - client_id
        - parent_task_id
        - external_id
        - uri
        - title
        - status
        - type
        - is_onhold
        - is_public
        - due_date
        - due_date_settings
        - phase
        - milestone
        - epic
        - parentTask
        - subTasks
        - completed_at
        - closed_at
        - created_at
        - assignee
        - 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
    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
    UserData:
      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
        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'
        userGroupsCount:
          type: integer
        userGroupsExists:
          type: boolean
        customFields:
          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
        - 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
        - customFields
        - created_at
        - deleted_at
      title: UserData
    UserPlan:
      type: string
      enum:
        - basic
        - standard
        - external
        - advanced
        - expert
        - guest
        - tax_advisor
        - not_assigned
      title: UserPlan
    UserType:
      type: string
      enum:
        - user
        - guest
        - tax_advisor
      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
  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
x-schema-catalog-link: /_bundle/openapi.json
