openapi: "3.1"
info:
  title: Channel Manager API Documentation
  version: 1.0.0
  description: Unified API documentation for Channel Manager microservices
paths:
  /api/v1/reservation-groups/faulty:
    get:
      summary: Get faulty reservation groups
      tags:
        - Reservation Groups
      responses:
        "200":
          description: Default Response
  /api/v1/reservation-groups/:
    get:
      summary: List reservation groups
      tags:
        - Reservation Groups
      parameters:
        - schema:
            default: 1
            type: integer
            minimum: 1
            maximum: 9007199254740991
          in: query
          name: page
          required: false
        - schema:
            default: 20
            type: integer
            minimum: 1
            maximum: 100
          in: query
          name: limit
          required: false
        - schema:
            type: string
          in: query
          name: search
          required: false
        - schema:
            type: string
          in: query
          name: externalReservationId
          required: false
        - schema:
            type: boolean
          in: query
          name: isFaulty
          required: false
        - schema: {}
          in: query
          name: startDate
          required: false
        - schema: {}
          in: query
          name: endDate
          required: false
      responses:
        "200":
          description: Default Response
    post:
      summary: Create reservation group
      tags:
        - Reservation Groups
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                externalReservationId:
                  type: string
                paymentMethod:
                  type: string
                internalNotes:
                  type: string
                serviceNotes:
                  type: string
                otaNotes:
                  type: string
                amountsTotal:
                  default: 0
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
                cityTaxTotal:
                  default: 0
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
                cleaningFeeTotal:
                  default: 0
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
                extrasTotal:
                  default: 0
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
                paymentsTotal:
                  default: 0
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
                toPay:
                  default: 0
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
                totalGross:
                  default: 0
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
                customerInfos:
                  type: object
                  properties:
                    givenName:
                      type: string
                    familyName:
                      type: string
                    email:
                      type: string
                      format: email
                      pattern: ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
                    phone:
                      type: string
                    address:
                      type: string
                    city:
                      type: string
                    country:
                      type: string
                    zipCode:
                      type: string
                threadId:
                  type: string
                givenName:
                  type: string
                familyName:
                  type: string
                isFaulty:
                  default: false
                  type: boolean
              required:
                - customerInfos
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/reservation-groups/{id}:
    get:
      summary: Get reservation group by ID
      tags:
        - Reservation Groups
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    put:
      summary: Update reservation group
      tags:
        - Reservation Groups
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                externalReservationId:
                  type: string
                paymentMethod:
                  type: string
                internalNotes:
                  type: string
                serviceNotes:
                  type: string
                otaNotes:
                  type: string
                amountsTotal:
                  default: 0
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
                cityTaxTotal:
                  default: 0
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
                cleaningFeeTotal:
                  default: 0
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
                extrasTotal:
                  default: 0
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
                paymentsTotal:
                  default: 0
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
                toPay:
                  default: 0
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
                totalGross:
                  default: 0
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
                customerInfos:
                  type: object
                  properties:
                    givenName:
                      type: string
                    familyName:
                      type: string
                    email:
                      type: string
                      format: email
                      pattern: ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
                    phone:
                      type: string
                    address:
                      type: string
                    city:
                      type: string
                    country:
                      type: string
                    zipCode:
                      type: string
                threadId:
                  type: string
                givenName:
                  type: string
                familyName:
                  type: string
                isFaulty:
                  default: false
                  type: boolean
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    delete:
      summary: Delete reservation group
      tags:
        - Reservation Groups
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/reservation-groups/{id}/mark-faulty:
    patch:
      summary: Mark reservation group as faulty
      tags:
        - Reservation Groups
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/reservation-groups/{id}/mark-not-faulty:
    patch:
      summary: Mark reservation group as not faulty
      tags:
        - Reservation Groups
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/reservations/:
    get:
      summary: List reservations
      tags:
        - Reservations
      parameters:
        - schema:
            default: 1
            type: integer
            minimum: 1
            maximum: 9007199254740991
          in: query
          name: page
          required: false
        - schema:
            default: 20
            type: integer
            minimum: 1
            maximum: 100
          in: query
          name: limit
          required: false
        - schema:
            type: string
          in: query
          name: search
          required: false
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: propertyId
          required: false
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: ratePlanUnitCategoryCombinationId
          required: false
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: portalId
          required: false
        - schema:
            type: string
          in: query
          name: status
          required: false
        - schema: {}
          in: query
          name: startDate
          required: false
        - schema: {}
          in: query
          name: endDate
          required: false
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: reservationGroupId
          required: false
      responses:
        "200":
          description: Default Response
    post:
      summary: Create reservation
      tags:
        - Reservations
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                cancellationDate: {}
                propertyId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                ratePlanUnitCategoryCombinationId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                portalId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                externalReservationId:
                  type: string
                status:
                  type: string
                  minLength: 1
                type:
                  type: string
                  minLength: 1
                startDate: {}
                endDate: {}
                arrivalTime:
                  type: string
                departureTime:
                  type: string
                givenName:
                  type: string
                familyName:
                  type: string
                amount:
                  default: 0
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
                discount:
                  default: 0
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
                cleaningFee:
                  default: 0
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
                extraTotal:
                  default: 0
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
                otaFee:
                  default: 0
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
                cityTax:
                  default: 0
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
                currency:
                  type: string
                  minLength: 3
                  maxLength: 3
                adults:
                  default: 0
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                children:
                  default: 0
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                infants:
                  default: 0
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                pets:
                  default: 0
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                childrenDetails:
                  default: []
                  type: array
                  items:
                    type: object
                    properties:
                      age:
                        type: integer
                        minimum: 0
                        maximum: 17
                    required:
                      - age
                mealPlan:
                  type: string
                  minLength: 1
                isDontMove:
                  default: false
                  type: boolean
                isRefundable:
                  type: boolean
                ccsToken:
                  type: string
                  minLength: 1
                internalNotes:
                  type: string
                serviceNotes:
                  type: string
                pin:
                  type: string
                color:
                  type: string
                reservationGroupId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              required:
                - propertyId
                - portalId
                - status
                - type
                - startDate
                - endDate
                - currency
                - mealPlan
                - isRefundable
                - ccsToken
                - reservationGroupId
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/reservations/{id}:
    get:
      summary: Get reservation by ID
      tags:
        - Reservations
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    put:
      summary: Update reservation
      tags:
        - Reservations
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                cancellationDate: {}
                propertyId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                ratePlanUnitCategoryCombinationId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                portalId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                externalReservationId:
                  type: string
                status:
                  type: string
                  minLength: 1
                type:
                  type: string
                  minLength: 1
                startDate: {}
                endDate: {}
                arrivalTime:
                  type: string
                departureTime:
                  type: string
                givenName:
                  type: string
                familyName:
                  type: string
                amount:
                  default: 0
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
                discount:
                  default: 0
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
                cleaningFee:
                  default: 0
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
                extraTotal:
                  default: 0
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
                otaFee:
                  default: 0
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
                cityTax:
                  default: 0
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
                currency:
                  type: string
                  minLength: 3
                  maxLength: 3
                adults:
                  default: 0
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                children:
                  default: 0
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                infants:
                  default: 0
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                pets:
                  default: 0
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                childrenDetails:
                  default: []
                  type: array
                  items:
                    type: object
                    properties:
                      age:
                        type: integer
                        minimum: 0
                        maximum: 17
                    required:
                      - age
                mealPlan:
                  type: string
                  minLength: 1
                isDontMove:
                  default: false
                  type: boolean
                isRefundable:
                  type: boolean
                ccsToken:
                  type: string
                  minLength: 1
                internalNotes:
                  type: string
                serviceNotes:
                  type: string
                pin:
                  type: string
                color:
                  type: string
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    delete:
      summary: Delete reservation
      tags:
        - Reservations
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/reservations/{id}/cancel:
    patch:
      summary: Cancel reservation
      tags:
        - Reservations
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/payments/:
    get:
      summary: List payments
      tags:
        - Payments
      parameters:
        - schema:
            default: 1
            type: integer
            minimum: 1
            maximum: 9007199254740991
          in: query
          name: page
          required: false
        - schema:
            default: 20
            type: integer
            minimum: 1
            maximum: 100
          in: query
          name: limit
          required: false
        - schema:
            type: string
          in: query
          name: ownerType
          required: false
        - schema:
            type: string
          in: query
          name: ownerId
          required: false
        - schema:
            type: string
          in: query
          name: source
          required: false
        - schema:
            type: string
          in: query
          name: type
          required: false
        - schema: {}
          in: query
          name: startDate
          required: false
        - schema: {}
          in: query
          name: endDate
          required: false
      responses:
        "200":
          description: Default Response
    post:
      summary: Create payment
      tags:
        - Payments
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                ownerType:
                  type: string
                  minLength: 1
                ownerId:
                  type: string
                  minLength: 1
                source:
                  type: string
                  minLength: 1
                type:
                  type: string
                  minLength: 1
                date: {}
                amount:
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
              required:
                - ownerType
                - ownerId
                - source
                - type
                - date
                - amount
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/payments/{id}:
    get:
      summary: Get payment by ID
      tags:
        - Payments
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    put:
      summary: Update payment
      tags:
        - Payments
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                ownerType:
                  type: string
                  minLength: 1
                ownerId:
                  type: string
                  minLength: 1
                source:
                  type: string
                  minLength: 1
                type:
                  type: string
                  minLength: 1
                date: {}
                amount:
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    delete:
      summary: Delete payment
      tags:
        - Payments
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/reservation-extras/:
    get:
      summary: List reservation extras
      tags:
        - Reservation Extras
      parameters:
        - schema:
            default: 1
            type: integer
            minimum: 1
            maximum: 9007199254740991
          in: query
          name: page
          required: false
        - schema:
            default: 20
            type: integer
            minimum: 1
            maximum: 100
          in: query
          name: limit
          required: false
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: reservationId
          required: false
        - schema: {}
          in: query
          name: startDate
          required: false
        - schema: {}
          in: query
          name: endDate
          required: false
      responses:
        "200":
          description: Default Response
    post:
      summary: Create reservation extra
      tags:
        - Reservation Extras
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                reservationId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                date: {}
                description:
                  type: string
                amount:
                  default: 0
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
              required:
                - reservationId
                - date
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/reservation-extras/{id}:
    get:
      summary: Get reservation extra by ID
      tags:
        - Reservation Extras
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    put:
      summary: Update reservation extra
      tags:
        - Reservation Extras
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                date: {}
                description:
                  type: string
                amount:
                  default: 0
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    delete:
      summary: Delete reservation extra
      tags:
        - Reservation Extras
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/reviews/:
    get:
      summary: List reviews
      tags:
        - Reviews
      parameters:
        - schema:
            default: 1
            type: integer
            minimum: 1
            maximum: 9007199254740991
          in: query
          name: page
          required: false
        - schema:
            default: 20
            type: integer
            minimum: 1
            maximum: 100
          in: query
          name: limit
          required: false
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: reservationGroupId
          required: false
        - schema:
            type: string
          in: query
          name: guestId
          required: false
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: portalId
          required: false
        - schema:
            type: boolean
          in: query
          name: isVerified
          required: false
        - schema:
            type: integer
            minimum: 1
            maximum: 10
          in: query
          name: minRating
          required: false
        - schema:
            type: integer
            minimum: 1
            maximum: 10
          in: query
          name: maxRating
          required: false
      responses:
        "200":
          description: Default Response
    post:
      summary: Create review
      tags:
        - Reviews
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                reservationGroupId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                guestId:
                  type: string
                  minLength: 1
                reviewText:
                  type: string
                  minLength: 1
                rating:
                  type: integer
                  minimum: 1
                  maximum: 10
                reviewDate: {}
                portalId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                isVerified:
                  default: false
                  type: boolean
              required:
                - reservationGroupId
                - guestId
                - reviewText
                - rating
                - reviewDate
                - portalId
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/reviews/{id}:
    get:
      summary: Get review by ID
      tags:
        - Reviews
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    put:
      summary: Update review
      tags:
        - Reviews
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                guestId:
                  type: string
                  minLength: 1
                reviewText:
                  type: string
                  minLength: 1
                rating:
                  type: integer
                  minimum: 1
                  maximum: 10
                reviewDate: {}
                portalId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                isVerified:
                  default: false
                  type: boolean
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    delete:
      summary: Delete review
      tags:
        - Reviews
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/reviews/{id}/verify:
    patch:
      summary: Verify review
      tags:
        - Reviews
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/reviews/{id}/unverify:
    patch:
      summary: Unverify review
      tags:
        - Reviews
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/otas/vrbo/fastAvailability:
    post:
      summary: Fast availability check
      tags:
        - VRBO
      description: Check availability for a VRBO listing (unit) in a date range. Uses
        propertyId (advertiserExternalId) and unitCategoryId
        (listingExternalId).
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                requestVersion:
                  type: string
                systemExternalId:
                  type: string
                advertiserExternalId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                listingExternalId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                dateRange:
                  type: object
                  properties:
                    arrivalDate:
                      type: string
                      pattern: ^\d{4}-\d{2}-\d{2}$
                    departureDate:
                      type: string
                      pattern: ^\d{4}-\d{2}-\d{2}$
                  required:
                    - arrivalDate
                    - departureDate
                adults:
                  default: 0
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                children:
                  default: 0
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                pets:
                  default: 0
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                units:
                  minItems: 1
                  type: array
                  items:
                    type: object
                    properties:
                      unitExternalId:
                        type: string
                        format: uuid
                        pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                    required:
                      - unitExternalId
              required:
                - advertiserExternalId
                - dateRange
                - units
        required: true
      responses:
        "200":
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  units:
                    type: array
                    items:
                      type: object
                      properties:
                        unitExternalId:
                          type: string
                        available:
                          type: boolean
                        errorCode:
                          type: string
                      required:
                        - unitExternalId
                        - available
                      additionalProperties: false
                required:
                  - units
                additionalProperties: false
  /api/v1/otas/vrbo/bookings/request:
    post:
      summary: Booking request
      tags:
        - VRBO
      description: Booking request from VRBO (XML in). Parses to JSON, processes,
        returns XML response (success or error).
      responses:
        "200":
          description: Default Response
  /api/v1/otas/vrbo/bookings/cancel:
    post:
      summary: Bookings cancel
      tags:
        - VRBO
      description: Cancel a booking by reservation external id. Returns SUCCESS or
        ERROR with errorCode/errorMessage.
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                requestVersion:
                  type: string
                systemExternalId:
                  type: string
                advertiserExternalId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                listingExternalId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                unitExternalId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                reservationExternalId:
                  type: string
                  minLength: 1
                cancellationDate:
                  type: string
                cancellationCategory:
                  type: string
                cancellationReason:
                  type: string
                cancellationMessage:
                  type: string
                  maxLength: 1000
              required:
                - reservationExternalId
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/refundable-settings/:
    get:
      summary: List refundable settings
      tags:
        - Refundable Settings
      parameters:
        - schema:
            default: 1
            type: integer
            minimum: 1
            maximum: 9007199254740991
          in: query
          name: page
          required: false
        - schema:
            default: 20
            type: integer
            minimum: 1
            maximum: 100
          in: query
          name: limit
          required: false
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: propertyId
          required: false
        - schema:
            type: string
          in: query
          name: search
          required: false
      responses:
        "200":
          description: Default Response
    post:
      summary: Create refundable setting
      tags:
        - Refundable Settings
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                propertyId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                name:
                  type: string
                  minLength: 1
                days:
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                penalty:
                  type: string
                  enum:
                    - DEPOSIT
                    - TOTAL
                    - FIRST_NIGHT
                    - P5
                    - P10
                    - P15
                    - P20
                    - P30
                    - P40
                    - P50
                    - P60
                    - P70
                    - P80
                    - P90
              required:
                - propertyId
                - name
                - days
                - penalty
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/refundable-settings/{id}:
    get:
      summary: Get refundable setting by ID
      tags:
        - Refundable Settings
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    put:
      summary: Update refundable setting
      tags:
        - Refundable Settings
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                propertyId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                name:
                  type: string
                  minLength: 1
                days:
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                penalty:
                  type: string
                  enum:
                    - DEPOSIT
                    - TOTAL
                    - FIRST_NIGHT
                    - P5
                    - P10
                    - P15
                    - P20
                    - P30
                    - P40
                    - P50
                    - P60
                    - P70
                    - P80
                    - P90
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    delete:
      summary: Delete refundable setting
      tags:
        - Refundable Settings
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/rate-plans/:
    get:
      summary: List rate plans
      tags:
        - Rate Plans
      parameters:
        - schema:
            default: 1
            type: integer
            minimum: 1
            maximum: 9007199254740991
          in: query
          name: page
          required: false
        - schema:
            default: 20
            type: integer
            minimum: 1
            maximum: 100
          in: query
          name: limit
          required: false
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: propertyId
          required: false
        - schema:
            type: string
          in: query
          name: search
          required: false
        - schema:
            type: string
            enum:
              - ROOM_ONLY
              - BREAKFAST
              - HALF_BOARD
              - FULL_BOARD
              - ALL_INCLUSIVE
          in: query
          name: mealPlan
          required: false
        - schema:
            type: boolean
          in: query
          name: isRefundable
          required: false
      responses:
        "200":
          description: Default Response
    post:
      summary: Create rate plan
      tags:
        - Rate Plans
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                propertyId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                parentId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                name:
                  type: string
                  minLength: 1
                description:
                  type: string
                minPrice:
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                maxPrice:
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                minStay:
                  type: integer
                  minimum: 1
                  maximum: 9007199254740991
                maxStay:
                  type: integer
                  minimum: 1
                  maximum: 9007199254740991
                autoCloseDays:
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                autoCloseTime:
                  type: string
                deposit:
                  default: 0
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                mealPlan:
                  type: string
                  enum:
                    - ROOM_ONLY
                    - BREAKFAST
                    - HALF_BOARD
                    - FULL_BOARD
                    - ALL_INCLUSIVE
                isRefundable:
                  default: true
                  type: boolean
              required:
                - propertyId
                - name
                - minPrice
                - mealPlan
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/rate-plans/{id}:
    get:
      summary: Get rate plan by ID
      tags:
        - Rate Plans
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    put:
      summary: Update rate plan
      tags:
        - Rate Plans
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                propertyId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                parentId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                name:
                  type: string
                  minLength: 1
                description:
                  type: string
                minPrice:
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                maxPrice:
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                minStay:
                  type: integer
                  minimum: 1
                  maximum: 9007199254740991
                maxStay:
                  type: integer
                  minimum: 1
                  maximum: 9007199254740991
                autoCloseDays:
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                autoCloseTime:
                  type: string
                deposit:
                  default: 0
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                mealPlan:
                  type: string
                  enum:
                    - ROOM_ONLY
                    - BREAKFAST
                    - HALF_BOARD
                    - FULL_BOARD
                    - ALL_INCLUSIVE
                isRefundable:
                  default: true
                  type: boolean
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    delete:
      summary: Delete rate plan
      tags:
        - Rate Plans
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/rate-plan-unit-category-combinations/:
    get:
      summary: List rate plan combinations
      tags:
        - Rate Plan Combinations
      parameters:
        - schema:
            default: 1
            type: integer
            minimum: 1
            maximum: 9007199254740991
          in: query
          name: page
          required: false
        - schema:
            default: 20
            type: integer
            minimum: 1
            maximum: 100
          in: query
          name: limit
          required: false
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: ratePlanId
          required: false
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: unitCategoryId
          required: false
      responses:
        "200":
          description: Default Response
    post:
      summary: Create combination
      tags:
        - Rate Plan Combinations
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                ratePlanId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                unitCategoryId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                pricePerChildrenConfig: {}
                pricePerGuestsConfig: {}
              required:
                - ratePlanId
                - unitCategoryId
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/rate-plan-unit-category-combinations/{id}:
    get:
      summary: Get combination by ID
      tags:
        - Rate Plan Combinations
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    put:
      summary: Update combination
      tags:
        - Rate Plan Combinations
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                ratePlanId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                unitCategoryId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                pricePerChildrenConfig: {}
                pricePerGuestsConfig: {}
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    delete:
      summary: Delete combination
      tags:
        - Rate Plan Combinations
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/rate-plan-calendar/:
    get:
      summary: List availability calendar
      tags:
        - Rate Plan Calendar
      parameters:
        - schema:
            default: 1
            type: integer
            minimum: 1
            maximum: 9007199254740991
          in: query
          name: page
          required: false
        - schema:
            default: 20
            type: integer
            minimum: 1
            maximum: 100
          in: query
          name: limit
          required: false
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: ratePlanUnitCategoryCombinationId
          required: false
        - schema: {}
          in: query
          name: startDate
          required: false
        - schema: {}
          in: query
          name: endDate
          required: false
        - schema:
            type: boolean
          in: query
          name: stopSell
          required: false
      responses:
        "200":
          description: Default Response
    post:
      summary: Create availability entry
      tags:
        - Rate Plan Calendar
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                ratePlanUnitCategoryCombinationId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                availability:
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                date: {}
                minStay:
                  default: 1
                  type: integer
                  minimum: 1
                  maximum: 9007199254740991
                maxStay:
                  default: 999
                  type: integer
                  minimum: 1
                  maximum: 9007199254740991
                minAdvanceRes:
                  type: string
                  maxLength: 5
                maxAdvanceRes:
                  type: string
                  maxLength: 5
                closeToArrival:
                  default: false
                  type: boolean
                closeToDeparture:
                  default: false
                  type: boolean
                stopSell:
                  default: false
                  type: boolean
              required:
                - ratePlanUnitCategoryCombinationId
                - availability
                - date
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/rate-plan-calendar/{id}:
    get:
      summary: Get availability by ID
      tags:
        - Rate Plan Calendar
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    put:
      summary: Update availability entry
      tags:
        - Rate Plan Calendar
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                ratePlanUnitCategoryCombinationId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                availability:
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                date: {}
                minStay:
                  default: 1
                  type: integer
                  minimum: 1
                  maximum: 9007199254740991
                maxStay:
                  default: 999
                  type: integer
                  minimum: 1
                  maximum: 9007199254740991
                minAdvanceRes:
                  type: string
                  maxLength: 5
                maxAdvanceRes:
                  type: string
                  maxLength: 5
                closeToArrival:
                  default: false
                  type: boolean
                closeToDeparture:
                  default: false
                  type: boolean
                stopSell:
                  default: false
                  type: boolean
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    delete:
      summary: Delete availability entry
      tags:
        - Rate Plan Calendar
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/rate-plan-calendar/bulk:
    post:
      summary: Bulk create availability entries (optimized)
      tags:
        - Rate Plan Calendar
      requestBody:
        content:
          application/json:
            schema:
              type: array
              items:
                type: object
                properties:
                  ratePlanUnitCategoryCombinationId:
                    type: string
                    format: uuid
                    pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                  availability:
                    type: integer
                    minimum: 0
                    maximum: 9007199254740991
                  date: {}
                  minStay:
                    default: 1
                    type: integer
                    minimum: 1
                    maximum: 9007199254740991
                  maxStay:
                    default: 999
                    type: integer
                    minimum: 1
                    maximum: 9007199254740991
                  minAdvanceRes:
                    type: string
                    maxLength: 5
                  maxAdvanceRes:
                    type: string
                    maxLength: 5
                  closeToArrival:
                    default: false
                    type: boolean
                  closeToDeparture:
                    default: false
                    type: boolean
                  stopSell:
                    default: false
                    type: boolean
                required:
                  - ratePlanUnitCategoryCombinationId
                  - availability
                  - date
      responses:
        "200":
          description: Default Response
  /api/v1/rate-plan-rate-calendar/:
    get:
      summary: List rate calendar
      tags:
        - Rate Plan Rate Calendar
      parameters:
        - schema:
            default: 1
            type: integer
            minimum: 1
            maximum: 9007199254740991
          in: query
          name: page
          required: false
        - schema:
            default: 20
            type: integer
            minimum: 1
            maximum: 100
          in: query
          name: limit
          required: false
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: ratePlanUnitCategoryCombinationId
          required: false
        - schema: {}
          in: query
          name: startDate
          required: false
        - schema: {}
          in: query
          name: endDate
          required: false
        - schema:
            type: integer
            minimum: -9007199254740991
            maximum: 9007199254740991
          in: query
          name: occupancy
          required: false
      responses:
        "200":
          description: Default Response
    post:
      summary: Create rate entry
      tags:
        - Rate Plan Rate Calendar
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                ratePlanUnitCategoryCombinationId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                date: {}
                occupancy:
                  type: integer
                  minimum: 1
                  maximum: 9007199254740991
                amount:
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                isStandardOccupancy:
                  default: 0
                  type: integer
                  minimum: 0
                  maximum: 1
              required:
                - ratePlanUnitCategoryCombinationId
                - date
                - occupancy
                - amount
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/rate-plan-rate-calendar/{id}:
    get:
      summary: Get rate by ID
      tags:
        - Rate Plan Rate Calendar
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    put:
      summary: Update rate entry
      tags:
        - Rate Plan Rate Calendar
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                amount:
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                isStandardOccupancy:
                  type: integer
                  minimum: 0
                  maximum: 1
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    delete:
      summary: Delete rate entry
      tags:
        - Rate Plan Rate Calendar
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/rate-plan-rate-calendar/bulk:
    post:
      summary: Bulk create rate entries (optimized)
      tags:
        - Rate Plan Rate Calendar
      requestBody:
        content:
          application/json:
            schema:
              type: array
              items:
                type: object
                properties:
                  ratePlanUnitCategoryCombinationId:
                    type: string
                    format: uuid
                    pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                  date: {}
                  occupancy:
                    type: integer
                    minimum: 1
                    maximum: 9007199254740991
                  amount:
                    type: integer
                    minimum: 0
                    maximum: 9007199254740991
                  isStandardOccupancy:
                    default: 0
                    type: integer
                    minimum: 0
                    maximum: 1
                required:
                  - ratePlanUnitCategoryCombinationId
                  - date
                  - occupancy
                  - amount
      responses:
        "200":
          description: Default Response
  /api/v1/promotions/:
    get:
      summary: List promotions
      tags:
        - Promotions
      parameters:
        - schema:
            default: 1
            type: integer
            minimum: 1
            maximum: 9007199254740991
          in: query
          name: page
          required: false
        - schema:
            default: 20
            type: integer
            minimum: 1
            maximum: 100
          in: query
          name: limit
          required: false
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: propertyId
          required: false
        - schema:
            type: boolean
          in: query
          name: isActive
          required: false
        - schema:
            anyOf:
              - type: number
                enum:
                  - 1
              - type: number
                enum:
                  - 2
              - type: number
                enum:
                  - 3
              - type: number
                enum:
                  - 4
          in: query
          name: type
          required: false
        - schema:
            type: string
          in: query
          name: search
          required: false
      responses:
        "200":
          description: Default Response
    post:
      summary: Create promotion
      tags:
        - Promotions
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                parentId:
                  anyOf:
                    - type: string
                      format: uuid
                      pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                    - type: "null"
                propertyId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                isActive:
                  default: true
                  type: boolean
                label:
                  type: string
                  minLength: 1
                description:
                  anyOf:
                    - type: string
                    - type: "null"
                isShowBooking:
                  default: false
                  type: boolean
                isExcludedWeekend:
                  default: false
                  type: boolean
                isAllRoomTypes:
                  default: true
                  type: boolean
                type:
                  anyOf:
                    - type: number
                      enum:
                        - 1
                    - type: number
                      enum:
                        - 2
                    - type: number
                      enum:
                        - 3
                    - type: number
                      enum:
                        - 4
                discount:
                  type: number
                  minimum: 0
                discountType:
                  anyOf:
                    - type: number
                      enum:
                        - 1
                    - type: number
                      enum:
                        - 2
                name:
                  type: string
                  minLength: 1
                advanceDays:
                  anyOf:
                    - type: integer
                      minimum: 0
                      maximum: 9007199254740991
                    - type: "null"
                stayLength:
                  anyOf:
                    - type: integer
                      minimum: 0
                      maximum: 9007199254740991
                    - type: "null"
                checkinFrom:
                  anyOf:
                    - type: string
                      pattern: ^\d{4}-\d{2}-\d{2}$
                    - type: "null"
                checkinTo:
                  anyOf:
                    - type: string
                      pattern: ^\d{4}-\d{2}-\d{2}$
                    - type: "null"
                validFrom:
                  anyOf:
                    - type: string
                      pattern: ^\d{4}-\d{2}-\d{2}$
                    - type: "null"
                validTo:
                  anyOf:
                    - type: string
                      pattern: ^\d{4}-\d{2}-\d{2}$
                    - type: "null"
                weekdays:
                  anyOf:
                    - type: string
                    - type: "null"
                couponCode:
                  anyOf:
                    - type: string
                    - type: "null"
                couponAvailability:
                  anyOf:
                    - type: integer
                      minimum: 0
                      maximum: 9007199254740991
                    - type: "null"
                couponUsed:
                  anyOf:
                    - type: integer
                      minimum: 0
                      maximum: 9007199254740991
                    - type: "null"
              required:
                - propertyId
                - label
                - type
                - discount
                - discountType
                - name
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/promotions/{id}:
    get:
      summary: Get promotion by ID
      tags:
        - Promotions
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    put:
      summary: Update promotion
      tags:
        - Promotions
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                parentId:
                  anyOf:
                    - type: string
                      format: uuid
                      pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                    - type: "null"
                propertyId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                isActive:
                  default: true
                  type: boolean
                label:
                  type: string
                  minLength: 1
                description:
                  anyOf:
                    - type: string
                    - type: "null"
                isShowBooking:
                  default: false
                  type: boolean
                isExcludedWeekend:
                  default: false
                  type: boolean
                isAllRoomTypes:
                  default: true
                  type: boolean
                type:
                  anyOf:
                    - type: number
                      enum:
                        - 1
                    - type: number
                      enum:
                        - 2
                    - type: number
                      enum:
                        - 3
                    - type: number
                      enum:
                        - 4
                discount:
                  type: number
                  minimum: 0
                discountType:
                  anyOf:
                    - type: number
                      enum:
                        - 1
                    - type: number
                      enum:
                        - 2
                name:
                  type: string
                  minLength: 1
                advanceDays:
                  anyOf:
                    - type: integer
                      minimum: 0
                      maximum: 9007199254740991
                    - type: "null"
                stayLength:
                  anyOf:
                    - type: integer
                      minimum: 0
                      maximum: 9007199254740991
                    - type: "null"
                checkinFrom:
                  anyOf:
                    - type: string
                      pattern: ^\d{4}-\d{2}-\d{2}$
                    - type: "null"
                checkinTo:
                  anyOf:
                    - type: string
                      pattern: ^\d{4}-\d{2}-\d{2}$
                    - type: "null"
                validFrom:
                  anyOf:
                    - type: string
                      pattern: ^\d{4}-\d{2}-\d{2}$
                    - type: "null"
                validTo:
                  anyOf:
                    - type: string
                      pattern: ^\d{4}-\d{2}-\d{2}$
                    - type: "null"
                weekdays:
                  anyOf:
                    - type: string
                    - type: "null"
                couponCode:
                  anyOf:
                    - type: string
                    - type: "null"
                couponAvailability:
                  anyOf:
                    - type: integer
                      minimum: 0
                      maximum: 9007199254740991
                    - type: "null"
                couponUsed:
                  anyOf:
                    - type: integer
                      minimum: 0
                      maximum: 9007199254740991
                    - type: "null"
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    delete:
      summary: Delete promotion
      tags:
        - Promotions
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/rate-plans/{ratePlanId}/refundable-settings:
    get:
      summary: Get all refundable settings for a rate plan
      tags:
        - Rate Plan Refundable Settings
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: ratePlanId
          required: true
      responses:
        "200":
          description: Default Response
    post:
      summary: Associate a refundable setting with a rate plan
      tags:
        - Rate Plan Refundable Settings
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                refundableSettingId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              required:
                - refundableSettingId
        required: true
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: ratePlanId
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/rate-plans/{ratePlanId}/refundable-settings/bulk:
    post:
      summary: Bulk associate refundable settings with a rate plan
      tags:
        - Rate Plan Refundable Settings
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                refundableSettingIds:
                  minItems: 1
                  type: array
                  items:
                    type: string
                    format: uuid
                    pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              required:
                - refundableSettingIds
        required: true
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: ratePlanId
          required: true
      responses:
        "200":
          description: Default Response
    delete:
      summary: Bulk remove refundable settings from a rate plan
      tags:
        - Rate Plan Refundable Settings
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                refundableSettingIds:
                  minItems: 1
                  type: array
                  items:
                    type: string
                    format: uuid
                    pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              required:
                - refundableSettingIds
        required: true
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: ratePlanId
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/rate-plans/{ratePlanId}/refundable-settings/{settingId}:
    delete:
      summary: Remove a refundable setting from a rate plan
      tags:
        - Rate Plan Refundable Settings
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: ratePlanId
          required: true
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: settingId
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/refundable-settings/{settingId}/rate-plans:
    get:
      summary: Get all rate plans using a refundable setting
      tags:
        - Rate Plan Refundable Settings
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: settingId
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/rate-plan-refundable-settings:
    get:
      summary: Query rate plan refundable setting associations
      tags:
        - Rate Plan Refundable Settings
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: ratePlanId
          required: false
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: refundableSettingId
          required: false
      responses:
        "200":
          description: Default Response
  /api/v1/auth/signup:
    post:
      tags:
        - Auth
      description: Register a new user account
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                  format: email
                  pattern: ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
                password:
                  type: string
                  minLength: 8
                firstName:
                  type: string
                  minLength: 1
                lastName:
                  type: string
                  minLength: 1
                username:
                  type: string
                  minLength: 1
              required:
                - email
                - password
                - firstName
                - lastName
                - username
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/auth/signin:
    post:
      tags:
        - Auth
      description: Sign in with email and password
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                  format: email
                  pattern: ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
                password:
                  type: string
                  minLength: 8
              required:
                - email
                - password
        required: true
      responses:
        "200":
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  accessToken:
                    description: JWT access token
                    type: string
                  accessTokenExpiresAt:
                    description: Access token expiration timestamp (Unix seconds)
                    type: number
                  refreshToken:
                    description: JWT refresh token
                    type: string
                required:
                  - accessToken
                  - accessTokenExpiresAt
                  - refreshToken
                additionalProperties: false
  /api/v1/auth/refresh:
    post:
      tags:
        - Auth
      description: Refresh access token using refresh token
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                refreshToken:
                  description: JWT refresh token received during signin
                  type: string
                  minLength: 1
              required:
                - refreshToken
        required: true
      responses:
        "200":
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  accessToken:
                    description: New JWT access token
                    type: string
                  accessTokenExpiresAt:
                    description: Access token expiration timestamp (Unix seconds)
                    type: number
                  refreshToken:
                    description: New JWT refresh token
                    type: string
                required:
                  - accessToken
                  - accessTokenExpiresAt
                  - refreshToken
                additionalProperties: false
  /api/v1/auth/verify:
    post:
      tags:
        - Auth
      description: Verify access token validity via X-Channel-Access header
      responses:
        "200":
          description: Default Response
  /api/v1/auth/oauth/flows/{ota}:
    get:
      tags:
        - OAuth
      description: OAuth authentication flow for OTA providers
      parameters:
        - schema:
            type: string
          in: query
          name: error
          required: false
        - schema:
            type: string
          in: query
          name: error_description
          required: false
        - schema:
            type: string
          in: query
          name: state
          required: false
        - schema:
            type: string
          in: query
          name: code
          required: false
        - schema:
            type: string
          in: query
          name: scope
          required: false
        - schema:
            type: string
          in: query
          name: vrbo_code
          required: false
        - schema:
            type: string
          in: query
          name: vrbo_state
          required: false
        - schema:
            type: string
          in: query
          name: vrbo_scope
          required: false
        - schema:
            type: string
            enum:
              - airbnb
              - vrbo
              - google-hotel
          in: path
          name: ota
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/users:
    get:
      tags:
        - Users
      description: Get all users with pagination
      parameters:
        - schema:
            default: 1
            type: integer
            minimum: 1
            maximum: 9007199254740991
          in: query
          name: page
          required: false
        - schema:
            default: 20
            type: integer
            minimum: 1
            maximum: 100
          in: query
          name: limit
          required: false
        - schema:
            type: string
          in: query
          name: search
          required: false
      responses:
        "200":
          description: Default Response
    post:
      tags:
        - Users
      description: Create a new user
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                firstName:
                  type: string
                  minLength: 1
                lastName:
                  type: string
                  minLength: 1
                username:
                  type: string
                  minLength: 1
                email:
                  type: string
                  format: email
                  pattern: ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
                password:
                  type: string
                  minLength: 8
              required:
                - firstName
                - lastName
                - username
                - email
                - password
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/users/{id}:
    get:
      tags:
        - Users
      description: Get user by ID
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    put:
      tags:
        - Users
      description: Update user by ID
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                firstName:
                  type: string
                  minLength: 1
                lastName:
                  type: string
                  minLength: 1
                username:
                  type: string
                  minLength: 1
                email:
                  type: string
                  format: email
                  pattern: ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
                password:
                  type: string
                  minLength: 8
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    delete:
      tags:
        - Users
      description: Delete user by ID
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/companies:
    get:
      tags:
        - Companies
      description: Get all companies with pagination
      parameters:
        - schema:
            default: 1
            type: integer
            minimum: 1
            maximum: 9007199254740991
          in: query
          name: page
          required: false
        - schema:
            default: 20
            type: integer
            minimum: 1
            maximum: 100
          in: query
          name: limit
          required: false
        - schema:
            type: string
          in: query
          name: search
          required: false
        - schema:
            type: string
          in: query
          name: parentId
          required: false
      responses:
        "200":
          description: Default Response
    post:
      tags:
        - Companies
      description: Create a new company
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  minLength: 1
                email:
                  type: string
                  format: email
                  pattern: ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
                phone:
                  type: string
                website:
                  type: string
                  format: uri
                logo:
                  type: string
                  format: uri
                type:
                  type: string
                  enum:
                    - PRIVATE
                    - COMPANY
                taxCode:
                  type: string
                  minLength: 1
                timeZone:
                  default: UTC
                  type: string
                locale:
                  type: string
                sdi:
                  type: string
                pec:
                  type: string
                  format: email
                  pattern: ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
                parentId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                vatCode:
                  type: string
                latitude:
                  type: string
                longitude:
                  type: string
                city:
                  type: string
                address:
                  type: string
                zipCode:
                  type: string
                state:
                  type: string
                country:
                  type: string
                countryCode:
                  type: string
                  minLength: 2
                  maxLength: 2
              required:
                - name
                - type
                - taxCode
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/companies/{id}:
    get:
      tags:
        - Companies
      description: Get company by ID
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    put:
      tags:
        - Companies
      description: Update company by ID
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  minLength: 1
                email:
                  type: string
                  format: email
                  pattern: ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
                phone:
                  type: string
                website:
                  type: string
                  format: uri
                logo:
                  type: string
                  format: uri
                type:
                  type: string
                  enum:
                    - PRIVATE
                    - COMPANY
                taxCode:
                  type: string
                  minLength: 1
                timeZone:
                  default: UTC
                  type: string
                locale:
                  type: string
                sdi:
                  type: string
                pec:
                  type: string
                  format: email
                  pattern: ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
                parentId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                vatCode:
                  type: string
                latitude:
                  type: string
                longitude:
                  type: string
                city:
                  type: string
                address:
                  type: string
                zipCode:
                  type: string
                state:
                  type: string
                country:
                  type: string
                countryCode:
                  type: string
                  minLength: 2
                  maxLength: 2
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    delete:
      tags:
        - Companies
      description: Delete company by ID
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/companies/{id}/offices:
    get:
      tags:
        - Companies
      description: Get company offices (child companies)
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/policies:
    get:
      tags:
        - Policies
      description: Get all policies
      responses:
        "200":
          description: Default Response
    post:
      tags:
        - Policies
      description: Create a new policy
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                companyId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                checkinFrom:
                  type: string
                  pattern: ^\d{2}:\d{2}:\d{2}$
                checkinTo:
                  type: string
                  pattern: ^\d{2}:\d{2}:\d{2}$
                checkout:
                  type: string
                  pattern: ^\d{2}:\d{2}:\d{2}$
                minimumAge:
                  type: integer
                  minimum: 0
                  maximum: 120
                isAcceptedAnimals:
                  default: false
                  type: boolean
                isEventsAllowed:
                  default: false
                  type: boolean
                isSmokersAllowed:
                  default: false
                  type: boolean
                isChildrenAllowed:
                  default: true
                  type: boolean
                termsAndConditions:
                  type: string
                privacyPolicy:
                  type: string
              required:
                - companyId
                - checkinFrom
                - checkinTo
                - checkout
                - minimumAge
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/policies/by-company:
    get:
      tags:
        - Policies
      description: Get policy by company ID
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: companyId
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/policies/{id}:
    get:
      tags:
        - Policies
      description: Get policy by ID
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    put:
      tags:
        - Policies
      description: Update policy by ID
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                checkinFrom:
                  type: string
                  pattern: ^\d{2}:\d{2}:\d{2}$
                checkinTo:
                  type: string
                  pattern: ^\d{2}:\d{2}:\d{2}$
                checkout:
                  type: string
                  pattern: ^\d{2}:\d{2}:\d{2}$
                minimumAge:
                  type: integer
                  minimum: 0
                  maximum: 120
                isAcceptedAnimals:
                  default: false
                  type: boolean
                isEventsAllowed:
                  default: false
                  type: boolean
                isSmokersAllowed:
                  default: false
                  type: boolean
                isChildrenAllowed:
                  default: true
                  type: boolean
                termsAndConditions:
                  type: string
                privacyPolicy:
                  type: string
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    delete:
      tags:
        - Policies
      description: Delete policy by ID
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/company-users:
    post:
      tags:
        - Company Users
      description: Assign user to company
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                userId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                companyId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              required:
                - userId
                - companyId
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/company-users/{id}:
    delete:
      tags:
        - Company Users
      description: Remove user from company
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/company-users/by-company:
    get:
      tags:
        - Company Users
      description: Get all users in a company
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: companyId
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/company-users/by-user:
    get:
      tags:
        - Company Users
      description: Get all companies a user belongs to
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: userId
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/invites:
    get:
      tags:
        - Invites
      description: Get all invites
      responses:
        "200":
          description: Default Response
    post:
      tags:
        - Invites
      description: Create a new invite
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                url:
                  type: string
                  format: uri
                expiryAt:
                  type: string
                  format: date-time
                  pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
                token:
                  type: string
                  minLength: 1
              required:
                - url
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/invites/active:
    get:
      tags:
        - Invites
      description: Get active (non-expired, not opened) invites
      responses:
        "200":
          description: Default Response
  /api/v1/invites/by-token:
    get:
      tags:
        - Invites
      description: Get invite by token
      parameters:
        - schema:
            type: string
            minLength: 1
          in: query
          name: token
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/invites/validate:
    get:
      tags:
        - Invites
      description: Validate invite token
      parameters:
        - schema:
            type: string
            minLength: 1
          in: query
          name: token
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/invites/mark-opened:
    post:
      tags:
        - Invites
      description: Mark invite as opened
      parameters:
        - schema:
            type: string
            minLength: 1
          in: query
          name: token
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/invites/{id}:
    get:
      tags:
        - Invites
      description: Get invite by ID
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    put:
      tags:
        - Invites
      description: Update invite by ID
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                url:
                  type: string
                  format: uri
                expiryAt:
                  type: string
                  format: date-time
                  pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
                linkOpened:
                  type: boolean
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    delete:
      tags:
        - Invites
      description: Delete invite by ID
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/invites/cleanup:
    post:
      tags:
        - Invites
      description: Cleanup expired invites
      responses:
        "200":
          description: Default Response
  /api/v1/properties:
    get:
      tags:
        - Properties
      parameters:
        - schema:
            default: 1
            type: integer
            minimum: 1
            maximum: 9007199254740991
          in: query
          name: page
          required: false
        - schema:
            default: 20
            type: integer
            minimum: 1
            maximum: 100
          in: query
          name: limit
          required: false
        - schema:
            type: string
          in: query
          name: search
          required: false
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$
          in: query
          name: companyId
          required: false
        - schema:
            type: boolean
          in: query
          name: active
          required: false
      responses:
        "200":
          description: Default Response
    post:
      tags:
        - Properties
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  minLength: 1
                vat:
                  type: string
                  minLength: 1
                active:
                  default: true
                  type: boolean
                email:
                  type: string
                  format: email
                  pattern: ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
                phone:
                  type: string
                  minLength: 1
                currency:
                  type: string
                  minLength: 3
                  maxLength: 3
                timezone:
                  type: string
                  minLength: 1
                companyId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$
                description:
                  type: string
                isRatePlanOccupational:
                  default: false
                  type: boolean
                shortDescription:
                  type: string
                language:
                  default: en
                  type: string
                type:
                  default: ND
                  type: string
                  enum:
                    - ND
                    - HOTEL
                    - APARTMENT
                    - VILLA
                    - COTTAGE
                    - HOUSE
                    - OTHER
                latitude:
                  type: string
                longitude:
                  type: string
                city:
                  type: string
                address:
                  type: string
                zipCode:
                  type: string
                state:
                  type: string
                locale:
                  type: string
                country:
                  type: string
                countryCode:
                  type: string
                  minLength: 2
                  maxLength: 2
                taxesConfiguration:
                  type: object
                  properties:
                    rules:
                      type: array
                      items:
                        type: object
                        properties:
                          type:
                            type: string
                            enum:
                              - per_person_per_night
                              - per_room
                              - flat_fee
                              - percentage
                              - percentage_per_guest
                          appliesTo:
                            type: string
                            enum:
                              - adult
                              - child
                              - infant
                          exemptions:
                            type: string
                            enum:
                              - age
                              - role
                        required:
                          - type
                          - appliesTo
                          - exemptions
                  required:
                    - rules
              required:
                - name
                - vat
                - email
                - phone
                - currency
                - timezone
                - companyId
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/properties/{id}:
    get:
      tags:
        - Properties
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    put:
      tags:
        - Properties
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  minLength: 1
                vat:
                  type: string
                  minLength: 1
                active:
                  default: true
                  type: boolean
                email:
                  type: string
                  format: email
                  pattern: ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
                phone:
                  type: string
                  minLength: 1
                currency:
                  type: string
                  minLength: 3
                  maxLength: 3
                timezone:
                  type: string
                  minLength: 1
                companyId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$
                description:
                  type: string
                isRatePlanOccupational:
                  default: false
                  type: boolean
                shortDescription:
                  type: string
                language:
                  default: en
                  type: string
                type:
                  default: ND
                  type: string
                  enum:
                    - ND
                    - HOTEL
                    - APARTMENT
                    - VILLA
                    - COTTAGE
                    - HOUSE
                    - OTHER
                latitude:
                  type: string
                longitude:
                  type: string
                city:
                  type: string
                address:
                  type: string
                zipCode:
                  type: string
                state:
                  type: string
                locale:
                  type: string
                country:
                  type: string
                countryCode:
                  type: string
                  minLength: 2
                  maxLength: 2
                taxesConfiguration:
                  type: object
                  properties:
                    rules:
                      type: array
                      items:
                        type: object
                        properties:
                          type:
                            type: string
                            enum:
                              - per_person_per_night
                              - per_room
                              - flat_fee
                              - percentage
                              - percentage_per_guest
                          appliesTo:
                            type: string
                            enum:
                              - adult
                              - child
                              - infant
                          exemptions:
                            type: string
                            enum:
                              - age
                              - role
                        required:
                          - type
                          - appliesTo
                          - exemptions
                  required:
                    - rules
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    delete:
      tags:
        - Properties
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/unit-categories:
    get:
      tags:
        - Unit Categories
      responses:
        "200":
          description: Default Response
    post:
      tags:
        - Unit Categories
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                propertyId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                name:
                  type: string
                  minLength: 1
                type:
                  type: string
                  enum:
                    - NORMAL
                    - AGGREGATED
                maxAdults:
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                maxChildren:
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                maxOccupancy:
                  type: integer
                  minimum: 1
                  maximum: 9007199254740991
                standardOccupancy:
                  type: integer
                  minimum: 1
                  maximum: 9007199254740991
                cleaningFee:
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                bedsConfiguration: {}
                description:
                  type: string
                headline:
                  type: string
                label:
                  type: string
                  minLength: 1
                sqmSize:
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                unitsCount:
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                bedrooms:
                  default: 0
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                bathrooms:
                  default: 0
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                permitTaxId:
                  type: string
              required:
                - propertyId
                - name
                - type
                - maxAdults
                - maxChildren
                - maxOccupancy
                - standardOccupancy
                - cleaningFee
                - label
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/unit-categories/by-property:
    get:
      tags:
        - Unit Categories
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: propertyId
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/unit-categories/{id}:
    get:
      tags:
        - Unit Categories
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    put:
      tags:
        - Unit Categories
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  minLength: 1
                type:
                  type: string
                  enum:
                    - NORMAL
                    - AGGREGATED
                maxAdults:
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                maxChildren:
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                maxOccupancy:
                  type: integer
                  minimum: 1
                  maximum: 9007199254740991
                standardOccupancy:
                  type: integer
                  minimum: 1
                  maximum: 9007199254740991
                cleaningFee:
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                bedsConfiguration: {}
                description:
                  type: string
                headline:
                  type: string
                label:
                  type: string
                  minLength: 1
                sqmSize:
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                unitsCount:
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                bedrooms:
                  default: 0
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                bathrooms:
                  default: 0
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                permitTaxId:
                  type: string
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    delete:
      tags:
        - Unit Categories
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/facilities:
    get:
      tags:
        - Facilities
      responses:
        "200":
          description: Default Response
    post:
      tags:
        - Facilities
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  minLength: 1
                key:
                  type: string
                  minLength: 1
                icon:
                  type: string
                primary:
                  default: 0
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                categoryId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              required:
                - name
                - key
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/facilities/{id}:
    get:
      tags:
        - Facilities
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    put:
      tags:
        - Facilities
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  minLength: 1
                key:
                  type: string
                  minLength: 1
                icon:
                  type: string
                primary:
                  default: 0
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                categoryId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    delete:
      tags:
        - Facilities
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/facility-categories:
    get:
      tags:
        - Facility Categories
      responses:
        "200":
          description: Default Response
    post:
      tags:
        - Facility Categories
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  minLength: 1
              required:
                - name
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/facility-categories/{id}:
    get:
      tags:
        - Facility Categories
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    put:
      tags:
        - Facility Categories
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  minLength: 1
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    delete:
      tags:
        - Facility Categories
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/property-policies:
    get:
      tags:
        - Property Policies
      responses:
        "200":
          description: Default Response
    post:
      tags:
        - Property Policies
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                propertyId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                checkinFrom:
                  type: string
                  pattern: ^\d{2}:\d{2}:\d{2}$
                checkinTo:
                  type: string
                  pattern: ^\d{2}:\d{2}:\d{2}$
                checkout:
                  type: string
                  pattern: ^\d{2}:\d{2}:\d{2}$
                minimumAge:
                  type: integer
                  minimum: 0
                  maximum: 120
                isAcceptedAnimals:
                  default: false
                  type: boolean
                isEventsAllowed:
                  default: false
                  type: boolean
                isSmokersAllowed:
                  default: false
                  type: boolean
                isChildrenAllowed:
                  default: true
                  type: boolean
                termsAndConditions:
                  type: string
                privacyPolicy:
                  type: string
              required:
                - propertyId
                - checkinFrom
                - checkinTo
                - checkout
                - minimumAge
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/property-policies/by-property:
    get:
      tags:
        - Property Policies
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: propertyId
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/property-policies/{id}:
    get:
      tags:
        - Property Policies
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    put:
      tags:
        - Property Policies
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                checkinFrom:
                  type: string
                  pattern: ^\d{2}:\d{2}:\d{2}$
                checkinTo:
                  type: string
                  pattern: ^\d{2}:\d{2}:\d{2}$
                checkout:
                  type: string
                  pattern: ^\d{2}:\d{2}:\d{2}$
                minimumAge:
                  type: integer
                  minimum: 0
                  maximum: 120
                isAcceptedAnimals:
                  default: false
                  type: boolean
                isEventsAllowed:
                  default: false
                  type: boolean
                isSmokersAllowed:
                  default: false
                  type: boolean
                isChildrenAllowed:
                  default: true
                  type: boolean
                termsAndConditions:
                  type: string
                privacyPolicy:
                  type: string
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    delete:
      tags:
        - Property Policies
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/property-owners:
    post:
      tags:
        - Property Owners
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                propertyId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                ownerId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              required:
                - propertyId
                - ownerId
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/property-owners/{id}:
    delete:
      tags:
        - Property Owners
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/property-owners/by-property:
    get:
      tags:
        - Property Owners
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: propertyId
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/property-owners/by-owner:
    get:
      tags:
        - Property Owners
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: ownerId
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/property-facilities:
    post:
      tags:
        - Property Facilities
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                propertyId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                facilityId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              required:
                - propertyId
                - facilityId
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/property-facilities/{id}:
    delete:
      tags:
        - Property Facilities
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/property-facilities/by-property:
    get:
      tags:
        - Property Facilities
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: propertyId
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/unit-category-facilities:
    post:
      tags:
        - Unit Category Facilities
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                unitCategoryId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                facilityId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              required:
                - unitCategoryId
                - facilityId
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/unit-category-facilities/{id}:
    delete:
      tags:
        - Unit Category Facilities
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/unit-category-facilities/by-unit:
    get:
      tags:
        - Unit Category Facilities
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: unitCategoryId
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/media:
    get:
      tags:
        - Media
      description: Get all media with pagination
      parameters:
        - schema:
            default: 1
            type: integer
            minimum: 1
            maximum: 9007199254740991
          in: query
          name: page
          required: false
        - schema:
            default: 20
            type: integer
            minimum: 1
            maximum: 100
          in: query
          name: limit
          required: false
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: ownerId
          required: false
        - schema:
            type: string
          in: query
          name: ownerType
          required: false
        - schema:
            type: string
          in: query
          name: checksumGroupId
          required: false
      responses:
        "200":
          description: Default Response
    post:
      tags:
        - Media
      description: Upload and create a new media file
      requestBody:
        content:
          application/json:
            schema:
              anyOf:
                - type: object
                  properties:
                    ownerId:
                      type: string
                      format: uuid
                      pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                    ownerType:
                      type: string
                      minLength: 1
                    attributes:
                      default: {}
                      type: object
                      propertyNames:
                        type: string
                      additionalProperties: {}
                    tags:
                      type: array
                      items:
                        type: string
                    variants:
                      type: array
                      items:
                        type: string
                        pattern: ^([A-Za-z0-9_]+:[0-9]+[xX][0-9]+,)*[A-Za-z0-9_]+:[0-9]+[xX][0-9]+$
                    files:
                      minItems: 1
                      maxItems: 10
                      type: array
                      items:
                        type: object
                        properties:
                          data: {}
                          filename:
                            type: string
                          encoding:
                            type: string
                          mimetype:
                            type: string
                          limit:
                            type: boolean
                          sortOrder:
                            type: integer
                            minimum: -9007199254740991
                            maximum: 9007199254740991
                        required:
                          - data
                          - filename
                          - encoding
                          - mimetype
                          - limit
                  required:
                    - ownerId
                    - ownerType
                    - files
                - type: object
                  properties:
                    ownerId:
                      type: string
                      format: uuid
                      pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                    ownerType:
                      type: string
                      minLength: 1
                    attributes:
                      default: {}
                      type: object
                      propertyNames:
                        type: string
                      additionalProperties: {}
                    tags:
                      type: array
                      items:
                        type: string
                    variants:
                      type: array
                      items:
                        type: string
                        pattern: ^([A-Za-z0-9_]+:[0-9]+[xX][0-9]+,)*[A-Za-z0-9_]+:[0-9]+[xX][0-9]+$
                    urls:
                      minItems: 1
                      maxItems: 10
                      type: array
                      items:
                        type: object
                        properties:
                          url:
                            type: string
                            format: uri
                          sortOrder:
                            type: integer
                            minimum: -9007199254740991
                            maximum: 9007199254740991
                        required:
                          - url
                  required:
                    - ownerId
                    - ownerType
                    - urls
      responses:
        "200":
          description: Default Response
  /api/v1/media/{id}:
    get:
      tags:
        - Media
      description: Get media by ID
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    put:
      tags:
        - Media
      description: Update media metadata by ID
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                attributes:
                  type: object
                  propertyNames:
                    type: string
                  additionalProperties: {}
                tags:
                  type: array
                  items:
                    type: string
                sortOrder:
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    delete:
      tags:
        - Media
      description: Delete media by ID
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/media/owner/{ownerId}/{ownerType}:
    get:
      tags:
        - Media
      description: Get all media for a specific owner
      parameters:
        - schema:
            type: string
          in: path
          name: ownerId
          required: true
        - schema:
            type: string
          in: path
          name: ownerType
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/translations:
    get:
      tags:
        - Translations
      description: Get all translations with pagination
      parameters:
        - schema:
            default: 1
            type: integer
            minimum: 1
            maximum: 9007199254740991
          in: query
          name: page
          required: false
        - schema:
            default: 20
            type: integer
            minimum: 1
            maximum: 100
          in: query
          name: limit
          required: false
        - schema:
            type: string
          in: query
          name: lang
          required: false
        - schema:
            type: string
          in: query
          name: field
          required: false
        - schema:
            type: string
          in: query
          name: service
          required: false
        - schema:
            type: string
          in: query
          name: ownerType
          required: false
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: ownerId
          required: false
        - schema:
            type: string
            enum:
              - TRANSLATED
              - TO_TRANSLATE
          in: query
          name: status
          required: false
      responses:
        "200":
          description: Default Response
    post:
      tags:
        - Translations
      description: Create a new translation
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                lang:
                  type: string
                  minLength: 2
                  maxLength: 10
                field:
                  type: string
                  minLength: 1
                service:
                  type: string
                  minLength: 1
                ownerType:
                  type: string
                  minLength: 1
                ownerId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                value:
                  type: string
                status:
                  default: TO_TRANSLATE
                  type: string
                  enum:
                    - TRANSLATED
                    - TO_TRANSLATE
              required:
                - lang
                - field
                - service
                - ownerType
                - ownerId
                - value
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/translations/{id}:
    get:
      tags:
        - Translations
      description: Get translation by ID
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    put:
      tags:
        - Translations
      description: Update translation by ID
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                value:
                  type: string
                status:
                  type: string
                  enum:
                    - TRANSLATED
                    - TO_TRANSLATE
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    delete:
      tags:
        - Translations
      description: Delete translation by ID
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/translations/upsert:
    put:
      tags:
        - Translations
      description: Create or update translation
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                lang:
                  type: string
                  minLength: 2
                  maxLength: 10
                field:
                  type: string
                  minLength: 1
                service:
                  type: string
                  minLength: 1
                ownerType:
                  type: string
                  minLength: 1
                ownerId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                value:
                  type: string
                status:
                  default: TO_TRANSLATE
                  type: string
                  enum:
                    - TRANSLATED
                    - TO_TRANSLATE
              required:
                - lang
                - field
                - service
                - ownerType
                - ownerId
                - value
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/translations/owner/{ownerId}/{ownerType}:
    get:
      tags:
        - Translations
      description: Get all translations for a specific owner
      parameters:
        - schema:
            type: string
          in: path
          name: ownerId
          required: true
        - schema:
            type: string
          in: path
          name: ownerType
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/translations/owner/{ownerId}/{ownerType}/{lang}:
    get:
      tags:
        - Translations
      description: Get translations for a specific owner and language
      parameters:
        - schema:
            type: string
          in: path
          name: ownerId
          required: true
        - schema:
            type: string
          in: path
          name: ownerType
          required: true
        - schema:
            type: string
          in: path
          name: lang
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/translations/bulk-upsert:
    post:
      tags:
        - Translations
      description: Bulk create or update multiple translations
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                translations:
                  minItems: 1
                  maxItems: 100
                  type: array
                  items:
                    type: object
                    properties:
                      lang:
                        type: string
                        minLength: 2
                        maxLength: 10
                      field:
                        type: string
                        minLength: 1
                      service:
                        type: string
                        minLength: 1
                      ownerType:
                        type: string
                        minLength: 1
                      ownerId:
                        type: string
                        format: uuid
                        pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                      value:
                        type: string
                      status:
                        default: TO_TRANSLATE
                        type: string
                        enum:
                          - TRANSLATED
                          - TO_TRANSLATE
                    required:
                      - lang
                      - field
                      - service
                      - ownerType
                      - ownerId
                      - value
              required:
                - translations
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/translations/stats/{ownerId}/{ownerType}:
    get:
      tags:
        - Translations
      description: Get translation statistics for a specific owner
      parameters:
        - schema:
            type: string
          in: path
          name: ownerId
          required: true
        - schema:
            type: string
          in: path
          name: ownerType
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/languages:
    get:
      tags:
        - Languages
      description: Get all languages with pagination
      parameters:
        - schema:
            default: 1
            type: integer
            minimum: 1
            maximum: 9007199254740991
          in: query
          name: page
          required: false
        - schema:
            default: 20
            type: integer
            minimum: 1
            maximum: 100
          in: query
          name: limit
          required: false
        - schema:
            type: string
          in: query
          name: search
          required: false
        - schema:
            type: string
          in: query
          name: iso_639_1_code
          required: false
      responses:
        "200":
          description: Default Response
    post:
      tags:
        - Languages
      description: Create a new language
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  minLength: 1
                iso_639_1_code:
                  type: string
                  minLength: 2
                  maxLength: 2
                  pattern: ^[a-z]{2}$
                iso_639_2_code:
                  type: string
                  minLength: 3
                  maxLength: 3
                  pattern: ^[a-z]{3}$
                nativeName:
                  type: string
                region:
                  type: string
              required:
                - name
                - iso_639_1_code
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/languages/all:
    get:
      tags:
        - Languages
      description: Get all languages without pagination
      responses:
        "200":
          description: Default Response
  /api/v1/languages/{id}:
    get:
      tags:
        - Languages
      description: Get language by ID
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    put:
      tags:
        - Languages
      description: Update language by ID
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  minLength: 1
                iso_639_1_code:
                  type: string
                  minLength: 2
                  maxLength: 2
                  pattern: ^[a-z]{2}$
                iso_639_2_code:
                  type: string
                  minLength: 3
                  maxLength: 3
                  pattern: ^[a-z]{3}$
                nativeName:
                  type: string
                region:
                  type: string
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    delete:
      tags:
        - Languages
      description: Delete language by ID
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/languages/iso/{isoCode}:
    get:
      tags:
        - Languages
      description: Get language by ISO 639-1 code
      parameters:
        - schema:
            type: string
          in: path
          name: isoCode
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/conversations:
    get:
      tags:
        - Conversations
      description: Get all conversations with pagination and filters
      parameters:
        - schema:
            default: 1
            type: integer
            minimum: 1
            maximum: 9007199254740991
          in: query
          name: page
          required: false
        - schema:
            default: 20
            type: integer
            minimum: 1
            maximum: 100
          in: query
          name: limit
          required: false
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: connectionId
          required: false
        - schema:
            type: string
          in: query
          name: externalId
          required: false
      responses:
        "200":
          description: Default Response
    post:
      tags:
        - Conversations
      description: Create a new conversation
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                connectionId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                externalId:
                  type: string
                  minLength: 1
                lastMessage: {}
                meta:
                  default: {}
                  type: object
                  propertyNames:
                    type: string
                  additionalProperties: {}
              required:
                - connectionId
                - externalId
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/conversations/{id}:
    get:
      tags:
        - Conversations
      description: Get conversation by ID with messages
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    put:
      tags:
        - Conversations
      description: Update conversation metadata
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                lastMessage: {}
                meta:
                  type: object
                  propertyNames:
                    type: string
                  additionalProperties: {}
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    delete:
      tags:
        - Conversations
      description: Delete conversation and all its messages
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/conversations/connection/{connectionId}:
    get:
      tags:
        - Conversations
      description: Get all conversations for a connection
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: connectionId
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/messages:
    get:
      tags:
        - Messages
      description: Get all messages with pagination and filters
      parameters:
        - schema:
            default: 1
            type: integer
            minimum: 1
            maximum: 9007199254740991
          in: query
          name: page
          required: false
        - schema:
            default: 20
            type: integer
            minimum: 1
            maximum: 100
          in: query
          name: limit
          required: false
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: conversationId
          required: false
        - schema:
            type: string
            enum:
              - INBOUND
              - OUTBOUND
          in: query
          name: flow
          required: false
        - schema:
            type: string
            enum:
              - sent
              - delivered
              - read
          in: query
          name: status
          required: false
      responses:
        "200":
          description: Default Response
    post:
      tags:
        - Messages
      description: Create a new message
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                conversationId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                externalId:
                  type: string
                  minLength: 1
                flow:
                  type: string
                  enum:
                    - INBOUND
                    - OUTBOUND
                content:
                  type: string
                  minLength: 1
                status:
                  default: sent
                  type: string
                  enum:
                    - sent
                    - delivered
                    - read
                meta:
                  default: {}
                  type: object
                  propertyNames:
                    type: string
                  additionalProperties: {}
              required:
                - conversationId
                - externalId
                - flow
                - content
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/messages/{id}:
    get:
      tags:
        - Messages
      description: Get message by ID
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    put:
      tags:
        - Messages
      description: Update message content or metadata
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                content:
                  type: string
                  minLength: 1
                status:
                  type: string
                  enum:
                    - sent
                    - delivered
                    - read
                meta:
                  type: object
                  propertyNames:
                    type: string
                  additionalProperties: {}
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    delete:
      tags:
        - Messages
      description: Delete a message
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/messages/conversation/{conversationId}:
    get:
      tags:
        - Messages
      description: Get all messages in a conversation
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: conversationId
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/messages/{id}/delivered:
    patch:
      tags:
        - Messages
      description: Mark message as delivered
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/messages/{id}/read:
    patch:
      tags:
        - Messages
      description: Mark message as read
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/portals:
    get:
      tags:
        - Portals
      description: Get portals with pagination and filters
      parameters:
        - schema:
            default: 1
            type: integer
            minimum: 1
            maximum: 9007199254740991
          in: query
          name: page
          required: false
        - schema:
            default: 20
            type: integer
            minimum: 1
            maximum: 100
          in: query
          name: limit
          required: false
        - schema:
            type: string
          in: query
          name: search
          required: false
        - schema:
            type: boolean
          in: query
          name: isConnectable
          required: false
        - schema:
            type: boolean
          in: query
          name: enableRateLimits
          required: false
        - schema:
            type: string
          in: query
          name: key
          required: false
      responses:
        "200":
          description: Default Response
    post:
      tags:
        - Portals
      description: Create a new portal
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                key:
                  type: string
                  minLength: 1
                name:
                  type: string
                  minLength: 1
                features:
                  anyOf:
                    - {}
                    - type: "null"
                iconUrl:
                  type: string
                  format: uri
                isConnectable:
                  default: true
                  type: boolean
                syncOptions:
                  anyOf:
                    - {}
                    - type: "null"
                enableRateLimits:
                  default: false
                  type: boolean
                apiVersion:
                  anyOf:
                    - type: string
                    - type: "null"
              required:
                - key
                - name
                - iconUrl
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/portals/list:
    get:
      tags:
        - Portals
      description: Get all portals without pagination
      responses:
        "200":
          description: Default Response
  /api/v1/portals/{id}:
    get:
      tags:
        - Portals
      description: Get portal by ID
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    put:
      tags:
        - Portals
      description: Update portal by ID
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                key:
                  type: string
                  minLength: 1
                name:
                  type: string
                  minLength: 1
                features:
                  anyOf:
                    - {}
                    - type: "null"
                iconUrl:
                  type: string
                  format: uri
                isConnectable:
                  default: true
                  type: boolean
                syncOptions:
                  anyOf:
                    - {}
                    - type: "null"
                enableRateLimits:
                  default: false
                  type: boolean
                apiVersion:
                  anyOf:
                    - type: string
                    - type: "null"
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    delete:
      tags:
        - Portals
      description: Delete portal by ID
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/portals/key/{key}:
    get:
      tags:
        - Portals
      description: Get portal by key
      parameters:
        - schema:
            type: string
          in: path
          name: key
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/connections:
    get:
      tags:
        - Connections
      description: Get connections with pagination and filters
      parameters:
        - schema:
            default: 1
            type: integer
            minimum: 1
            maximum: 9007199254740991
          in: query
          name: page
          required: false
        - schema:
            default: 20
            type: integer
            minimum: 1
            maximum: 100
          in: query
          name: limit
          required: false
        - schema:
            type: string
          in: query
          name: search
          required: false
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: companyId
          required: false
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: portalId
          required: false
        - schema:
            type: string
            enum:
              - CONNECTED
              - FAILED
              - NOT_CONNECTED
          in: query
          name: status
          required: false
        - schema:
            type: boolean
          in: query
          name: isPushRates
          required: false
        - schema:
            type: boolean
          in: query
          name: isPullReservations
          required: false
      responses:
        "200":
          description: Default Response
    post:
      tags:
        - Connections
      description: Create a new connection
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  minLength: 1
                companyId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                portalId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                externalId:
                  anyOf:
                    - type: string
                    - type: "null"
                authDetails:
                  anyOf:
                    - {}
                    - type: "null"
                otaFee:
                  default: 0
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
                isPushRates:
                  default: false
                  type: boolean
                isPushContent:
                  default: false
                  type: boolean
                isPushAvailability:
                  default: false
                  type: boolean
                isPullReservations:
                  default: false
                  type: boolean
                isPullContent:
                  default: false
                  type: boolean
                isPullAvailability:
                  default: false
                  type: boolean
                status:
                  type: string
                  enum:
                    - CONNECTED
                    - FAILED
                    - NOT_CONNECTED
                syncOptions: {}
                apiVersion:
                  anyOf:
                    - type: string
                    - type: "null"
              required:
                - name
                - companyId
                - portalId
                - status
                - syncOptions
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/connections/{id}:
    get:
      tags:
        - Connections
      description: Get connection by ID
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    put:
      tags:
        - Connections
      description: Update connection by ID
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  minLength: 1
                companyId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                portalId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                externalId:
                  anyOf:
                    - type: string
                    - type: "null"
                authDetails:
                  anyOf:
                    - {}
                    - type: "null"
                otaFee:
                  default: 0
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
                isPushRates:
                  default: false
                  type: boolean
                isPushContent:
                  default: false
                  type: boolean
                isPushAvailability:
                  default: false
                  type: boolean
                isPullReservations:
                  default: false
                  type: boolean
                isPullContent:
                  default: false
                  type: boolean
                isPullAvailability:
                  default: false
                  type: boolean
                status:
                  type: string
                  enum:
                    - CONNECTED
                    - FAILED
                    - NOT_CONNECTED
                syncOptions: {}
                apiVersion:
                  anyOf:
                    - type: string
                    - type: "null"
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    delete:
      tags:
        - Connections
      description: Delete connection by ID
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/connections/company/{companyId}:
    get:
      tags:
        - Connections
      description: Get connections by company ID
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: companyId
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/connections/portal/{portalId}:
    get:
      tags:
        - Connections
      description: Get connections by portal ID
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: portalId
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/connection-mappings:
    get:
      tags:
        - Connection Mappings
      description: Get connection mappings with pagination and filters
      parameters:
        - schema:
            default: 1
            type: integer
            minimum: 1
            maximum: 9007199254740991
          in: query
          name: page
          required: false
        - schema:
            default: 20
            type: integer
            minimum: 1
            maximum: 100
          in: query
          name: limit
          required: false
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: connectionId
          required: false
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: ratePlanUnitCategoryCombinationId
          required: false
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: connectionCombinationId
          required: false
      responses:
        "200":
          description: Default Response
    post:
      tags:
        - Connection Mappings
      description: Create a new connection mapping
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                connectionId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                ratePlanUnitCategoryCombinationId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                connectionCombinationId:
                  anyOf:
                    - type: string
                      format: uuid
                      pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                    - type: "null"
                mappingConfig:
                  anyOf:
                    - {}
                    - type: "null"
              required:
                - connectionId
                - ratePlanUnitCategoryCombinationId
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/connection-mappings/{id}:
    get:
      tags:
        - Connection Mappings
      description: Get connection mapping by ID
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    put:
      tags:
        - Connection Mappings
      description: Update connection mapping by ID
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                connectionId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                ratePlanUnitCategoryCombinationId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                connectionCombinationId:
                  anyOf:
                    - type: string
                      format: uuid
                      pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                    - type: "null"
                mappingConfig:
                  anyOf:
                    - {}
                    - type: "null"
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    delete:
      tags:
        - Connection Mappings
      description: Delete connection mapping by ID
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/connection-mappings/connection/{connectionId}:
    get:
      tags:
        - Connection Mappings
      description: Get connection mappings by connection ID
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: connectionId
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/connection-combinations:
    get:
      tags:
        - Connection Combinations
      description: Get connection combinations with pagination and filters
      parameters:
        - schema:
            default: 1
            type: integer
            minimum: 1
            maximum: 9007199254740991
          in: query
          name: page
          required: false
        - schema:
            default: 20
            type: integer
            minimum: 1
            maximum: 100
          in: query
          name: limit
          required: false
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: connectionId
          required: false
        - schema:
            type: string
          in: query
          name: productId
          required: false
        - schema:
            type: string
          in: query
          name: search
          required: false
      responses:
        "200":
          description: Default Response
    post:
      tags:
        - Connection Combinations
      description: Create a new connection combination
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                connectionId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                productId:
                  anyOf:
                    - type: string
                    - type: "null"
                name:
                  anyOf:
                    - type: string
                    - type: "null"
                data:
                  anyOf:
                    - {}
                    - type: "null"
              required:
                - connectionId
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/connection-combinations/{id}:
    get:
      tags:
        - Connection Combinations
      description: Get connection combination by ID
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    put:
      tags:
        - Connection Combinations
      description: Update connection combination by ID
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                connectionId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                productId:
                  anyOf:
                    - type: string
                    - type: "null"
                name:
                  anyOf:
                    - type: string
                    - type: "null"
                data:
                  anyOf:
                    - {}
                    - type: "null"
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    delete:
      tags:
        - Connection Combinations
      description: Delete connection combination by ID
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/connection-combinations/connection/{connectionId}:
    get:
      tags:
        - Connection Combinations
      description: Get connection combinations by connection ID
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: connectionId
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/connection-combination-data:
    get:
      tags:
        - Connection Combination Data
      description: Get connection combination data with pagination and filters
      parameters:
        - schema:
            default: 1
            type: integer
            minimum: 1
            maximum: 9007199254740991
          in: query
          name: page
          required: false
        - schema:
            default: 20
            type: integer
            minimum: 1
            maximum: 100
          in: query
          name: limit
          required: false
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: connectionCombinationId
          required: false
        - schema:
            type: string
          in: query
          name: ownerType
          required: false
        - schema:
            type: string
          in: query
          name: value
          required: false
      responses:
        "200":
          description: Default Response
    post:
      tags:
        - Connection Combination Data
      description: Create new connection combination data
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                connectionCombinationId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                ownerType:
                  anyOf:
                    - type: string
                    - type: "null"
                value:
                  anyOf:
                    - type: string
                    - type: "null"
                data:
                  anyOf:
                    - {}
                    - type: "null"
              required:
                - connectionCombinationId
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/connection-combination-data/{id}:
    get:
      tags:
        - Connection Combination Data
      description: Get connection combination data by ID
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    put:
      tags:
        - Connection Combination Data
      description: Update connection combination data by ID
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                connectionCombinationId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                ownerType:
                  anyOf:
                    - type: string
                    - type: "null"
                value:
                  anyOf:
                    - type: string
                    - type: "null"
                data:
                  anyOf:
                    - {}
                    - type: "null"
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    delete:
      tags:
        - Connection Combination Data
      description: Delete connection combination data by ID
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/connection-combination-data/combination/{connectionCombinationId}:
    get:
      tags:
        - Connection Combination Data
      description: Get connection combination data by combination ID
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: connectionCombinationId
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/portal-mappings:
    get:
      tags:
        - Portal Mappings
      description: Get portal mappings with pagination and filters
      parameters:
        - schema:
            default: 1
            type: integer
            minimum: 1
            maximum: 9007199254740991
          in: query
          name: page
          required: false
        - schema:
            default: 20
            type: integer
            minimum: 1
            maximum: 100
          in: query
          name: limit
          required: false
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: portalId
          required: false
        - schema:
            type: string
          in: query
          name: category
          required: false
        - schema:
            type: string
          in: query
          name: origin
          required: false
        - schema:
            type: string
          in: query
          name: value
          required: false
      responses:
        "200":
          description: Default Response
    post:
      tags:
        - Portal Mappings
      description: Create a new portal mapping
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                portalId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                category:
                  anyOf:
                    - type: string
                    - type: "null"
                origin:
                  type: string
                  minLength: 1
                value:
                  anyOf:
                    - type: string
                    - type: "null"
              required:
                - portalId
                - origin
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/portal-mappings/{id}:
    get:
      tags:
        - Portal Mappings
      description: Get portal mapping by ID
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    put:
      tags:
        - Portal Mappings
      description: Update portal mapping by ID
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                portalId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                category:
                  anyOf:
                    - type: string
                    - type: "null"
                origin:
                  type: string
                  minLength: 1
                value:
                  anyOf:
                    - type: string
                    - type: "null"
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    delete:
      tags:
        - Portal Mappings
      description: Delete portal mapping by ID
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/portal-mappings/portal/{portalId}:
    get:
      tags:
        - Portal Mappings
      description: Get portal mappings by portal ID
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: portalId
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/ip-rate-limits:
    get:
      tags:
        - IP Rate Limits
      description: Get IP rate limits with pagination and filters
      parameters:
        - schema:
            default: 1
            type: integer
            minimum: 1
            maximum: 9007199254740991
          in: query
          name: page
          required: false
        - schema:
            default: 20
            type: integer
            minimum: 1
            maximum: 100
          in: query
          name: limit
          required: false
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: portalId
          required: false
        - schema:
            type: string
          in: query
          name: granularity
          required: false
      responses:
        "200":
          description: Default Response
    post:
      tags:
        - IP Rate Limits
      description: Create a new IP rate limit
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                portalId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                granularity:
                  type: string
                  minLength: 1
                limit:
                  type: integer
                  minimum: 1
                  maximum: 9007199254740991
                durationSeconds:
                  type: integer
                  minimum: 1
                  maximum: 9007199254740991
              required:
                - portalId
                - granularity
                - limit
                - durationSeconds
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/ip-rate-limits/{id}:
    get:
      tags:
        - IP Rate Limits
      description: Get IP rate limit by ID
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    put:
      tags:
        - IP Rate Limits
      description: Update IP rate limit by ID
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                portalId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                granularity:
                  type: string
                  minLength: 1
                limit:
                  type: integer
                  minimum: 1
                  maximum: 9007199254740991
                durationSeconds:
                  type: integer
                  minimum: 1
                  maximum: 9007199254740991
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    delete:
      tags:
        - IP Rate Limits
      description: Delete IP rate limit by ID
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/ip-rate-limits/portal/{portalId}:
    get:
      tags:
        - IP Rate Limits
      description: Get IP rate limits by portal ID
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: portalId
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/api-rate-limits:
    get:
      tags:
        - API Rate Limits
      description: Get API rate limits with pagination and filters
      parameters:
        - schema:
            default: 1
            type: integer
            minimum: 1
            maximum: 9007199254740991
          in: query
          name: page
          required: false
        - schema:
            default: 20
            type: integer
            minimum: 1
            maximum: 100
          in: query
          name: limit
          required: false
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: portalId
          required: false
        - schema:
            type: string
          in: query
          name: endpoint
          required: false
        - schema:
            type: string
          in: query
          name: method
          required: false
      responses:
        "200":
          description: Default Response
    post:
      tags:
        - API Rate Limits
      description: Create a new API rate limit
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                portalId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                endpoint:
                  type: string
                  minLength: 1
                method:
                  type: string
                  minLength: 1
                limit:
                  type: string
                  minLength: 1
                durationSeconds:
                  type: integer
                  minimum: 1
                  maximum: 9007199254740991
              required:
                - portalId
                - endpoint
                - method
                - limit
                - durationSeconds
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/api-rate-limits/{id}:
    get:
      tags:
        - API Rate Limits
      description: Get API rate limit by ID
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    put:
      tags:
        - API Rate Limits
      description: Update API rate limit by ID
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                portalId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                endpoint:
                  type: string
                  minLength: 1
                method:
                  type: string
                  minLength: 1
                limit:
                  type: string
                  minLength: 1
                durationSeconds:
                  type: integer
                  minimum: 1
                  maximum: 9007199254740991
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    delete:
      tags:
        - API Rate Limits
      description: Delete API rate limit by ID
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/api-rate-limits/portal/{portalId}:
    get:
      tags:
        - API Rate Limits
      description: Get API rate limits by portal ID
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: portalId
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/endpoint-method-mappings:
    get:
      tags:
        - Endpoint Method Mappings
      description: Get endpoint method mappings with pagination and filters
      parameters:
        - schema:
            default: 1
            type: integer
            minimum: 1
            maximum: 9007199254740991
          in: query
          name: page
          required: false
        - schema:
            default: 20
            type: integer
            minimum: 1
            maximum: 100
          in: query
          name: limit
          required: false
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: endpointId
          required: false
        - schema:
            type: string
          in: query
          name: methodId
          required: false
      responses:
        "200":
          description: Default Response
    post:
      tags:
        - Endpoint Method Mappings
      description: Create a new endpoint method mapping
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                endpointId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                methodId:
                  type: string
                  minLength: 1
              required:
                - endpointId
                - methodId
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/endpoint-method-mappings/{id}:
    get:
      tags:
        - Endpoint Method Mappings
      description: Get endpoint method mapping by ID
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    put:
      tags:
        - Endpoint Method Mappings
      description: Update endpoint method mapping by ID
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                endpointId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                methodId:
                  type: string
                  minLength: 1
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    delete:
      tags:
        - Endpoint Method Mappings
      description: Delete endpoint method mapping by ID
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/endpoint-method-mappings/endpoint/{endpointId}:
    get:
      tags:
        - Endpoint Method Mappings
      description: Get endpoint method mappings by endpoint ID
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: endpointId
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/endpoint-method-mappings/method/{methodId}:
    get:
      tags:
        - Endpoint Method Mappings
      description: Get endpoint method mappings by method ID
      parameters:
        - schema:
            type: string
          in: path
          name: methodId
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/otas/vrbo/advertisersIndex:
    get:
      tags:
        - VRBO - Index
      description: Get VRBO advertisers index XML
      responses:
        "200":
          description: Default Response
  /api/v1/otas/vrbo/advertisers/{id}/listingsIndex:
    get:
      tags:
        - VRBO - Index
      description: Get VRBO Advertiser Index Listings XML
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/otas/vrbo/advertisers/{id}/configIndex:
    get:
      tags:
        - VRBO - Index
      description: Get VRBO Advertiser Index Configurations XML
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/otas/vrbo/advertisers/{id}/ratesIndex:
    get:
      tags:
        - VRBO - Index
      description: Get VRBO Advertiser Lodging Rate Index XML
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/otas/vrbo/advertisers/{id}/unitAvailabilityIndex:
    get:
      tags:
        - VRBO - Index
      description: Get VRBO Advertiser Index Unit Availability XML
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/otas/vrbo/bus/advertiserIndex:
    get:
      tags:
        - VRBO - Index
      description: Get VRBO content index XML
      parameters:
        - schema:
            type: string
            minLength: 1
          in: query
          name: advertiserId
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/otas/vrbo/bus/advertisers/{id}/contentIndex:
    get:
      tags:
        - VRBO - Index
      description: Get VRBO Advertiser Index Content XML
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/otas/vrbo/listings/{id}/config:
    get:
      tags:
        - VRBO - Content
      description: Get VRBO Unit Lodging Configuration Content XML
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/otas/vrbo/listings/{id}/unitAvailability:
    get:
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/otas/vrbo/listings/{id}/rates:
    get:
      tags:
        - VRBO - Content
      description: Get VRBO Unit Lodging Rate Content XML
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/otas/vrbo/listings/{id}/content:
    get:
      tags:
        - VRBO - Content
      description: Get VRBO Listing Content XML (descriptions, units, bedrooms,
        bathrooms, amenities, images)
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/otas/google-hotel/property-list:
    get:
      tags:
        - Google Hotel
      description: Get Google Hotel List Feed XML (Pull Mode). Use
        ?lang=en&refresh=true to force regeneration and cache update.
      parameters:
        - schema:
            type: string
            minLength: 1
            maxLength: 10
          in: query
          name: lang
          required: false
        - schema:
            type: string
            enum:
              - "0"
              - "1"
              - "true"
              - "false"
          in: query
          name: refresh
          required: false
      responses:
        "200":
          description: Default Response
  /api/v1/otas/google-hotel/booking-proxy:
    get:
      tags:
        - Google Hotel
      description: "Proxy a PMS booking URL. Query: gsite, propertyId, checkin,
        checkout, guests. Redirects to PMS URL or to google.com on error."
      parameters:
        - schema:
            type: string
          in: query
          name: gsite
          required: true
        - schema:
            type: string
          in: query
          name: propertyId
          required: true
        - schema:
            type: string
          in: query
          name: checkin
          required: true
        - schema:
            type: string
          in: query
          name: checkout
          required: true
        - schema:
            type: string
          in: query
          name: guests
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/data-sync/jobs:
    post:
      tags:
        - Data Sync - Jobs
      description: Queue calendar sync job for processing
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                id:
                  type: string
                items:
                  minItems: 1
                  type: array
                  items:
                    type: object
                    properties:
                      ratePlanUnitCategoryCombinationId:
                        type: string
                      startDate:
                        type: string
                      endDate:
                        type: string
                      availability:
                        type: number
                      occupancy:
                        type: number
                      amount:
                        type: number
                        minimum: 0
                      minStay:
                        type: number
                      maxStay:
                        type: number
                      minAdvanceRes:
                        anyOf:
                          - type: string
                          - type: "null"
                      maxAdvanceRes:
                        anyOf:
                          - type: string
                          - type: "null"
                      closeToArrival:
                        type: boolean
                      closeToDeparture:
                        type: boolean
                      stopSell:
                        type: boolean
                    required:
                      - ratePlanUnitCategoryCombinationId
                      - startDate
                      - endDate
                      - occupancy
                skipDiffCheck:
                  default: false
                  type: boolean
              required:
                - items
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/data-sync/jobs/{id}:
    get:
      tags:
        - Data Sync - Jobs
      description: Get calendar sync job status
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/data-sync/dashboard/queues:
    get:
      tags:
        - Data Sync - Dashboard
      description: List all BullMQ queues with job counts per state (waiting, active,
        completed, failed, etc.)
      responses:
        "200":
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  queues:
                    type: array
                    items:
                      type: object
                      properties:
                        name:
                          type: string
                        counts:
                          type: object
                          propertyNames:
                            type: string
                          additionalProperties:
                            type: number
                      required:
                        - name
                        - counts
                      additionalProperties: false
                required:
                  - queues
                additionalProperties: false
  /api/v1/data-sync/dashboard/queues/{queueName}/jobs:
    get:
      tags:
        - Data Sync - Dashboard
      description: List jobs for a queue (optional state filter and pagination)
      parameters:
        - schema:
            type: string
          in: query
          name: state
          required: false
          description: "Comma-separated: waiting,active,completed,failed,delayed"
        - schema:
            type: integer
            minimum: 0
            maximum: 9007199254740991
          in: query
          name: start
          required: false
          description: Pagination start index
        - schema:
            type: integer
            minimum: 0
            maximum: 9007199254740991
          in: query
          name: end
          required: false
          description: Pagination end index
        - schema:
            type: string
            minLength: 1
          in: path
          name: queueName
          required: true
      responses:
        "200":
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  jobs:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                        name:
                          type: string
                        state:
                          type: string
                        timestamp:
                          type: number
                        processedOn:
                          type: number
                        finishedOn:
                          type: number
                        progress:
                          anyOf:
                            - type: number
                            - type: object
                              propertyNames:
                                type: string
                              additionalProperties: {}
                        data: {}
                        returnvalue: {}
                        failedReason:
                          type: string
                      required:
                        - id
                        - name
                        - state
                      additionalProperties: false
                required:
                  - jobs
                additionalProperties: false
  /api/v1/data-sync/dashboard/queues/{queueName}/jobs/{jobId}:
    get:
      tags:
        - Data Sync - Dashboard
      description: Get full details of a single BullMQ job
      parameters:
        - schema:
            type: string
            minLength: 1
          in: path
          name: queueName
          required: true
        - schema:
            type: string
            minLength: 1
          in: path
          name: jobId
          required: true
      responses:
        "200":
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: string
                  name:
                    type: string
                  state:
                    type: string
                  timestamp:
                    type: number
                  processedOn:
                    type: number
                  finishedOn:
                    type: number
                  progress:
                    anyOf:
                      - type: number
                      - type: object
                        propertyNames:
                          type: string
                        additionalProperties: {}
                  data: {}
                  returnvalue: {}
                  failedReason:
                    type: string
                  opts:
                    type: object
                    propertyNames:
                      type: string
                    additionalProperties: {}
                  stacktrace:
                    type: array
                    items:
                      type: string
                required:
                  - id
                  - name
                  - state
                additionalProperties: false
  /api/v1/data-sync/content-push:
    post:
      tags:
        - Data Sync - Content Sync
      description: "Trigger content sync towards OTAs. Enqueues one job per item.
        Payload: { items: [{ connectionId, syncType }] }"
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                items:
                  minItems: 1
                  type: array
                  items:
                    type: object
                    properties:
                      connectionId:
                        type: string
                        minLength: 1
                      syncType:
                        type: string
                        minLength: 1
                    required:
                      - connectionId
                      - syncType
              required:
                - items
        required: true
      responses:
        "202":
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  accepted:
                    type: boolean
                  items:
                    type: array
                    items:
                      type: object
                      properties:
                        connectionId:
                          type: string
                        syncType:
                          type: string
                      required:
                        - connectionId
                        - syncType
                      additionalProperties: false
                  jobIds:
                    type: array
                    items:
                      type: string
                  message:
                    type: string
                required:
                  - accepted
                  - items
                  - jobIds
                  - message
                additionalProperties: false
  /api/v1/data-sync/content-pull:
    post:
      tags:
        - Connections
      description: 'Trigger pull-content: syncTypes = "*" (tutto) oppure array
        ["listings","reservations","calendar","messaging"]. calendar =
        rates+availability. Items merged by connectionId. For each accepted
        connection, one job is added to evt.pull.content.bms, .cms, .dts.'
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                items:
                  minItems: 1
                  type: array
                  items:
                    type: object
                    properties:
                      connectionId:
                        type: string
                        minLength: 1
                      syncTypes:
                        anyOf:
                          - type: string
                            enum:
                              - "*"
                          - minItems: 1
                            type: array
                            items:
                              type: string
                              enum:
                                - listings
                                - reservations
                                - calendar
                                - messaging
                    required:
                      - connectionId
                      - syncTypes
              required:
                - items
        required: true
      responses:
        "202":
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  accepted:
                    type: boolean
                  acceptedItems:
                    type: array
                    items:
                      type: object
                      properties:
                        connectionId:
                          type: string
                        syncTypes:
                          type: array
                          items:
                            type: string
                      required:
                        - connectionId
                        - syncTypes
                      additionalProperties: false
                  rejectedItems:
                    type: array
                    items:
                      type: object
                      properties:
                        connectionId:
                          type: string
                        reason:
                          type: string
                      required:
                        - connectionId
                        - reason
                      additionalProperties: false
                  jobIds:
                    type: array
                    items:
                      type: string
                  message:
                    type: string
                required:
                  - accepted
                  - acceptedItems
                  - rejectedItems
                  - jobIds
                  - message
                additionalProperties: false
  /api/v1/data-sync/auto-mapping:
    post:
      tags:
        - Data Sync - Auto Mapping
      description: Create connection mappings for connectionId × all rate plan unit
        category combinations of the property (unit categories × rate plans).
        Skips combinations that do not exist or are already mapped.
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                connectionId:
                  type: string
                  minLength: 1
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                propertyId:
                  type: string
                  minLength: 1
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              required:
                - connectionId
                - propertyId
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/webhook-subscriptions:
    get:
      tags:
        - Webhook Subscriptions
      description: Get webhook subscriptions with pagination and filters
      parameters:
        - schema:
            default: 1
            type: integer
            minimum: 1
            maximum: 9007199254740991
          in: query
          name: page
          required: false
        - schema:
            default: 20
            type: integer
            minimum: 1
            maximum: 100
          in: query
          name: limit
          required: false
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: userId
          required: false
        - schema:
            type: string
          in: query
          name: event
          required: false
        - schema:
            type: string
          in: query
          name: endpoint
          required: false
      responses:
        "200":
          description: Default Response
    post:
      tags:
        - Webhook Subscriptions
      description: Create a new webhook subscription
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                userId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                securityToken:
                  anyOf:
                    - type: string
                    - type: "null"
                event:
                  type: string
                  minLength: 1
                endpoint:
                  type: string
                  format: uri
                maxRetry:
                  default: 5
                  type: integer
                  minimum: 0
                  maximum: 10
              required:
                - userId
                - event
                - endpoint
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/webhook-subscriptions/list:
    get:
      tags:
        - Webhook Subscriptions
      description: Get all webhook subscriptions without pagination
      responses:
        "200":
          description: Default Response
  /api/v1/webhook-subscriptions/{id}:
    get:
      tags:
        - Webhook Subscriptions
      description: Get webhook subscription by ID
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    put:
      tags:
        - Webhook Subscriptions
      description: Update webhook subscription by ID
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                userId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                securityToken:
                  anyOf:
                    - type: string
                    - type: "null"
                event:
                  type: string
                  minLength: 1
                endpoint:
                  type: string
                  format: uri
                maxRetry:
                  default: 5
                  type: integer
                  minimum: 0
                  maximum: 10
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    delete:
      tags:
        - Webhook Subscriptions
      description: Delete webhook subscription by ID
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/webhook-subscriptions/user/{userId}:
    get:
      tags:
        - Webhook Subscriptions
      description: Get webhook subscriptions by user ID
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: userId
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/webhook-subscriptions/event/{event}:
    get:
      tags:
        - Webhook Subscriptions
      description: Get webhook subscriptions by event
      parameters:
        - schema:
            type: string
          in: path
          name: event
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/webhook-jobs:
    get:
      tags:
        - Webhook Jobs
      description: Get webhook jobs with pagination and filters
      parameters:
        - schema:
            default: 1
            type: integer
            minimum: 1
            maximum: 9007199254740991
          in: query
          name: page
          required: false
        - schema:
            default: 20
            type: integer
            minimum: 1
            maximum: 100
          in: query
          name: limit
          required: false
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: webHookSubscriptionId
          required: false
        - schema:
            type: integer
            minimum: 1
            maximum: 3
          in: query
          name: status
          required: false
        - schema: {}
          in: query
          name: nextRunBefore
          required: false
        - schema: {}
          in: query
          name: nextRunAfter
          required: false
      responses:
        "200":
          description: Default Response
    post:
      tags:
        - Webhook Jobs
      description: Create a new webhook job
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                webHookSubscriptionId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                data:
                  type: object
                  propertyNames:
                    type: string
                  additionalProperties: {}
                maxRetry:
                  type: integer
                  minimum: 0
                  maximum: 10
                nextRun:
                  anyOf:
                    - {}
                    - type: "null"
                status:
                  default: 3
                  anyOf:
                    - type: number
                      enum:
                        - 1
                    - type: number
                      enum:
                        - 2
                    - type: number
                      enum:
                        - 3
              required:
                - webHookSubscriptionId
                - data
                - maxRetry
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/webhook-jobs/list:
    get:
      tags:
        - Webhook Jobs
      description: Get all webhook jobs without pagination
      responses:
        "200":
          description: Default Response
  /api/v1/webhook-jobs/to-execute:
    get:
      tags:
        - Webhook Jobs
      description: Get webhook jobs ready to execute
      responses:
        "200":
          description: Default Response
  /api/v1/webhook-jobs/{id}:
    get:
      tags:
        - Webhook Jobs
      description: Get webhook job by ID
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    put:
      tags:
        - Webhook Jobs
      description: Update webhook job by ID
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                webHookSubscriptionId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                data:
                  type: object
                  propertyNames:
                    type: string
                  additionalProperties: {}
                maxRetry:
                  type: integer
                  minimum: 0
                  maximum: 10
                nextRun:
                  anyOf:
                    - {}
                    - type: "null"
                status:
                  default: 3
                  anyOf:
                    - type: number
                      enum:
                        - 1
                    - type: number
                      enum:
                        - 2
                    - type: number
                      enum:
                        - 3
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    delete:
      tags:
        - Webhook Jobs
      description: Delete webhook job by ID
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/webhook-jobs/subscription/{subscriptionId}:
    get:
      tags:
        - Webhook Jobs
      description: Get webhook jobs by subscription ID
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: subscriptionId
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/webhook-jobs/status/{status}:
    get:
      tags:
        - Webhook Jobs
      description: Get webhook jobs by status (1=SUCCESS, 2=FAILED, 3=TO_EXECUTE)
      parameters:
        - schema:
            type: string
          in: path
          name: status
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/webhook-jobs/{id}/success:
    post:
      tags:
        - Webhook Jobs
      description: Mark webhook job as success
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/webhook-jobs/{id}/failed:
    post:
      tags:
        - Webhook Jobs
      description: Mark webhook job as failed and schedule retry
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/webhook-job-logs:
    get:
      tags:
        - Webhook Job Logs
      description: Get webhook job logs with pagination and filters
      parameters:
        - schema:
            default: 1
            type: integer
            minimum: 1
            maximum: 9007199254740991
          in: query
          name: page
          required: false
        - schema:
            default: 20
            type: integer
            minimum: 1
            maximum: 100
          in: query
          name: limit
          required: false
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: query
          name: webHookJobId
          required: false
        - schema:
            type: string
          in: query
          name: responseCode
          required: false
      responses:
        "200":
          description: Default Response
    post:
      tags:
        - Webhook Job Logs
      description: Create a new webhook job log
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                webHookJobId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                response:
                  type: object
                  propertyNames:
                    type: string
                  additionalProperties: {}
                responseCode:
                  type: string
                  minLength: 1
              required:
                - webHookJobId
                - response
                - responseCode
        required: true
      responses:
        "200":
          description: Default Response
  /api/v1/webhook-job-logs/list:
    get:
      tags:
        - Webhook Job Logs
      description: Get all webhook job logs without pagination
      responses:
        "200":
          description: Default Response
  /api/v1/webhook-job-logs/{id}:
    get:
      tags:
        - Webhook Job Logs
      description: Get webhook job log by ID
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    put:
      tags:
        - Webhook Job Logs
      description: Update webhook job log by ID
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                webHookJobId:
                  type: string
                  format: uuid
                  pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                response:
                  type: object
                  propertyNames:
                    type: string
                  additionalProperties: {}
                responseCode:
                  type: string
                  minLength: 1
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
    delete:
      tags:
        - Webhook Job Logs
      description: Delete webhook job log by ID
      parameters:
        - schema:
            anyOf:
              - type: string
                format: uuid
                pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              - type: string
                minLength: 1
          in: path
          name: id
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/webhook-job-logs/job/{jobId}:
    get:
      tags:
        - Webhook Job Logs
      description: Get webhook job logs by job ID
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: jobId
          required: true
      responses:
        "200":
          description: Default Response
  /api/v1/webhook-job-logs/response-code/{code}:
    get:
      tags:
        - Webhook Job Logs
      description: Get webhook job logs by response code
      parameters:
        - schema:
            type: string
          in: path
          name: code
          required: true
      responses:
        "200":
          description: Default Response
components:
  schemas: {}
  responses: {}
  parameters: {}
  requestBodies: {}
  securitySchemes: {}
x-tagGroups:
  - name: "BMS: Booking Management System"
    tags:
      - Payments
      - Promotions
      - Rate Plan Calendar
      - Rate Plan Combinations
      - Rate Plan Rate Calendar
      - Rate Plan Refundable Settings
      - Rate Plans
      - Refundable Settings
      - Reservation Extras
      - Reservation Groups
      - Reservations
      - Reviews
      - VRBO
  - name: "CMS: Content Management System"
    tags:
      - Auth
      - Companies
      - Company Users
      - Conversations
      - Facilities
      - Facility Categories
      - Invites
      - Languages
      - Media
      - Messages
      - OAuth
      - Policies
      - Properties
      - Property Facilities
      - Property Owners
      - Property Policies
      - Translations
      - Unit Categories
      - Unit Category Facilities
      - Users
  - name: "DTS: Data Sync System"
    tags:
      - API Rate Limits
      - Connection Combination Data
      - Connection Combinations
      - Connection Mappings
      - Connections
      - Data Sync - Auto Mapping
      - Data Sync - Content Sync
      - Data Sync - Dashboard
      - Data Sync - Jobs
      - Endpoint Method Mappings
      - Google Hotel
      - IP Rate Limits
      - Portal Mappings
      - Portals
      - VRBO - Content
      - VRBO - Index
      - Webhook Job Logs
      - Webhook Jobs
      - Webhook Subscriptions
