openapi: 3.0.4
info:
  title: Willow Public API
  version: v3
servers:
  - url: https://{instance}.app.willowinc.com/api/v3
    variables:
      instance:
        default: ''
        description: Your Willow instance name.
paths:
  /models:
    get:
      tags:
        - Models
      summary: List models
      operationId: ModelsV2_GetModels
      parameters:
        - name: rootModel
          in: query
          description: Root model to get dependencies from
          schema:
            type: string
            nullable: true
          x-position: 1
        - name: includeModelDefinitions
          in: query
          description: When true, the response includes the model definitions
          schema:
            type: boolean
            default: false
          x-position: 2
      responses:
        '200':
          description: Returns models for the input root Id.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/DigitalTwinModel'
        '400':
          description: If a input validation error occurs.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
      security:
        - oauth2: []
  /models/{id}:
    get:
      tags:
        - Models
      summary: Retrieve a model
      operationId: ModelsV2_GetModel
      parameters:
        - name: id
          in: path
          description: Id of the model
          required: true
          schema:
            type: string
          x-position: 1
      responses:
        '200':
          description: If model retrieved successfully.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DigitalTwinModel'
        '400':
          description: If id is not valid or null or empty.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '404':
          description: If model not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
      security:
        - oauth2: []
  /twins:
    post:
      tags:
        - Twins
      summary: List twins
      operationId: TwinsV2_GetTwinsAsync
      requestBody:
        description: Instance of GetTwinsRequest.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/GetTwinsRequest'
        required: true
        x-name: request
        x-position: 1
      responses:
        '200':
          description: Page`1.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PageOfDigitalTwinWithRelationships'
        '400':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationProblemDetails'
      security:
        - oauth2: []
    put:
      tags:
        - Twins
      summary: Create or replace a twin.
      operationId: TwinsV2_CreateOrReplaceTwinAsync
      requestBody:
        description: Instance of DigitalTwin.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DigitalTwin'
        required: true
        x-name: twin
        x-position: 1
      responses:
        '200':
          description: Created Twin .
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DigitalTwin'
        '400':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
      security:
        - oauth2: []
  /twins/{id}:
    get:
      tags:
        - Twins
      summary: Retrieve a twin
      operationId: TwinsV2_GetTwinByIdAsync
      parameters:
        - name: id
          in: path
          description: Id of the twin
          required: true
          schema:
            type: string
          x-position: 1
        - name: includeRelationships
          in: query
          description: >-
            When true, the response includes the incoming and outgoing
            relationships
          schema:
            type: boolean
            default: false
          x-position: 2
      responses:
        '200':
          description: Twin information successfully retrieved.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DigitalTwinWithRelationships'
        '403':
          description: 'Unauthorized: You do not have permission to access this twin.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '404':
          description: Twin not found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
      security:
        - oauth2: []
    patch:
      tags:
        - Twins
      summary: Update a twin
      operationId: TwinsV2_PatchTwin
      parameters:
        - name: id
          in: path
          description: Id of the twin
          required: true
          schema:
            type: string
          x-position: 1
      requestBody:
        description: List of Patch Operations.
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: '#/components/schemas/Operation'
        required: true
        x-name: jsonPatchDocument
        x-position: 2
      responses:
        '400':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationProblemDetails'
        '403':
          description: 'Unauthorized: You do not have permission to access this twin.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '404':
          description: Twin not found with the supplied Id.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
      security:
        - oauth2: []
  /twins/ids:
    post:
      tags:
        - Twins
      summary: Retrieve multiple twins
      description: >-
        Retrieve twin details for the list of twin Ids included in the request
        body.

        Any ids that do not reference valid twins will silently be omitted from
        the response -- no 404/NotFound will be generated.

        Match response against your query to find any invalid IDs.
      operationId: TwinsV2_GetTwinsByIdsAsync
      parameters:
        - name: includeRelationships
          in: query
          description: >-
            When true, the response includes the incoming and outgoing
            relationships
          schema:
            type: boolean
            default: false
          x-position: 2
      requestBody:
        description: Array of twin Ids.
        content:
          application/json:
            schema:
              maxItems: 100
              minItems: 1
              type: array
              items:
                type: string
        required: true
        x-name: ids
        x-position: 1
      responses:
        '200':
          description: Twin information
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/DigitalTwinWithRelationships'
        '400':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationProblemDetails'
        '403':
          description: 'Unauthorized: You do not have permission to access these twins.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '404':
          description: Twin not found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
      security:
        - oauth2: []
  /twins/graph:
    post:
      tags:
        - Twins
      summary: Retrieve Twin graph.
      description: >-
        Retrieves a twin by its ID along with its associated twins as defined in
        the request.

        The `relationships` field in the request is optional.

        Twins will be returned in the response even if the nested relationships
        failed to find a twin. Similar to a sql outer join semantics.
      operationId: TwinsV2_GetTwinGraph
      requestBody:
        description: Instance of GetTwinGraphRequest.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/GetTwinGraphRequest'
        required: true
        x-name: request
        x-position: 1
      responses:
        '200':
          description: Twin Graph Response.
          content:
            application/json:
              schema:
                type: object
                additionalProperties:
                  type: array
                  items:
                    $ref: '#/components/schemas/DigitalTwinWithRelationships'
        '403':
          description: 'Unauthorized: You do not have permission to access this twin.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '404':
          description: Twin not found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '504':
          description: ''
      security:
        - oauth2: []
  /twins/count:
    post:
      tags:
        - Twins
      summary: Count twins
      operationId: TwinsV2_GetTwinsCount
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/GetTwinsCountRequest'
        required: true
        x-name: request
        x-position: 1
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                type: integer
                format: int32
        '400':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
      security:
        - oauth2: []
  /twins/relationships:
    put:
      tags:
        - Relationships
      summary: Create or replace a twin relationship
      description: >-
        Only one relationship between twin T1 and twin T2 with the same name and
        properties can be present -- if the given relationship already exists,
        the operation is idempotent.

        Id of the relationship will be derived by the system and will override
        the value present in the request.
      operationId: RelationshipsV2_UpsertRelationship
      requestBody:
        description: Instance of DigitalTwinRelationship.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DigitalTwinRelationship'
        required: true
        x-name: relationship
        x-position: 1
      responses:
        '200':
          description: Created or Updated DigitalTwinRelationship.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DigitalTwinRelationship'
        '400':
          description: If provided relationship has empty sourceId, targetId or name.
          content:
            application/json:
              schema:
                type: string
        '404':
          description: 'If sourceId, targetId or name does not exist. '
          content:
            application/json:
              schema:
                type: string
        '409':
          description: >-
            Relationship entity already exists for create relationship calls.
            (Request will be considered as Create if Id is string empty)
                        or Attempted to update a relationship field that matches another already existing relationship causing conflict.
          content:
            application/json:
              schema:
                type: string
      security:
        - oauth2: []
  /twins/{twinId}/relationships/{relationshipId}:
    get:
      tags:
        - Relationships
      summary: Retrieve a twin relationship
      operationId: RelationshipsV2_GetRelationship
      parameters:
        - name: twinId
          in: path
          description: Id of the twin. SourceId for the relationship.
          required: true
          schema:
            type: string
          x-position: 1
        - name: relationshipId
          in: path
          description: Id of the relationship
          required: true
          schema:
            type: string
          x-position: 2
      responses:
        '200':
          description: Target relationship retrieved
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DigitalTwinRelationship'
        '404':
          description: Relationship not found
          content:
            application/json:
              schema:
                type: string
      security:
        - oauth2: []
  /twins/{twinId}/relationships/outgoing:
    get:
      tags:
        - Relationships
      summary: List outgoing relationships for a twin
      operationId: RelationshipsV2_GetRelationships
      parameters:
        - name: twinId
          in: path
          description: Id of the source twin
          required: true
          schema:
            type: string
          x-position: 1
        - name: relationshipName
          in: query
          description: |-
            Name of the relationship to filter the list.
                        This parameter is optional and sending null will return all the outgoing relationships.
          schema:
            type: string
            nullable: true
          x-position: 2
      responses:
        '200':
          description: Target relationships retrieved.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/DigitalTwinRelationship'
        '404':
          description: If Twin is not found.
          content:
            application/json:
              schema:
                type: string
      security:
        - oauth2: []
  /twins/{twinId}/relationships/incoming:
    get:
      tags:
        - Relationships
      summary: List incoming relationships for a twin
      operationId: RelationshipsV2_GetIncomingRelationships
      parameters:
        - name: twinId
          in: path
          description: Id of the target twin
          required: true
          schema:
            type: string
          x-position: 1
      responses:
        '200':
          description: Relationships retrieved.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/DigitalTwinRelationship'
        '404':
          description: Twin not found.
          content:
            application/json:
              schema:
                type: string
      security:
        - oauth2: []
  /time-series:
    post:
      tags:
        - Time Series
      summary: Insert time series values
      operationId: PostTelemetry
      requestBody:
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: '#/components/schemas/IncomingTelemetry'
        required: true
      responses:
        '202':
          description: Accepted
        '400':
          description: Bad Request
      security:
        - oauth2: []
  /time-series/{twinId}:
    get:
      tags:
        - Time Series
      summary: Retrieve a time series
      operationId: GetTimeSeriesById
      parameters:
        - name: start
          in: query
          description: Start timestamp for the request
          required: true
          schema:
            type: string
            format: date-time
          example: '2024-10-01T00:00:00Z'
        - name: end
          in: query
          description: End timestamp for the request
          required: true
          schema:
            type: string
            format: date-time
          example: '2024-10-07T00:00:00Z'
        - name: twinId
          in: path
          description: Id of the twin
          required: true
          schema:
            type: string
          example: TW-DD-II-01
        - name: pageSize
          in: query
          description: Number of items returned per page (minimum 1)
          required: true
          schema:
            type: integer
            format: int32
          example: 100
        - name: continuationToken
          in: query
          description: Token for retrieving the next page of results
          schema:
            type: string
          example: CgAAYQAAAAAAABQ...
        - name: includeDataQuality
          in: query
          description: If true, include data quality metrics in the response
          schema:
            type: boolean
          example: false
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetTelemetryResult'
        '404':
          description: Not Found
      security:
        - oauth2: []
  /time-series/{twinId}/latest:
    get:
      tags:
        - Time Series
      summary: Retrieve the latest value
      operationId: GetTimeSeriesByIdLatest
      parameters:
        - name: twinId
          in: path
          description: Id of the twin
          required: true
          schema:
            type: string
          example: TW-DD-II-01
        - name: start
          in: query
          description: Start timestamp for the request
          schema:
            type: string
            format: date-time
          example: '2024-10-01T00:00:00Z'
        - name: end
          in: query
          description: End timestamp for the request
          schema:
            type: string
            format: date-time
          example: '2024-10-07T00:00:00Z'
        - name: includeDataQuality
          in: query
          description: If true, include data quality metrics in the response
          schema:
            type: boolean
          example: false
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/TelemetryData'
      security:
        - oauth2: []
  /time-series/ids:
    post:
      tags:
        - Time Series
      summary: Retrieve multiple time series
      operationId: GetTimeSeriesIds
      parameters:
        - name: start
          in: query
          description: Start timestamp for the request
          required: true
          schema:
            type: string
            format: date-time
          example: '2024-10-01T00:00:00Z'
        - name: end
          in: query
          description: End timestamp for the request
          required: true
          schema:
            type: string
            format: date-time
          example: '2024-10-07T00:00:00Z'
        - name: pageSize
          in: query
          description: Number of items returned per page (minimum 1)
          required: true
          schema:
            type: integer
            format: int32
          example: 100
        - name: continuationToken
          in: query
          description: Token for retrieving the next page of results
          required: true
          schema:
            type: string
          example: CgAAYQAAAAAAABQ...
        - name: includeDataQuality
          in: query
          description: If true, include data quality metrics in the response
          schema:
            type: boolean
          example: false
      requestBody:
        content:
          application/json:
            schema:
              type: array
              items:
                type: string
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetTelemetryResult'
        '404':
          description: Not Found
      security:
        - oauth2: []
  /time-series/ids/latest:
    post:
      tags:
        - Time Series
      summary: Retrieve multiple latest values
      operationId: GetTimeSeriesIdsLatest
      parameters:
        - name: start
          in: query
          description: Start timestamp for the request
          schema:
            type: string
            format: date-time
          example: '2024-10-01T00:00:00Z'
        - name: end
          in: query
          description: End timestamp for the request
          schema:
            type: string
            format: date-time
          example: '2024-10-07T00:00:00Z'
        - name: includeDataQuality
          in: query
          description: If true, include data quality metrics in the response
          schema:
            type: boolean
          example: false
      requestBody:
        content:
          application/json:
            schema:
              type: array
              items:
                type: string
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/TelemetryData'
      security:
        - oauth2: []
  /insights:
    post:
      tags:
        - Insights
      summary: >-
        List insights.

        Pagination applies only to root elements (ScenarioId == null).

        When fetching a page, include all children of those roots.

        Search/filtering applies to both parent and children:

        If a parent matches, return the parent with all its children.

        If a child matches, return the child and its parent (even if the parent
        wouldn’t match by itself).
      description: Returns a paginated list insight. Default page size is 10.
      operationId: POSTInsightsinsights
      parameters:
        - name: addFloor
          in: query
          description: When true, the response includes the floorId.
          schema:
            type: boolean
            default: false
      requestBody:
        description: Filter and sort specifications.
        content:
          application/json:
            schema:
              allOf:
                - $ref: '#/components/schemas/BatchRequest1'
          text/json:
            schema:
              allOf:
                - $ref: '#/components/schemas/BatchRequest1'
          application/*+json:
            schema:
              allOf:
                - $ref: '#/components/schemas/BatchRequest1'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InsightBatch'
      security:
        - oauth2: []
  /insights/{insightId}:
    get:
      tags:
        - Insights
      summary: Retrieve an insight.
      operationId: GETInsightsinsightsinsightId
      parameters:
        - name: insightId
          in: path
          description: Id of the insight.
          required: true
          schema:
            type: string
            format: uuid
        - name: ignoreQueryFilters
          in: query
          description: Ignore global filter.
          schema:
            type: boolean
            default: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Insight'
      security:
        - oauth2: []
  /events:
    post:
      tags:
        - Events
      summary: List events.
      description: Returns a paginated list of events.
      operationId: POSTEventsevents
      requestBody:
        description: >-
          The filter criteria and pagination details for the events to be
          retrieved.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BatchRequest'
          text/json:
            schema:
              $ref: '#/components/schemas/BatchRequest'
          application/*+json:
            schema:
              $ref: '#/components/schemas/BatchRequest'
        required: true
      responses:
        '200':
          description: >-
            A paginated collection of events that match the specified filter
            criteria.
          content:
            text/plain:
              schema:
                $ref: '#/components/schemas/IBatchOfEvent'
            application/json:
              schema:
                $ref: '#/components/schemas/IBatchOfEvent'
            text/json:
              schema:
                $ref: '#/components/schemas/IBatchOfEvent'
      security:
        - oauth2: []
    put:
      tags:
        - Events
      summary: Create or update multiple events.
      operationId: PUTEventsevents
      requestBody:
        description: A collection of Event objects to be created or updated.
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: '#/components/schemas/Event'
          text/json:
            schema:
              type: array
              items:
                $ref: '#/components/schemas/Event'
          application/*+json:
            schema:
              type: array
              items:
                $ref: '#/components/schemas/Event'
        required: true
      responses:
        '200':
          description: >-
            Returns an EventsPutResponse containing details of the create/update
            operation.
          content:
            text/plain:
              schema:
                $ref: '#/components/schemas/EventsPutResponse'
            application/json:
              schema:
                $ref: '#/components/schemas/EventsPutResponse'
            text/json:
              schema:
                $ref: '#/components/schemas/EventsPutResponse'
      security:
        - oauth2: []
    delete:
      tags:
        - Events
      summary: Delete multiple events.
      operationId: DELETEEventsevents
      requestBody:
        description: Collection of ids for the events to be deleted.
        content:
          application/json:
            schema:
              type: array
              items:
                type: string
                format: uuid
          text/json:
            schema:
              type: array
              items:
                type: string
                format: uuid
          application/*+json:
            schema:
              type: array
              items:
                type: string
                format: uuid
        required: true
      responses:
        '204':
          description: A task representing the asynchronous operation.
      security:
        - oauth2: []
  /events/{eventId}:
    get:
      tags:
        - Events
      summary: Retrieve an event.
      operationId: GETEventseventseventId
      parameters:
        - name: eventId
          in: path
          description: Id of the event.
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
          content:
            text/plain:
              schema:
                $ref: '#/components/schemas/Event'
            application/json:
              schema:
                $ref: '#/components/schemas/Event'
            text/json:
              schema:
                $ref: '#/components/schemas/Event'
        '404':
          description: Not Found
          content:
            text/plain:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
            text/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
      security:
        - oauth2: []
  /events/types:
    get:
      tags:
        - Events
      summary: List event types.
      description: Returns the possible types that an event can have.
      operationId: GETEventseventstypes
      responses:
        '200':
          description: A collection of event types.
          content:
            text/plain:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/EventTypeRecord'
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/EventTypeRecord'
            text/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/EventTypeRecord'
      security:
        - oauth2: []
  /events/files:
    post:
      tags:
        - Events
      summary: Upload events from files.
      operationId: POSTEventseventsfiles
      requestBody:
        description: A collection of files to be uploaded.
        content:
          multipart/form-data:
            schema:
              required:
                - files
              type: object
              properties:
                files:
                  type: array
                  items:
                    $ref: '#/components/schemas/IFormFile'
        required: true
      responses:
        '200':
          description: An EventsUploadResponse containing details of the upload operation.
          content:
            text/plain:
              schema:
                $ref: '#/components/schemas/EventsUploadResponse'
            application/json:
              schema:
                $ref: '#/components/schemas/EventsUploadResponse'
            text/json:
              schema:
                $ref: '#/components/schemas/EventsUploadResponse'
      security:
        - oauth2: []
  /tickets:
    post:
      tags:
        - Tickets
      summary: List tickets.
      description: >-
        Returns a paginated list of tickets. Default page size is 100, maximum
        is 1000.
      operationId: POSTTicketstickets
      requestBody:
        description: ''
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BatchRequest1'
          text/json:
            schema:
              $ref: '#/components/schemas/BatchRequest1'
          application/*+json:
            schema:
              $ref: '#/components/schemas/BatchRequest1'
      responses:
        '200':
          description: Paginated list of tickets.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TicketSimpleBatch'
        '400':
          description: Invalid request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationProblemDetails1'
        '401':
          description: Unauthorized.
      security:
        - oauth2: []
    put:
      tags:
        - Tickets
      summary: Creates a new ticket.
      operationId: PUTTicketstickets
      requestBody:
        description: Create ticket request.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateTicketRequest'
          text/json:
            schema:
              $ref: '#/components/schemas/CreateTicketRequest'
          application/*+json:
            schema:
              $ref: '#/components/schemas/CreateTicketRequest'
      responses:
        '200':
          description: Ticket created.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TicketDetail'
        '400':
          description: Validation failed.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationProblemDetails1'
        '401':
          description: Unauthorized.
      security:
        - oauth2: []
  /tickets/{ticketId}:
    get:
      tags:
        - Tickets
      summary: Retrieves a ticket by its Id.
      operationId: GETTicketsticketsticketId
      parameters:
        - name: ticketId
          in: path
          description: ''
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: Ticket found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TicketDetail'
        '401':
          description: Unauthorized.
        '404':
          description: Ticket not found.
      security:
        - oauth2: []
    patch:
      tags:
        - Tickets
      summary: Applies a JSON Patch document to update specific properties of a ticket.
      description: >-
        This endpoint supports partial updates to a ticket using a JSON Patch
        document. The number of
                    operations in the patch document must not exceed the number of updatable properties in the WorkflowCore.Controllers.Request.PatchTicketRequest model. Additionally, only "replace" operations are allowed.
      operationId: PATCHTicketsticketsticketId
      parameters:
        - name: ticketId
          in: path
          description: The unique identifier of the ticket to be updated.
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        description: >-
          A Microsoft.AspNetCore.JsonPatch.JsonPatchDocument`1 containing the
          operations to apply to the ticket. Only "replace" operations
                      are supported.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchTicketRequestJsonPatchDocument'
          text/json:
            schema:
              $ref: '#/components/schemas/PatchTicketRequestJsonPatchDocument'
          application/*+json:
            schema:
              $ref: '#/components/schemas/PatchTicketRequestJsonPatchDocument'
      responses:
        '200':
          description: Ticket updated.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TicketDetail'
        '400':
          description: Validation failed.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationProblemDetails1'
        '401':
          description: Unauthorized.
        '404':
          description: Ticket not found.
      security:
        - oauth2: []
  /tickets/{ticketId}/attachments/{attachmentId}:
    get:
      tags:
        - Tickets
      summary: Retrieves a ticket attachment by its Id.
      operationId: GETTicketsticketsticketIdattachmentsattachmentId
      parameters:
        - name: ticketId
          in: path
          description: Ticket Id.
          required: true
          schema:
            type: string
            format: uuid
        - name: attachmentId
          in: path
          description: Attachment Id.
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: string
                format: binary
      security:
        - oauth2: []
  /tickets/categories:
    post:
      tags:
        - Ticket Metadata
      summary: List categories.
      description: >-
        Returns a paginated list of the possible categories that a ticket can
        have.
      operationId: POSTTicketMetadataticketscategories
      requestBody:
        description: ''
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BatchRequest1'
          text/json:
            schema:
              $ref: '#/components/schemas/BatchRequest1'
          application/*+json:
            schema:
              $ref: '#/components/schemas/BatchRequest1'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TicketCategoryBatch'
      security:
        - oauth2: []
    put:
      tags:
        - Ticket Metadata
      summary: Create a category.
      operationId: PUTTicketMetadataticketscategories
      requestBody:
        description: ''
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateTicketCategoryRequest'
          text/json:
            schema:
              $ref: '#/components/schemas/CreateTicketCategoryRequest'
          application/*+json:
            schema:
              $ref: '#/components/schemas/CreateTicketCategoryRequest'
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TicketCategory'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
      security:
        - oauth2: []
  /tickets/categories/{categoryId}:
    patch:
      tags:
        - Ticket Metadata
      summary: Update a category.
      operationId: PATCHTicketMetadataticketscategoriescategoryId
      parameters:
        - name: categoryId
          in: path
          description: ''
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        description: ''
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateTicketCategoryRequest'
          text/json:
            schema:
              $ref: '#/components/schemas/UpdateTicketCategoryRequest'
          application/*+json:
            schema:
              $ref: '#/components/schemas/UpdateTicketCategoryRequest'
      responses:
        '204':
          description: No Content
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
      security:
        - oauth2: []
  /tickets/job-types:
    post:
      tags:
        - Ticket Metadata
      summary: List job types.
      description: >-
        Returns a paginated list of the possible job types that a ticket can
        have.
      operationId: POSTTicketMetadataticketsjobtypes
      requestBody:
        description: ''
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BatchRequest1'
          text/json:
            schema:
              $ref: '#/components/schemas/BatchRequest1'
          application/*+json:
            schema:
              $ref: '#/components/schemas/BatchRequest1'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TicketJobTypeBatch'
      security:
        - oauth2: []
    put:
      tags:
        - Ticket Metadata
      summary: Create a job type.
      operationId: PUTTicketMetadataticketsjobtypes
      requestBody:
        description: ''
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateTicketJobTypeRequest'
          text/json:
            schema:
              $ref: '#/components/schemas/CreateTicketJobTypeRequest'
          application/*+json:
            schema:
              $ref: '#/components/schemas/CreateTicketJobTypeRequest'
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TicketJobType'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
      security:
        - oauth2: []
  /tickets/job-types/{jobTypeId}:
    patch:
      tags:
        - Ticket Metadata
      summary: Update a job type.
      operationId: PATCHTicketMetadataticketsjobtypesjobTypeId
      parameters:
        - name: jobTypeId
          in: path
          description: ''
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        description: ''
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateTicketJobTypeRequest'
          text/json:
            schema:
              $ref: '#/components/schemas/UpdateTicketJobTypeRequest'
          application/*+json:
            schema:
              $ref: '#/components/schemas/UpdateTicketJobTypeRequest'
      responses:
        '204':
          description: No Content
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
      security:
        - oauth2: []
  /tickets/service-needed:
    post:
      tags:
        - Ticket Metadata
      summary: List services needed.
      description: >-
        Returns a paginated list of the possible services needed that a ticket
        can have.
      operationId: POSTTicketMetadataticketsserviceneeded
      requestBody:
        description: ''
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BatchRequest1'
          text/json:
            schema:
              $ref: '#/components/schemas/BatchRequest1'
          application/*+json:
            schema:
              $ref: '#/components/schemas/BatchRequest1'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TicketServiceNeededBatch'
      security:
        - oauth2: []
    put:
      tags:
        - Ticket Metadata
      summary: Create a service needed.
      operationId: PUTTicketMetadataticketsserviceneeded
      requestBody:
        description: ''
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateTicketServiceNeededRequest'
          text/json:
            schema:
              $ref: '#/components/schemas/CreateTicketServiceNeededRequest'
          application/*+json:
            schema:
              $ref: '#/components/schemas/CreateTicketServiceNeededRequest'
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TicketServiceNeeded'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
      security:
        - oauth2: []
  /tickets/service-needed/{serviceNeededId}:
    patch:
      tags:
        - Ticket Metadata
      summary: Update a service needed.
      operationId: PATCHTicketMetadataticketsserviceneededserviceNeededId
      parameters:
        - name: serviceNeededId
          in: path
          description: The ID of the service needed.
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        description: ''
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateTicketServiceNeededRequest'
          text/json:
            schema:
              $ref: '#/components/schemas/UpdateTicketServiceNeededRequest'
          application/*+json:
            schema:
              $ref: '#/components/schemas/UpdateTicketServiceNeededRequest'
      responses:
        '204':
          description: No Content
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        default:
          description: Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
      security:
        - oauth2: []
  /tickets/status:
    get:
      tags:
        - Ticket Metadata
      summary: Retrieves a list of ticket status.
      operationId: GETTicketMetadataticketsstatus
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/TicketStatus'
      security:
        - oauth2: []
  /tickets/priorities:
    get:
      tags:
        - Ticket Metadata
      summary: Gets the list of ticket priorities.
      operationId: GETTicketMetadataticketspriorities
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/TicketPriority'
      security:
        - oauth2: []
  /oauth2/token:
    post:
      tags:
        - OAuth2
      summary: Get OAuth2 Token
      description: Generates an OAuth2 token.
      operationId: GetOAuth2Token
      requestBody:
        content:
          application/x-www-form-urlencoded:
            schema:
              required:
                - grant_type
                - client_id
                - client_secret
              type: object
              properties:
                grant_type:
                  type: string
                client_id:
                  type: string
                client_secret:
                  type: string
      responses:
        '200':
          description: Token response
          content:
            application/json:
              schema:
                type: object
                properties:
                  access_token:
                    type: string
                  token_type:
                    type: string
                  expires_in:
                    type: integer
components:
  schemas:
    AssigneeType:
      enum:
        - noAssignee
        - customerUser
        - workGroup
      type: string
      description: Specifies the type of assignee for a ticket.
    AttachmentDetails:
      type: object
      properties:
        id:
          type: string
          description: Gets or sets the unique identifier for the attachment.
          format: uuid
        fileName:
          type: string
          description: Gets or sets the file name of the attachment.
          nullable: true
      additionalProperties: false
      description: Represents the attachment details for a ticket.
    BaseTwin:
      type: object
      properties:
        id:
          type: string
          description: Gets or sets the unique identifier for the twin.
          nullable: true
        name:
          type: string
          description: Gets or sets the name of the twin.
          nullable: true
        modelId:
          type: string
          description: Gets or sets the twin's model id.
          nullable: true
      additionalProperties: false
      description: Represent the base twin.
    BatchRequest:
      type: object
      properties:
        sortSpecifications:
          type: array
          items:
            $ref: '#/components/schemas/SortSpecification'
        filterSpecifications:
          type: array
          items:
            $ref: '#/components/schemas/FilterSpecification'
        page:
          type: integer
          format: int32
          nullable: true
        pageSize:
          type: integer
          format: int32
          nullable: true
    BatchRequest1:
      type: object
      properties:
        sortSpecifications:
          type: array
          items:
            $ref: '#/components/schemas/SortSpecification'
          nullable: true
        filterSpecifications:
          type: array
          items:
            $ref: '#/components/schemas/FilterSpecification1'
          nullable: true
        page:
          type: integer
          format: int32
          nullable: true
        pageSize:
          type: integer
          format: int32
          nullable: true
      additionalProperties: false
    Comment:
      type: object
      properties:
        id:
          type: string
          description: Gets or sets the unique identifier for the comment.
          format: uuid
        text:
          type: string
          description: Gets or sets the text content of the comment.
          nullable: true
        createdDate:
          type: string
          description: Gets or sets the date and time when the comment was created.
          format: date-time
        creator:
          $ref: '#/components/schemas/UserProfile'
      additionalProperties: false
      description: Represents comment dto associated with a ticket.
    CreateTicketCategoryRequest:
      required:
        - name
      type: object
      properties:
        name:
          maxLength: 80
          minLength: 0
          type: string
          description: Gets or sets the name of the ticket category.
        locations:
          type: array
          items:
            type: string
          description: >-
            Gets or sets the list of locations associated with the ticket
            category.
          nullable: true
      additionalProperties: false
    CreateTicketJobTypeRequest:
      required:
        - name
      type: object
      properties:
        name:
          maxLength: 500
          minLength: 0
          type: string
          description: Gets or sets the job type name.
      additionalProperties: false
    CreateTicketRequest:
      type: object
      properties:
        summary:
          type: string
          description: Gets or sets the summary of the ticket.
          nullable: true
        description:
          type: string
          description: Gets or sets the description of the ticket.
          nullable: true
        cause:
          type: string
          description: Gets or sets the cause of the ticket.
          nullable: true
        solution:
          type: string
          description: Gets or sets the solution of the ticket.
          nullable: true
        twinId:
          type: string
          description: Gets or sets the digital twin id associated with the ticket.
          nullable: true
        notes:
          type: string
          description: Gets or sets additional notes for the ticket.
          nullable: true
        latitude:
          type: number
          description: Gets or sets the latitude of the ticket location.
          format: double
          nullable: true
        longitude:
          type: number
          description: Gets or sets the longitude of the ticket location.
          format: double
          nullable: true
        insightId:
          type: string
          description: Gets or sets the InsightId associated with the ticket.
          format: uuid
          nullable: true
        insightName:
          type: string
          description: Gets or sets the name of the insight associated with the ticket.
          nullable: true
        diagnostics:
          type: array
          items:
            $ref: '#/components/schemas/Insight'
          description: Gets or sets the diagnostics associated with the ticket.
          nullable: true
        reporter:
          $ref: '#/components/schemas/UserProfile'
        creator:
          $ref: '#/components/schemas/UserProfile'
        assigneeType:
          $ref: '#/components/schemas/AssigneeType'
        userAssignee:
          $ref: '#/components/schemas/UserProfile'
        workgroupAssignee:
          $ref: '#/components/schemas/WorkgroupAssignee'
        dueDate:
          type: string
          description: Gets or sets the due date of the ticket.
          format: date-time
          nullable: true
        externalCreatedDate:
          type: string
          description: >-
            Gets or sets the external created date of the ticket.

            This field represents the created date of the ticket in an external
            system.
          format: date-time
          nullable: true
        externalUpdatedDate:
          type: string
          description: >-
            Gets or sets the external updated date of the ticket.

            This field represents the last updated date of the ticket in an
            external system.
          format: date-time
          nullable: true
        externalId:
          type: string
          description: |-
            Gets or sets the external id of the ticket.
            This field represents the id of the ticket in an external system.
          nullable: true
        externalMetadata:
          type: string
          description: Gets or sets the external metadata of the ticket.
          nullable: true
        categoryId:
          type: string
          description: Gets or sets the category id of the ticket.
          format: uuid
          nullable: true
        jobTypeId:
          type: string
          description: Gets or sets the job type id of the ticket.
          format: uuid
          nullable: true
        serviceNeededId:
          type: string
          description: Gets or sets the service needed id of the ticket.
          format: uuid
          nullable: true
        subStatusId:
          type: string
          description: Gets or sets the sub status id of the ticket.
          format: uuid
          nullable: true
        statusId:
          type: string
          description: Gets or sets the status id of the ticket.
          format: uuid
        priorityId:
          type: string
          description: Gets or sets the priority id of the ticket.
          format: uuid
          nullable: true
        tasks:
          type: array
          items:
            $ref: '#/components/schemas/TicketTask'
          description: Gets or sets the list of tasks associated with the ticket.
          nullable: true
        customProperties:
          type: object
          additionalProperties:
            type: string
            nullable: true
          description: Gets or sets the custom properties of the ticket.
          nullable: true
        extendableSearchablePropertyKeys:
          type: array
          items:
            type: string
          description: >-
            Gets or sets the list of property keys that can be extended and
            searched.
          nullable: true
        recommendations:
          type: array
          items:
            $ref: '#/components/schemas/TicketRecommendation'
          description: Gets or sets the list of ticket's recommendations.
          nullable: true
        ticketCosts:
          type: array
          items:
            $ref: '#/components/schemas/TicketCost'
          description: Gets or sets the list of ticket costs associated with the ticket.
          nullable: true
      additionalProperties: false
      description: Create ticket request V2.
    CreateTicketServiceNeededRequest:
      required:
        - name
      type: object
      properties:
        name:
          maxLength: 500
          minLength: 0
          type: string
          description: Gets or sets the name of the service needed.
        categoryId:
          type: string
          description: Gets or sets the category Id of the service needed.
          format: uuid
          nullable: true
        locations:
          type: array
          items:
            type: string
          description: Gets or sets the space twin Ids associated with the service needed.
          nullable: true
      additionalProperties: false
      description: >-
        CreateTicketServiceNeededRequest is used to create a new service needed
        for a ticket.
    DataQuality:
      type: object
      properties:
        offline:
          type: boolean
          description: Indicates if the data is offline.
          nullable: true
        valueOutOfRange:
          type: boolean
          description: Indicates if the value is out of range.
          nullable: true
        sparse:
          type: boolean
          description: Indicates if the period is out of range.
          nullable: true
        flatline:
          type: boolean
          description: Indicates if the data has flatlined.
          nullable: true
        delayed:
          type: boolean
          description: Indicates if the data is delayed.
          nullable: true
      description: Represents data quality information.
    DigitalTwin:
      required:
        - id
        - modelId
      type: object
      properties:
        id:
          minLength: 1
          type: string
          description: The unique Id of the digital twin.
        modelId:
          minLength: 1
          type: string
          description: Digital Twin Model Identifier.
        lastUpdateTime:
          type: string
          description: Timestamp when the twin was last updated in ISO 8601 format.
          format: date-time
          nullable: true
        contents:
          type: object
          additionalProperties: {}
          description: >-
            This field will contain properties and components as defined in the
            contents section of the DTDL definition of the twin.
      additionalProperties: false
      description: DTO for Twin Entity.
      example:
        id: TW-DD-II-L01
        modelId: dtmi:com:willowinc:Level;1
        lastUpdateTime: '2024-08-30T03:49:30.4062816+00:00'
        contents:
          levelNumber: 0
          mappedIds:
            - exactType: ExternalIdentity
              scope: CONNECTOR
              scopeId: CONxxxxxxxxxxx
              value: TW-CC-II-L01
            - exactType: FloorLevelIdentity
              scope: BUILDING
              scopeId: BLDGxxxxxxxxxxxxxxx
              value: '0'
            - exactType: ExternalIdentity
              scope: ORG
              scopeId: ORG2xxxxxxxxxxx
              value: urn:willowinc:twin:id:TW-DD-II-L01
          name: Floor_1
          uniqueID: a360cf30-c112-40a1-b4b4-f65da82fa9e8
          externalID: FLRPXxxxxxxxxxxxxxxxx
          code: L01
          siteID: 104bd33c-a697-4027-b6a6-677e30a53d09
          alternateClassification:
            brickSchema:
              version: '1.3'
              code: dtmi:org:brickschema:schema:Brick:Floor;1
          externalIds:
            mappingKey: msrc:///CON5xxxxxxxxxxxxxxxx@willow-source/twin/TW-DD-II-L01
          area:
            $metadata:
              $lastUpdateTime: '2024-08-30T03:49:30.4062816Z'
    DigitalTwinModel:
      type: object
      properties:
        id:
          type: string
          description: Id of the Model.
        displayName:
          type: object
          additionalProperties:
            type: string
          description: Display Names of the Model keyed by language code.
          nullable: true
        description:
          type: object
          additionalProperties:
            type: string
          description: Description of the Model keyed by language code.
          nullable: true
        modelDefinition:
          type: string
          description: Encoded JSON string of DTDL model definition.
        uploadTime:
          type: string
          description: Timestamp when the model was uploaded in ISO 8601 format
          format: date-time
          nullable: true
      additionalProperties: false
      description: Azure Digital Twin Model DTO.
      example:
        id: dtmi:com:willowinc:Room;1
        displayName:
          en: Room
        description:
          en: >-
            A portion of space within a building that's usually enclosed and has
            its own walls, floor, and ceiling.
        modelDefinition: |-
          {"@id":"dtmi:com:willowinc:Room;1",
              "@type":"Interface",
              "displayName":{"en":"Room"},
              "description":{"en":"A portion of space within a building that's usually enclosed and has its own walls, floor, and ceiling."},
              "extends":["dtmi:com:willowinc:Space;1"],
              "contents":[{
                  "@type":"Property",
                  "name":"type",
                  "displayName":{"en":"Type"},
                  "writable": true,
                  "schema":"string"
                },
                {
                  "@type":["Property","Volume"],
                  "name":"volume",
                  "displayName":{"en":"Volume"},
                  "writable": true,
                  "schema":"double",
                  "unit":"cubicMetre"
                },
                {
                  "@type":["Property","ValueAnnotation","Override"],
                  "displayName":{"en":"volume unit"},
                  "name":"volumeUnit",
                  "annotates":"volume",
                  "overrides":"unit",
                  "schema":"VolumeUnit",
                  "writable": true
                }
              ],
              "@context":[
                "dtmi:dtdl:context;3",
                "dtmi:dtdl:extension:quantitativeTypes;1",
                "dtmi:dtdl:extension:annotation;1",
                "dtmi:dtdl:extension:overriding;1"
              ]
            }
        uploadTime: '2024-08-30T03:33:54.7015118+00:00'
    DigitalTwinRelationship:
      required:
        - targetId
        - sourceId
        - name
      type: object
      properties:
        id:
          type: string
          description: The unique Id of the relationship entity.
        targetId:
          minLength: 1
          type: string
          description: The Id of the target twin.
        sourceId:
          minLength: 1
          type: string
          description: The Id of the source twin.
        name:
          minLength: 1
          type: string
          description: >-
            The name of the relationship, which defines the type of link from
            source twin to target twin (e.g. isPartOf, locatedIn, servedBy,
            etc.. ).
        properties:
          type: object
          additionalProperties: {}
          description: >-
            Additional properties of the relationship as defined in the DTDL
            model.
      additionalProperties: false
      description: DTO for Relationship Entity.
      example:
        Id: AHU-1_isFedBy_substance_ChilledWater_Chiller-1
        targetId: Chiller-1
        sourceId: AHU-1
        name: isFedBy
        properties:
          substance: ChilledWater
    DigitalTwinWithRelationships:
      allOf:
        - $ref: '#/components/schemas/DigitalTwin'
        - type: object
          properties:
            incomingRelationships:
              type: array
              items:
                $ref: '#/components/schemas/DigitalTwinRelationship'
              description: Incoming relationships
            outgoingRelationships:
              type: array
              items:
                $ref: '#/components/schemas/DigitalTwinRelationship'
              description: Outgoing relationships
          additionalProperties: false
          description: Digital Twin Entity with incoming and outgoing relationships.
          example:
            id: TW-DD-II-L01
            modelId: dtmi:com:willowinc:Level;1
            lastUpdateTime: '2024-08-30T03:49:30.4062816+00:00'
            contents:
              levelNumber: 0
              mappedIds:
                - exactType: ExternalIdentity
                  scope: CONNECTOR
                  scopeId: CONxxxxxxxxxxx
                  value: TW-CC-II-L01
                - exactType: FloorLevelIdentity
                  scope: BUILDING
                  scopeId: BLDGxxxxxxxxxxxxxxx
                  value: '0'
                - exactType: ExternalIdentity
                  scope: ORG
                  scopeId: ORG2xxxxxxxxxxx
                  value: urn:willowinc:twin:id:TW-DD-II-L01
              name: Floor_1
              uniqueID: a360cf30-c112-40a1-b4b4-f65da82fa9e8
              externalID: FLRPXxxxxxxxxxxxxxxxx
              code: L01
              siteID: 104bd33c-a697-4027-b6a6-677e30a53d09
              alternateClassification:
                brickSchema:
                  version: '1.3'
                  code: dtmi:org:brickschema:schema:Brick:Floor;1
              externalIds:
                mappingKey: msrc:///CON5xxxxxxxxxxxxxxxx@willow-source/twin/TW-DD-II-L01
              area:
                $metadata:
                  $lastUpdateTime: '2024-08-30T03:49:30.4062816Z'
            incomingRelationships:
              - Id: Room-L01-100_isPartOf_TW-DD-II-L01
                targetId: TW-DD-II-L01
                sourceId: Room-L01-100
                name: isPartOf
            outgoingRelationships:
              - Id: TW-DD-II-L01_isPartOf_BLDG-1
                targetId: BLDG-1
                sourceId: TW-DD-II-L01
                name: isPartOf
    ErrorData:
      type: object
      properties:
        message:
          type: string
          description: Gets or sets the error message.
          nullable: true
        ids:
          type: array
          description: Gets or sets the IDs of the operation.
          nullable: true
      description: Error data.
    Event:
      required:
        - name
        - startTime
        - eventTypeId
        - payload
        - payloadVersion
        - twinId
        - createdDate
        - lastModifiedDate
      type: object
      properties:
        id:
          type: string
          description: Gets the event id which acts as the primary key in the database.
          format: uuid
        name:
          type: string
          description: Gets or sets the event name.
          nullable: true
        description:
          type: string
          description: Gets or sets the event description.
          nullable: true
        startTime:
          type: string
          description: Gets or sets the event start time.
          format: date-time
        endTime:
          type: string
          description: Gets or sets the event end time.
          format: date-time
          nullable: true
        eventTypeId:
          type: integer
          description: >-
            Gets the event type id which is defined by Willow, e.g.
            CalendarEvent, WeatherForecast, UtilityBill, ….
          format: int32
        eventSourceId:
          type: string
          description: >-
            Gets the name of the source system, which is for informational
            purposes.
          nullable: true
        externalId:
          type: string
          description: >-
            Gets an Id linking it to the source system, facilitating updates and
            deletes.
          nullable: true
        payload:
          type: string
          description: Gets or sets a JSON string containing type-specific values.
          nullable: true
        payloadVersion:
          type: string
          description: >-
            Gets or sets a version for the payload to assist in the
            deserialization of the payload.
          nullable: true
        scalarValue:
          type: number
          description: >-
            Gets or sets a double value that may be stored to complement the
            Payload value.
          format: double
          nullable: true
        twinId:
          type: string
          description: >-
            Gets the id of the twin that is a reference to to an existing space,
            or equipment twin.
          nullable: true
        locations:
          type: string
          description: >-
            Gets or sets a JSON string with the expanded location ancestors for
            the twinId.
          nullable: true
        createdDate:
          type: string
          description: Gets or sets the date the event was created in the system.
          format: date-time
        lastModifiedDate:
          type: string
          description: Gets or sets the date the event was last modified in the system.
          format: date-time
      description: Represents an event instance.
    EventsPutResponse:
      type: object
      properties:
        eventsCreatedCount:
          type: integer
          description: Gets or sets the number of created events.
          format: int32
        eventsUpdatedCount:
          type: integer
          description: Gets or sets the number of updated events.
          format: int32
      description: Response to upserting events.
    EventsUploadResponse:
      type: object
      properties:
        fileUploaded:
          type: object
          additionalProperties:
            type: string
          description: Gets the dictionary of file names and any error messages.
      description: Response to uploading events files.
    EventTypeRecord:
      required:
        - id
        - name
      type: object
      properties:
        id:
          type: integer
          description: The unique identifier for the event type.
          format: int32
        name:
          type: string
          description: The name of the event type.
      description: Represents an event type as Id and Name.
    FilterConditionOperators:
      enum:
        - And
        - Or
    FilterSpecification:
      required:
        - field
        - operator
      type: object
      properties:
        field:
          type: string
        operator:
          type: string
        value: {}
        filterConditionOperator:
          oneOf:
            - additionalProperties: {}
            - $ref: '#/components/schemas/FilterConditionOperators'
    FilterSpecification1:
      required:
        - field
        - operator
      type: object
      properties:
        field:
          minLength: 1
          type: string
        operator:
          minLength: 1
          type: string
        value:
          additionalProperties: {}
        filterConditionOperator:
          type: string
          allOf:
            - $ref: '#/components/schemas/FilterConditionOperators'
          nullable: true
      additionalProperties: false
    GetTelemetryResult:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/TelemetryData'
          description: Gets or sets the data.
          nullable: true
        continuationToken:
          type: string
          description: Gets or sets the continuation token.
          nullable: true
        errorList:
          oneOf:
            - additionalProperties: {}
            - $ref: '#/components/schemas/ErrorData'
      description: Get telemetry result.
      example:
        data:
          - connectorId: TW-CC-01
            twinId: TW-DD-II-01
            externalId: PNTC4Jm8vXy7bWq9rT5sHkLz2p
            sourceTimestamp: '2024-10-01T12:34:56Z'
            scalarValue: 42
            properties:
              customerEquipmentId: X-1234
            dataQuality:
              offline: false
              valueOutOfRange: false
              sparse: false
              flatline: false
              delayed: false
        continuationToken: CgAAYQAAAAAAABQ...
        errorData:
          message: Error message
          ids:
            - TW-DD-II-02
    GetTwinGraphRequest:
      type: object
      properties:
        alias:
          type: string
          description: Name of the Primary Twin Collection.
        id:
          type: string
          description: DtId of the Primary Twin.
        relationships:
          type: array
          items:
            $ref: '#/components/schemas/RequestGraphRelationship'
          description: Graph relationship definition to retrieve the related twins.
      additionalProperties: false
      description: Get Twin Graph Request.
      example:
        id: PNT2Uga
        alias: Twin
        relationships:
          - alias: Components
            relationshipNames:
              - isPartOf
            modelNames:
              - dtmi:com:willowinc:Fan;1
            exactModelMatch: false
            direction: Incoming
            relationship:
              alias: ComponentPoints
              relationshipNames:
                - isCapabilityOf
              modelNames: []
              exactModelMatch: false
              direction: Incoming
              relationship: {}
          - alias: TwinPoints
            relationshipNames:
              - isCapabilityOf
            modelNames: []
            exactModelMatch: false
            direction: Incoming
            relationship: {}
    GetTwinsCountRequest:
      allOf:
        - $ref: '#/components/schemas/RequestTwinFilter'
        - type: object
          additionalProperties: false
          description: Get Twins Count Request for V2 Implementation
          example:
            ModelFilter:
              ModelIds:
                - dtmi:com:willowinc:Room;1
              ExactModelMatch: true
            RelationshipFilter:
              RelationshipDirection: Outgoing
              RelationshipNames:
                - isPartOf
                - isDocumentOf
                - isCapabilityOf
                - locatedIn
                - hostedBy
                - includedIn
                - servedBy
              RelatedModelFilter:
                ModelIds:
                  - dtmi:com:willowinc:Level;1
                ExactModelMatch: true
            LocationFilter:
              LocationId: null
            DateFilter:
              LastUpdatedAfter: '2024-09-23T15:16:03.405Z'
              LastUpdatedBefore: '2024-09-23T15:16:03.405Z'
            PropertyFilter:
              Filters:
                - Field: externalID
                  Operator: '='
                  Value: ExX12345
              FilterConditionOperator: and
    GetTwinsRequest:
      allOf:
        - $ref: '#/components/schemas/RequestTwinFilter'
        - type: object
          properties:
            include:
              $ref: '#/components/schemas/RequestIncludeOption'
            pageSize:
              maximum: 1000
              minimum: 1
              type: integer
              description: >-
                Maximum number of twins to return per request. Minimum is 1 and
                Maximum is 1000.
              format: int32
            continuationToken:
              type: string
              description: >-
                Continuation Token for subsequent requests. Set the Continuation
                token for the initial request.
              nullable: true
          additionalProperties: false
          description: Get Twins Request for V2 Implementation
          example:
            ModelFilter:
              ModelIds:
                - dtmi:com:willowinc:Room;1
              ExactModelMatch: true
            RelationshipFilter:
              RelationshipDirection: Outgoing
              RelationshipNames:
                - isPartOf
                - isDocumentOf
                - isCapabilityOf
                - locatedIn
                - hostedBy
                - includedIn
                - servedBy
              RelatedModelFilter:
                ModelIds:
                  - dtmi:com:willowinc:Level;1
                ExactModelMatch: true
            LocationFilter:
              LocationId: null
            DateFilter:
              LastUpdatedAfter: '2024-09-23T15:16:03.405Z'
              LastUpdatedBefore: '2024-09-23T15:16:03.405Z'
            PropertyFilter:
              Filters:
                - Field: externalID
                  Operator: in
                  Value:
                    - ExX12345
              FilterConditionOperator: and
            Include:
              OutgoingRelationships: true
              IncomingRelationships: true
            PageSize: 101
            ContinuationToken: null
    HttpValidationProblemDetails:
      allOf:
        - $ref: '#/components/schemas/ProblemDetails'
        - type: object
          properties:
            errors:
              type: object
              additionalProperties:
                type: array
                items:
                  type: string
          additionalProperties: {}
    IBatchOfEvent:
      type: object
      properties:
        before:
          type: integer
          format: int32
        after:
          type: integer
          format: int32
        total:
          type: integer
          format: int32
        items:
          type: array
          items:
            $ref: '#/components/schemas/Event'
          nullable: true
    IContractResolver:
      type: object
      additionalProperties: false
    IdName:
      type: object
      properties:
        id:
          type: string
          format: uuid
        name:
          type: string
          nullable: true
      additionalProperties: false
    IFormFile:
      type: string
      format: binary
    ImpactScore:
      type: object
      properties:
        name:
          type: string
          description: Gets or sets the name of the impact score.
          nullable: true
        fieldId:
          type: string
          description: Gets or sets the field ID of the impact score.
          nullable: true
        value:
          type: number
          description: Gets or sets the value of the impact score.
          format: double
        unit:
          type: string
          description: Gets or sets the unit of the impact score.
          nullable: true
        externalId:
          type: string
          description: Gets or sets the external ID that matches a time series in ADX.
          nullable: true
        ruleId:
          type: string
          description: Gets or sets the rule ID associated with the impact score.
          nullable: true
      additionalProperties: false
      description: Represents an impact score with associated metadata.
    IncomingTelemetry:
      required:
        - connectorId
        - sourceTimestamp
        - scalarValue
      type: object
      properties:
        connectorId:
          type: string
          description: Id of the connector
        dtId:
          type: string
          description: Id of the twin
          nullable: true
        externalId:
          type: string
          description: External Id of the twin
          nullable: true
        sourceTimestamp:
          type: string
          description: Timestamp when the source recorded the value in ISO 8601 format
          format: date-time
        scalarValue:
          type: object
          anyOf:
            - type: number
            - enum:
                - NaN
                - Infinity
                - '-Infinity'
          description: The data value being trended
          format: double
        properties:
          type: object
          description: Properties or metadata about the observation or event being trended.
      description: Incoming telemetry data.
      example:
        connectorId: TW-CC-01
        twinId: TW-DD-II-01
        externalId: PNTC4Jm8vXy7bWq9rT5sHkLz2p
        sourceTimestamp: '2024-10-01T12:34:56Z'
        scalarValue: 42
        properties:
          customerEquipmentId: X-1234
    Insight:
      type: object
      properties:
        id:
          type: string
          description: Gets or sets the unique identifier of the insight.
          format: uuid
        customerId:
          type: string
          description: >-
            Gets or sets the unique identifier of the customer associated with
            the insight.
          format: uuid
        siteId:
          type: string
          description: >-
            Gets or sets the unique identifier of the site associated with the
            insight.
          format: uuid
        sequenceNumber:
          type: string
          description: Gets or sets the sequence number of the insight.
          nullable: true
        equipmentId:
          type: string
          description: >-
            Gets or sets the unique identifier of the equipment associated with
            the insight.
          format: uuid
          nullable: true
        twinId:
          type: string
          description: Gets or sets the twin identifier of the insight.
          nullable: true
        twinName:
          type: string
          description: Gets or sets the name of the twin associated with the insight.
          nullable: true
        type:
          allOf:
            - $ref: '#/components/schemas/InsightCategory'
          description: Gets or sets the type of the insight.
          deprecated: true
        insightType:
          allOf:
            - $ref: '#/components/schemas/InsightType'
          description: Gets or sets the type of the insight (standard or scenario).
        category:
          allOf:
            - $ref: '#/components/schemas/InsightCategory'
          description: Gets or sets the category of the insight.
        name:
          type: string
          description: Gets or sets the name of the insight.
          nullable: true
        description:
          type: string
          description: Gets or sets the description of the insight.
          nullable: true
        recommendation:
          type: string
          description: Gets or sets the recommendation for the insight.
          nullable: true
        impactScores:
          type: array
          items:
            $ref: '#/components/schemas/ImpactScore'
          description: Gets or sets the impact scores associated with the insight.
          nullable: true
        priority:
          type: integer
          description: Gets or sets the priority of the insight.
          format: int32
        lastStatus:
          allOf:
            - $ref: '#/components/schemas/InsightStatus'
          description: Gets or sets the last status of the insight.
        state:
          allOf:
            - $ref: '#/components/schemas/InsightState'
          description: Gets or sets the state of the insight.
        createdDate:
          type: string
          description: Gets or sets the date when the insight was created.
          format: date-time
        updatedDate:
          type: string
          description: Gets or sets the date when the insight was last updated.
          format: date-time
        occurredDate:
          type: string
          description: Gets or sets the date when the insight occurred.
          format: date-time
        detectedDate:
          type: string
          description: Gets or sets the date when the insight was detected.
          format: date-time
        sourceType:
          allOf:
            - $ref: '#/components/schemas/SourceType'
          description: Gets or sets the source type of the insight.
        sourceId:
          type: string
          description: >-
            Gets or sets the unique identifier of the source associated with the
            insight.
          format: uuid
          nullable: true
        sourceName:
          type: string
          description: Gets or sets the name of the source associated with the insight.
          nullable: true
        primaryModelId:
          type: string
          description: Gets or sets the primary model identifier of the insight.
          nullable: true
        externalId:
          type: string
          description: Gets or sets the external identifier of the insight.
          nullable: true
        externalStatus:
          type: string
          description: Gets or sets the external status of the insight.
          nullable: true
        externalMetadata:
          type: string
          description: Gets or sets the external metadata of the insight.
          nullable: true
        occurrenceCount:
          type: integer
          description: Gets or sets the occurrence count of the insight.
          format: int32
        createdUserId:
          type: string
          description: >-
            Gets or sets the unique identifier of the user who created the
            insight.
          format: uuid
          nullable: true
        ruleId:
          type: string
          description: Gets or sets the rule identifier associated with the insight.
          nullable: true
        ruleName:
          type: string
          description: Gets or sets the rule name associated with the insight.
          nullable: true
        newOccurrence:
          type: boolean
          description: >-
            Gets or sets a value indicating whether the insight is a new
            occurrence.
        previouslyIgnored:
          type: integer
          description: Gets or sets the count of times the insight was previously ignored.
          format: int32
        previouslyResolved:
          type: integer
          description: Gets or sets the count of times the insight was previously resolved.
          format: int32
        floorId:
          type: string
          description: >-
            Gets or sets the unique identifier of the floor associated with the
            insight.
          format: uuid
          nullable: true
        reported:
          type: boolean
          description: >-
            Gets or sets a value indicating whether the insight has been
            reported.
        commentCount:
          type: integer
          description: Gets or sets the comment count for the insight.
          format: int32
        lastResolvedDate:
          type: string
          description: Gets or sets the date when the insight was last resolved.
          format: date-time
          nullable: true
        lastIgnoredDate:
          type: string
          description: Gets or sets the date when the insight was last ignored.
          format: date-time
          nullable: true
        locations:
          type: array
          items:
            type: string
          description: Gets or sets the locations associated with the insight.
          nullable: true
          deprecated: true
        locationDetails:
          type: array
          items:
            $ref: '#/components/schemas/Location'
          description: >-
            Gets or sets the location details, including twin ID, name, and
            model ID.
          nullable: true
        tags:
          type: array
          items:
            type: string
          description: Gets or sets the tags associated with the insight.
          nullable: true
        isDiagnosticsData:
          type: boolean
          description: >-
            Gets or sets a value indicating whether the insight contains
            diagnostics data.
          deprecated: true
        ignoreUntil:
          type: string
          description: Gets or sets the ignore expiry date for the insight.
          format: date-time
          nullable: true
        openTicketCount:
          type: integer
          description: Gets or sets the number of open tickets for the insight.
          format: int32
        completedTicketCount:
          type: integer
          description: Gets or sets the number of Completed tickets for the insight.
          format: int32
        closedTicketCount:
          type: integer
          description: Gets or sets the number of closed tickets for the insight.
          format: int32
        ticketClosedDate:
          type: string
          description: Gets or sets the ticket closed date.
          format: date-time
          nullable: true
        ticketCompletedDate:
          type: string
          description: Gets or sets the ticket completed date.
          format: date-time
          nullable: true
        secondaryTwins:
          type: array
          items:
            $ref: '#/components/schemas/TwinSummary'
          description: >-
            Gets or sets the secondary twins "secondary components" of the
            insight.
          nullable: true
        recommendations:
          type: array
          items:
            $ref: '#/components/schemas/InsightRecommendation'
          description: Gets or sets the recommendations of the insight.
          nullable: true
        dependencyCount:
          type: integer
          description: Gets or sets the number of insight's dependencies.
          format: int32
        actionStatus:
          allOf:
            - $ref: '#/components/schemas/InsightActionStatus'
          description: Gets or sets the action status of the insight.
        scenarioId:
          type: string
          description: Gets or sets the insights parent scenario id.
          format: uuid
          nullable: true
        scenarioName:
          type: string
          description: Gets or sets the insights parent scenario name.
          nullable: true
      additionalProperties: false
      description: Represents a Data Transfer Object (DTO) for an Insight entity.
    InsightActionStatus:
      enum:
        - needsAction
        - inProgress
        - unsuccessfullyActioned
        - successfullyActioned
      type: string
      description: Represents the action status of an insight in the system.
    InsightBatch:
      type: object
      properties:
        before:
          type: integer
          format: int32
        after:
          type: integer
          format: int32
        total:
          type: integer
          format: int32
        items:
          type: array
          items:
            $ref: '#/components/schemas/Insight'
          nullable: true
      additionalProperties: false
    InsightCategory:
      enum:
        - fault
        - energy
        - alert
        - note
        - goldenStandard
        - infrastructure
        - integrityKpi
        - energyKpi
        - edgeDevice
        - dataQuality
        - commissioning
        - comfort
        - wellness
        - calibration
        - diagnostic
        - predictive
        - alarm
      type: string
      description: Represents the various types of insights available in the system.
    InsightRecommendation:
      type: object
      properties:
        id:
          type: string
          description: Gets or sets the unique identifier for the recommendation.
          format: uuid
        name:
          type: string
          description: Gets or sets the name of the recommendation.
          nullable: true
        recommendation:
          type: string
          description: Gets or sets the recommendation.
          nullable: true
        tags:
          type: array
          items:
            type: string
          description: Gets or sets the tags for recommendation.
          nullable: true
        ignored:
          type: boolean
          description: >-
            Gets or sets a value indicating whether the recommendation is
            ignored or not.
        tickets:
          type: array
          items:
            $ref: '#/components/schemas/TicketBase'
          description: Gets or sets the recommendation's tickets.
          nullable: true
      additionalProperties: false
      description: Represent the Insight Recommendation dto class.
    InsightState:
      enum:
        - inactive
        - active
        - disabled
        - insufficientData
        - archived
      type: string
      description: Represents the state of an insight.
    InsightStatus:
      enum:
        - open
        - ignored
        - inProgress
        - resolved
        - new
        - deleted
        - readyToResolve
      type: string
      description: Represents the status of an insight in the system.
    InsightType:
      enum:
        - standard
        - scenario
      type: string
      description: Represents the various types of insights available in the system.
    Location:
      type: object
      properties:
        id:
          type: string
          description: Gets or sets location Id (Scope's twinId).
          nullable: true
        name:
          type: string
          description: Gets or sets location name.
          nullable: true
        modelId:
          type: string
          description: Gets or sets location model Id.
          nullable: true
      additionalProperties: false
      description: Represents a Data Transfer Object (DTO) for a location.
    Operation:
      allOf:
        - $ref: '#/components/schemas/OperationBase'
        - type: object
          properties:
            value:
              additionalProperties: {}
          additionalProperties: false
    OperationBase:
      type: object
      properties:
        operationType:
          $ref: '#/components/schemas/OperationType'
        path:
          type: string
          nullable: true
        op:
          type: string
          nullable: true
        from:
          type: string
          nullable: true
      additionalProperties: false
    OperationType:
      enum:
        - Add
        - Remove
        - Replace
        - Move
        - Copy
        - Test
        - Invalid
      type: string
      description: ''
      x-enumNames:
        - Add
        - Remove
        - Replace
        - Move
        - Copy
        - Test
        - Invalid
    PageOfDigitalTwinWithRelationships:
      type: object
      properties:
        content:
          type: array
          items:
            $ref: '#/components/schemas/DigitalTwinWithRelationships'
          description: Gets or sets the collection of items contained in the response.
        continuationToken:
          type: string
          description: >-
            Gets or sets the continuation token used to retrieve the next page
            of results in a paginated operation.
          nullable: true
      additionalProperties: false
      description: >-
        Represents a single page of results in a paginated collection, including
        the items and a continuation token for

        retrieving the next page.
    PatchTicketRequestJsonPatchDocument:
      type: array
      items:
        type: object
        properties:
          op:
            type: string
            description: The operation to be performed.
          path:
            type: string
            description: A JSON Pointer path to the target location.
          value:
            type: object
            description: The value to be used in the operation.
      properties:
        operations:
          type: array
          items:
            $ref: '#/components/schemas/PatchTicketRequestOperation'
          nullable: true
          readOnly: true
        contractResolver:
          $ref: '#/components/schemas/IContractResolver'
      additionalProperties: false
    PatchTicketRequestOperation:
      type: object
      properties:
        operationType:
          $ref: '#/components/schemas/OperationType'
        path:
          type: string
          nullable: true
        op:
          type: string
          nullable: true
        from:
          type: string
          nullable: true
        value:
          additionalProperties: {}
      additionalProperties: false
    ProblemDetails:
      type: object
      properties:
        type:
          type: string
          nullable: true
        title:
          type: string
          nullable: true
        status:
          type: integer
          format: int32
          nullable: true
        detail:
          type: string
          nullable: true
        instance:
          type: string
          nullable: true
    RelationshipDirection:
      enum:
        - Incoming
        - Outgoing
        - IncomingOrOutgoing
      type: string
      description: Twin Relationship Direction.
      x-enumNames:
        - Incoming
        - Outgoing
        - IncomingOrOutgoing
    RelationshipType:
      enum:
        - isPartOf
        - isDocumentOf
        - hasDocument
        - isCapabilityOf
        - locatedIn
        - hostedBy
        - includedIn
        - servedBy
        - leasee
        - hasLease
        - locatedInGridRegion
        - isParameterOf
        - isFedBy
        - subMeterOf
        - serves
        - ownedBy
        - manufacturedBy
        - serviceResponsibility
        - installedBy
        - servicedBy
      type: string
      description: Type of Digital Twin Relationship.
      x-enumNames:
        - isPartOf
        - isDocumentOf
        - hasDocument
        - isCapabilityOf
        - locatedIn
        - hostedBy
        - includedIn
        - servedBy
        - leasee
        - hasLease
        - locatedInGridRegion
        - isParameterOf
        - isFedBy
        - subMeterOf
        - serves
        - ownedBy
        - manufacturedBy
        - serviceResponsibility
        - installedBy
        - servicedBy
    RequestDateFilter:
      type: object
      properties:
        lastUpdatedAfter:
          type: string
          description: Filters twins with LastUpdatedTime greater than the given date time.
          format: date-time
          nullable: true
        lastUpdatedBefore:
          type: string
          description: Filters twins with LastUpdatedTime less than the given date time.
          format: date-time
          nullable: true
      additionalProperties: false
      description: Date Filter Class for Get Twins Request.
    RequestGraphRelationship:
      type: object
      properties:
        alias:
          type: string
          description: Name of the Related Twin Collection.
        relationshipNames:
          type: array
          items:
            $ref: '#/components/schemas/RelationshipType'
          description: >-
            Array of relationship names to filter, if empty all relationship
            names will be considered.
        modelNames:
          type: array
          items:
            type: string
          description: >-
            Array of Model Names to filter, if empty all model twins will be
            considered.

            Get Twin Graph Request will match input models (and its descendants
            if exact Model match is false).
        exactModelMatch:
          type: boolean
          description: >-
            Gets a value indicating whether the model match is exact. Default is
            false.
        direction:
          $ref: '#/components/schemas/RelationshipDirection'
        relationship:
          $ref: '#/components/schemas/RequestGraphRelationship'
      additionalProperties: false
      description: Request to retrieve graph relationship twins.
    RequestIncludeOption:
      type: object
      properties:
        outgoingRelationships:
          type: boolean
          description: True to include twin outgoing relationships; false otherwise.
        incomingRelationships:
          type: boolean
          description: True to include twin incoming relationships; false otherwise.
      additionalProperties: false
      description: Include Option Class for Get Twins Request.
    RequestLocationFilter:
      type: object
      properties:
        locationId:
          type: string
          description: Location Id to filter the twins.
          nullable: true
      additionalProperties: false
      description: Location Filter Class for Get Twins Request.
    RequestModelFilter:
      type: object
      properties:
        modelIds:
          type: array
          items:
            type: string
          description: Array of twin model Id twins to retrieve.
        exactModelMatch:
          type: boolean
          description: >-
            True to only include twins that are instances of the exact model id
            specified,

            False(default) to include twins that are instances of the model id
            or any of its subclasses.
      additionalProperties: false
      description: Model Filter Class for Get Twins Request.
    RequestPropertyFilter:
      type: object
      properties:
        field:
          type: string
          description: Gets or set the field Name.
          nullable: true
        operator:
          type: string
          description: Gets or sets the operator. Forwards the value to the base class.
          nullable: true
        value:
          additionalProperties: {}
          description: Gets or sets the value.
        filterConditionOperator:
          $ref: '#/components/schemas/FilterConditionOperators'
        filters:
          type: array
          items:
            $ref: '#/components/schemas/RequestPropertyFilter'
          description: >-
            A list of filter group specifications represented by
            FilterSpecificationDto objects.
      additionalProperties: false
      description: >-
        Represents a group of filter specifications. Contains a list of
        individual filter specifications.
    RequestRelationshipFilter:
      type: object
      properties:
        relationshipDirection:
          $ref: '#/components/schemas/RelationshipDirection'
        relationshipNames:
          type: array
          items:
            $ref: '#/components/schemas/RelationshipType'
          description: Array of related relationship names.
          nullable: true
        relatedModelFilter:
          $ref: '#/components/schemas/RequestModelFilter'
      additionalProperties: false
      description: Get Twins Request Relationship Filter
    RequestTwinFilter:
      type: object
      properties:
        modelFilter:
          $ref: '#/components/schemas/RequestModelFilter'
        relationshipFilter:
          $ref: '#/components/schemas/RequestRelationshipFilter'
        locationFilter:
          $ref: '#/components/schemas/RequestLocationFilter'
        dateFilter:
          $ref: '#/components/schemas/RequestDateFilter'
        propertyFilter:
          $ref: '#/components/schemas/RequestPropertyFilter'
      additionalProperties: false
      description: Twin Request Filters.
      x-abstract: true
    SortSpecification:
      required:
        - field
      type: object
      properties:
        field:
          type: string
        sort:
          type: string
          nullable: true
        isSortDescending:
          type: boolean
    SourceType:
      enum:
        - Adx
        - AdtQuery
        - AdtMemory
        - Acs
      type: string
      description: Specifies the available data source types for queries and operations.
      x-enumNames:
        - Adx
        - AdtQuery
        - AdtMemory
        - Acs
    TaskType:
      enum:
        - numeric
        - checkbox
      type: string
      description: Specifies the type of task.
    TelemetryData:
      type: object
      properties:
        connectorId:
          type: string
          description: Id of the connector
          nullable: true
        twinId:
          type: string
          description: Id of the twin
          nullable: true
        externalId:
          type: string
          description: External Id of the twin
          nullable: true
        sourceTimestamp:
          type: string
          description: Timestamp when the source recorded the value in ISO 8601 format
          format: date-time
        enqueuedTimestamp:
          type: string
          description: Timestamp when Willow received the value in ISO 8601 format
          format: date-time
        scalarValue:
          oneOf:
            - type: number
              nullable: true
            - type: string
              nullable: true
            - type: boolean
              nullable: true
            - type: integer
              nullable: true
          description: The data value being trended
        properties:
          type: object
          description: Properties or metadata about the observation or event being trended.
        dataQuality:
          oneOf:
            - additionalProperties: {}
            - $ref: '#/components/schemas/DataQuality'
      description: Represents telemetry data.
      example:
        connectorId: TW-CC-01
        twinId: TW-DD-II-01
        externalId: PNTC4Jm8vXy7bWq9rT5sHkLz2p
        sourceTimestamp: '2024-10-01T12:34:56Z'
        enqueuedTimestamp: '2024-10-01T12:35:00Z'
        scalarValue: 42
        properties:
          customerEquipmentId: X-1234
        dataQuality:
          offline: false
          valueOutOfRange: false
          sparse: false
          flatline: false
          delayed: false
    TicketBase:
      type: object
      properties:
        id:
          type: string
          description: Gets or sets the ticket id.
          format: uuid
        summary:
          type: string
          description: Gets or sets the ticket summary.
          nullable: true
        createdDate:
          type: string
          description: Gets or sets the ticket created date.
          format: date-time
        ticketStatus:
          type: object
          allOf:
            - $ref: '#/components/schemas/TicketStatus'
          description: Gets or sets the ticket status details.
          nullable: true
      additionalProperties: false
      description: Represent the Ticket base dto class.
    TicketCategory:
      type: object
      properties:
        id:
          type: string
          description: Gets or sets the ticket category id.
          format: uuid
        name:
          type: string
          description: Gets or sets the category name.
          nullable: true
        isActive:
          type: boolean
          description: >-
            Gets or sets a value indicating whether the category is active or
            not.
        locations:
          type: array
          items:
            type: string
          description: >-
            Gets or sets the list of locations associated with the ticket
            category.
          nullable: true
      additionalProperties: false
      description: Represents a ticket category in the workflow system.
    TicketCategoryBatch:
      type: object
      properties:
        before:
          type: integer
          format: int32
        after:
          type: integer
          format: int32
        total:
          type: integer
          format: int32
        items:
          type: array
          items:
            $ref: '#/components/schemas/TicketCategory'
          nullable: true
      additionalProperties: false
    TicketCost:
      type: object
      properties:
        phase:
          $ref: '#/components/schemas/TicketCostPhase'
        category:
          $ref: '#/components/schemas/TicketCostCategory'
        unit:
          type: string
          description: Gets or sets the unit of measurement associated with the value.
          nullable: true
        value:
          type: number
          description: Gets or sets the numeric value represented by this instance.
          format: double
      additionalProperties: false
      description: Represents the cost details associated with a ticket.
    TicketCostCategory:
      enum:
        - tool
        - material
        - labor
        - total
      type: string
      description: >-
        Specifies the category of cost associated with a ticket, such as tools,
        materials, labor, or the total cost.
    TicketCostPhase:
      enum:
        - estimated
        - planned
        - actual
      type: string
      description: >-
        Specifies the phase of ticket cost tracking, indicating whether the cost
        is estimated, planned, or actual.
    TicketDetail:
      type: object
      properties:
        id:
          type: string
          description: Gets or sets the unique identifier for the ticket.
          format: uuid
        ticketPriority:
          $ref: '#/components/schemas/TicketPriority'
        ticketStatus:
          $ref: '#/components/schemas/TicketStatus'
        insightId:
          type: string
          description: Gets or sets the insight identifier associated with the ticket.
          format: uuid
          nullable: true
        summary:
          type: string
          description: Gets or sets the summary of the ticket.
          nullable: true
        description:
          type: string
          description: Gets or sets the description of the ticket.
          nullable: true
        cause:
          type: string
          description: >-
            Gets or sets the description of the underlying reason or cause
            associated with this instance.
          nullable: true
        solution:
          type: string
          description: Gets or sets the solution text associated with the ticket.
          nullable: true
        reporter:
          $ref: '#/components/schemas/UserProfile'
        assigneeType:
          $ref: '#/components/schemas/AssigneeType'
        userAssignee:
          $ref: '#/components/schemas/UserProfile'
        workgroupAssignee:
          $ref: '#/components/schemas/WorkgroupAssignee'
        creator:
          $ref: '#/components/schemas/UserProfile'
        dueDate:
          type: string
          description: Gets or sets the due date of the ticket.
          format: date-time
          nullable: true
        createdDate:
          type: string
          description: Gets or sets the date when the ticket was created.
          format: date-time
        updatedDate:
          type: string
          description: Gets or sets the date when the ticket was last updated.
          format: date-time
        startedDate:
          type: string
          description: Gets or sets the date when the ticket was started.
          format: date-time
          nullable: true
        resolvedDate:
          type: string
          description: Gets or sets the date when the ticket was resolved.
          format: date-time
          nullable: true
        closedDate:
          type: string
          description: Gets or sets the date when the ticket was closed.
          format: date-time
          nullable: true
        sourceType:
          $ref: '#/components/schemas/SourceType'
        sourceName:
          type: string
          description: >-
            Gets or sets the name of the source from which the ticket
            originated.
          nullable: true
        externalId:
          type: string
          description: Gets or sets the external identifier of the ticket.
          nullable: true
        externalCreatedDate:
          type: string
          description: >-
            Gets or sets the date when the ticket was created in an external
            system.
          format: date-time
          nullable: true
        externalUpdatedDate:
          type: string
          description: >-
            Gets or sets the date when the ticket was last updated in an
            external system.
          format: date-time
          nullable: true
        latitude:
          type: number
          description: Gets or sets the latitude of the ticket's location.
          format: double
          nullable: true
        longitude:
          type: number
          description: Gets or sets the longitude of the ticket's location.
          format: double
          nullable: true
        customProperties:
          type: object
          additionalProperties:
            type: string
            nullable: true
          description: Gets or sets the custom properties associated with the ticket.
          nullable: true
        extendableSearchablePropertyKeys:
          type: array
          items:
            type: string
          description: >-
            Gets or sets the list of extendable searchable property keys
            associated with the ticket.
          nullable: true
        scheduledDate:
          type: string
          description: Gets or sets the scheduled date for the ticket.
          format: date-time
          nullable: true
        occurrence:
          type: integer
          description: Gets or sets the occurrence count of the ticket.
          format: int32
        locations:
          type: array
          items:
            $ref: '#/components/schemas/Location'
          description: Gets or sets the list of ticket locations.
          nullable: true
        twin:
          $ref: '#/components/schemas/BaseTwin'
        recommendations:
          type: array
          items:
            $ref: '#/components/schemas/TicketRecommendation'
          description: Gets or sets the list of ticket's recommendations.
          nullable: true
        category:
          $ref: '#/components/schemas/IdName'
        jobType:
          $ref: '#/components/schemas/IdName'
        serviceNeeded:
          $ref: '#/components/schemas/IdName'
        subStatus:
          $ref: '#/components/schemas/IdName'
        comments:
          type: array
          items:
            $ref: '#/components/schemas/Comment'
          description: Gets or sets the comments associated with the ticket.
          nullable: true
        attachments:
          type: array
          items:
            $ref: '#/components/schemas/AttachmentDetails'
          description: Gets or sets the attachments associated with the ticket.
          nullable: true
        ticketCosts:
          type: array
          items:
            $ref: '#/components/schemas/TicketCost'
          description: Gets or sets the list of ticket costs associated with the ticket.
          nullable: true
      additionalProperties: false
      description: Data for detailed ticket information.
    TicketJobType:
      type: object
      properties:
        id:
          type: string
          description: Gets or sets the unique identifier for the job type.
          format: uuid
        name:
          type: string
          description: Gets or sets the name of the job type.
          nullable: true
        isActive:
          type: boolean
          description: Gets or sets a value indicating whether JobType is active.
      additionalProperties: false
      description: Represents a type of job type.
    TicketJobTypeBatch:
      type: object
      properties:
        before:
          type: integer
          format: int32
        after:
          type: integer
          format: int32
        total:
          type: integer
          format: int32
        items:
          type: array
          items:
            $ref: '#/components/schemas/TicketJobType'
          nullable: true
      additionalProperties: false
    TicketPriority:
      type: object
      properties:
        id:
          type: string
          description: Gets or sets the unique identifier for the ticket priority.
          format: uuid
        name:
          type: string
          description: Gets or sets the name of the ticket priority.
          nullable: true
        priorityLevel:
          $ref: '#/components/schemas/TicketPriorityLevel'
      additionalProperties: false
    TicketPriorityLevel:
      enum:
        - urgent
        - high
        - medium
        - low
      type: string
      description: >-
        Ticket priority levels.

        These are the standardized priority levels recognized by Willow that can
        be assigned to tickets.

        Custom priority levels should be mapped to these standard levels so the
        system can interpret them consistently.
    TicketRecommendation:
      type: object
      properties:
        id:
          type: string
          description: Gets or sets the unique identifier for the recommendation entity.
          format: uuid
        name:
          type: string
          description: Gets or sets the name of the recommendation.
          nullable: true
        recommendation:
          type: string
          description: Gets or sets the recommendation.
          nullable: true
        tags:
          type: array
          items:
            type: string
          description: Gets or sets the tags for recommendation.
          nullable: true
      additionalProperties: false
      description: Represents a ticket recommendation model.
    TicketServiceNeeded:
      type: object
      properties:
        id:
          type: string
          description: Gets or sets the unique identifier for the service needed.
          format: uuid
        name:
          type: string
          description: Gets or sets the name of the service needed.
          nullable: true
        categoryId:
          type: string
          description: Gets or sets the category Id of the service needed.
          format: uuid
          nullable: true
        locations:
          type: array
          items:
            type: string
          description: Gets or sets the locations associated with the service needed.
          nullable: true
        isActive:
          type: boolean
          description: >-
            Gets or sets a value indicating whether service needed is active or
            not.
      additionalProperties: false
    TicketServiceNeededBatch:
      type: object
      properties:
        before:
          type: integer
          format: int32
        after:
          type: integer
          format: int32
        total:
          type: integer
          format: int32
        items:
          type: array
          items:
            $ref: '#/components/schemas/TicketServiceNeeded'
          nullable: true
      additionalProperties: false
    TicketSimple:
      type: object
      properties:
        id:
          type: string
          description: Gets or sets the unique identifier for the ticket.
          format: uuid
        ticketPriority:
          $ref: '#/components/schemas/TicketPriority'
        ticketStatus:
          $ref: '#/components/schemas/TicketStatus'
        insightId:
          type: string
          description: Gets or sets the insight identifier associated with the ticket.
          format: uuid
          nullable: true
        summary:
          type: string
          description: Gets or sets the summary of the ticket.
          nullable: true
        description:
          type: string
          description: Gets or sets the description of the ticket.
          nullable: true
        cause:
          type: string
          description: >-
            Gets or sets the description of the underlying reason or cause
            associated with this instance.
          nullable: true
        solution:
          type: string
          description: Gets or sets the solution text associated with the ticket.
          nullable: true
        reporter:
          $ref: '#/components/schemas/UserProfile'
        assigneeType:
          $ref: '#/components/schemas/AssigneeType'
        userAssignee:
          $ref: '#/components/schemas/UserProfile'
        workgroupAssignee:
          $ref: '#/components/schemas/WorkgroupAssignee'
        creator:
          $ref: '#/components/schemas/UserProfile'
        dueDate:
          type: string
          description: Gets or sets the due date of the ticket.
          format: date-time
          nullable: true
        createdDate:
          type: string
          description: Gets or sets the date when the ticket was created.
          format: date-time
        updatedDate:
          type: string
          description: Gets or sets the date when the ticket was last updated.
          format: date-time
        startedDate:
          type: string
          description: Gets or sets the date when the ticket was started.
          format: date-time
          nullable: true
        resolvedDate:
          type: string
          description: Gets or sets the date when the ticket was resolved.
          format: date-time
          nullable: true
        closedDate:
          type: string
          description: Gets or sets the date when the ticket was closed.
          format: date-time
          nullable: true
        sourceType:
          $ref: '#/components/schemas/SourceType'
        sourceName:
          type: string
          description: >-
            Gets or sets the name of the source from which the ticket
            originated.
          nullable: true
        externalId:
          type: string
          description: Gets or sets the external identifier of the ticket.
          nullable: true
        externalCreatedDate:
          type: string
          description: >-
            Gets or sets the date when the ticket was created in an external
            system.
          format: date-time
          nullable: true
        externalUpdatedDate:
          type: string
          description: >-
            Gets or sets the date when the ticket was last updated in an
            external system.
          format: date-time
          nullable: true
        latitude:
          type: number
          description: Gets or sets the latitude of the ticket's location.
          format: double
          nullable: true
        longitude:
          type: number
          description: Gets or sets the longitude of the ticket's location.
          format: double
          nullable: true
        customProperties:
          type: object
          additionalProperties:
            type: string
            nullable: true
          description: Gets or sets the custom properties associated with the ticket.
          nullable: true
        extendableSearchablePropertyKeys:
          type: array
          items:
            type: string
          description: >-
            Gets or sets the list of extendable searchable property keys
            associated with the ticket.
          nullable: true
        scheduledDate:
          type: string
          description: Gets or sets the scheduled date for the ticket.
          format: date-time
          nullable: true
        occurrence:
          type: integer
          description: Gets or sets the occurrence count of the ticket.
          format: int32
        locations:
          type: array
          items:
            $ref: '#/components/schemas/Location'
          description: Gets or sets the list of ticket locations.
          nullable: true
        twin:
          $ref: '#/components/schemas/BaseTwin'
        recommendations:
          type: array
          items:
            $ref: '#/components/schemas/TicketRecommendation'
          description: Gets or sets the list of ticket's recommendations.
          nullable: true
        categoryId:
          type: string
          description: >-
            Gets or sets the unique identifier of the category associated with
            the ticket.
          format: uuid
          nullable: true
        jobTypeId:
          type: string
          description: >-
            Gets or sets the unique identifier of the job type associated with
            the ticket.
          format: uuid
          nullable: true
        serviceNeededId:
          type: string
          description: >-
            Gets or sets the unique identifier of the service needed for the
            ticket.
          format: uuid
          nullable: true
        subStatusId:
          type: string
          description: >-
            Gets or sets the unique identifier of the sub-status associated with
            the ticket.
          format: uuid
          nullable: true
      additionalProperties: false
    TicketSimpleBatch:
      type: object
      properties:
        before:
          type: integer
          format: int32
        after:
          type: integer
          format: int32
        total:
          type: integer
          format: int32
        items:
          type: array
          items:
            $ref: '#/components/schemas/TicketSimple'
          nullable: true
      additionalProperties: false
    TicketStatus:
      type: object
      properties:
        id:
          type: string
          description: Gets or sets the unique identifier for the ticket status.
          format: uuid
        name:
          type: string
          description: Gets or sets the name of the ticket status.
          nullable: true
        tab:
          type: string
          description: >-
            Gets or sets the status's tab that can be used to filter ticket
            status in UI.
          nullable: true
        color:
          type: string
          description: Gets or sets the color associated with the ticket status.
          nullable: true
      additionalProperties: false
      description: Represent the Ticket status dto class.
    TicketTask:
      type: object
      properties:
        id:
          type: string
          description: Gets or sets the unique identifier.
          format: uuid
        taskName:
          type: string
          description: Gets or sets the task name.
          nullable: true
        isCompleted:
          type: boolean
          description: Gets or sets a value indicating whether the task is completed.
        order:
          type: integer
          description: Gets or sets the display order.
          format: int32
        numberValue:
          type: number
          description: Gets or sets the numeric value for the task.
          format: double
          nullable: true
        type:
          $ref: '#/components/schemas/TaskType'
        decimalPlaces:
          type: integer
          description: Gets or sets the number of decimal places.
          format: int32
          nullable: true
        minValue:
          type: number
          description: Gets or sets the minimum value.
          format: double
          nullable: true
        maxValue:
          type: number
          description: Gets or sets the maximum value.
          format: double
          nullable: true
        unit:
          type: string
          description: Gets or sets the unit of measurement.
          nullable: true
      additionalProperties: false
      description: Represents a task associated with a ticket.
    TwinSummary:
      type: object
      properties:
        id:
          type: string
          description: Gets or sets twin Id.
          nullable: true
        name:
          type: string
          description: Gets or sets twin Name.
          nullable: true
        modelId:
          type: string
          description: Gets or sets model id.
          nullable: true
        eTag:
          type: string
          description: Gets or sets unique tag of location for changes.
          nullable: true
      additionalProperties: false
      description: Twin summary details.
    UpdateTicketCategoryRequest:
      type: object
      properties:
        name:
          maxLength: 80
          minLength: 0
          type: string
          description: Gets or sets the category name.
          nullable: true
        isActive:
          type: boolean
          description: >-
            Gets or sets a value indicating whether the category is active or
            not.
          nullable: true
        locations:
          type: array
          items:
            type: string
          description: >-
            Gets or sets the list of locations associated with the ticket
            category.
          nullable: true
      additionalProperties: false
    UpdateTicketJobTypeRequest:
      type: object
      properties:
        name:
          maxLength: 500
          minLength: 0
          type: string
          description: Gets or sets the job type name.
          nullable: true
        isActive:
          type: boolean
          description: Gets or sets a value indicating whether the job type is active.
          nullable: true
      additionalProperties: false
    UpdateTicketServiceNeededRequest:
      type: object
      properties:
        name:
          maxLength: 500
          minLength: 0
          type: string
          description: Gets or sets the name of the service needed.
          nullable: true
        categoryId:
          type: string
          description: Gets or sets the category Id of the service needed.
          format: uuid
          nullable: true
        isActive:
          type: boolean
          description: >-
            Gets or sets a value indicating whether the service needed is
            active.
          nullable: true
        locations:
          type: array
          items:
            type: string
          description: Gets or sets the space twin Ids associated with the service needed.
          nullable: true
      additionalProperties: false
    UserProfile:
      type: object
      properties:
        id:
          type: string
          description: Gets or sets the unique identifier for the user.
          format: uuid
          nullable: true
        name:
          type: string
          description: Gets or sets the name of the user.
          nullable: true
        email:
          type: string
          description: Gets or sets the email address of the user.
          nullable: true
        phone:
          type: string
          description: Gets or sets the phone number of the user.
          nullable: true
        company:
          type: string
          description: Gets or sets the company name associated with the user.
          nullable: true
      additionalProperties: false
    ValidationProblemDetails:
      allOf:
        - $ref: '#/components/schemas/HttpValidationProblemDetails'
        - type: object
          properties:
            errors:
              type: object
              additionalProperties:
                type: array
                items:
                  type: string
          additionalProperties: {}
    ValidationProblemDetails1:
      type: object
      properties:
        type:
          type: string
          nullable: true
        title:
          type: string
          nullable: true
        status:
          type: integer
          format: int32
          nullable: true
        detail:
          type: string
          nullable: true
        instance:
          type: string
          nullable: true
        errors:
          type: object
          additionalProperties:
            type: array
            items:
              type: string
          nullable: true
      additionalProperties: {}
    WorkgroupAssignee:
      type: object
      properties:
        id:
          type: string
          description: Gets or sets the workgroup identifier.
          format: uuid
          nullable: true
        name:
          type: string
          description: Gets or sets the workgroup name.
          nullable: true
      additionalProperties: false
      description: Represents a workgroup assignee for tickets.
  securitySchemes:
    oauth2:
      type: oauth2
      flows:
        clientCredentials:
          tokenUrl: /v3/oauth2/token
          scopes: {}
tags:
  - name: OAuth2
    description: >-
      Authentication is required prior to accessing the Willow API. Refer to
      Authentication section above for details.
  - name: Models
    description: Models endpoints are used for getting the models and their details.
  - name: Twins
    description: >-
      The Twins endpoints enable creating, updating, and fetching one or more
      twins at a time. When receiving twins, there are also options to include
      relationships in the same response.
  - name: Relationships
    description: >-
      Relationship endpoints enable creating, updating, and fetching
      relationship details.
  - name: Time Series
    description: >-
      The Time Series endpoints are used for sending or receiving telemetry
      data. Once a `Capability` twin has been created that represents the time
      series, the telemetry associated with that twin can be created using
      either the twin's dtId (aka twinId) or externalId, a timestamp, and a
      value. Data is transmitted as an array so time series data can be batched
      and sent within a single request.

      Similarly, time series can be retreived for one or more `Capability` twins
      at a time using the twinId(s).
  - name: Insights
    description: >-
      Insights are issues, opportunities, or knowledge that can help optimize or
      improve the performance of a building. They can be associated with any
      twin within Willow and are triggered in real-time by Skills that are
      running within Willow's Activate Technology and analyzing the incoming
      time series data.
  - name: Events
    description: >-
      Events endpoints enable creating, updating, and deleting discrete
      occurrences such as Weather Forecast, Calendar events etc.
  - name: Tickets
    description: >-
      This API group is in **pre-release** and may change without notice. Use
      with caution. Breaking changes may occur as development continues.<br>
      Tickets endpoints enable creating, updating and retrieving Tickets.
  - name: Ticket Metadata
    description: >-
      This API group is in **pre-release** and may change without notice. Use
      with caution. Breaking changes may occur as development continues.<br>
      Ticket Metadata endpoints enable creating, updating and retrieving Ticket
      Metadata.
