openapi: 3.0.3
info:
  title: Bókun RESTful web services
  description: |-
    These web services are a second generation of Bókun's RESTful API offerings. Initially they will have a list of new services, such as marketplace access etc. but the eventual plan is to add selected [v1 counterparts](https://bokun.github.io/api-docs/). As of now, you may use both v1 and v2 interchangeably; as the same API keys should work for both versions.
    
    **Data types**
    
    DTOs used in these services have the following rules for data types:
    
      - always use UTC timestamp (number of milliseconds since January 1, 1970, 00:00:00 UTC) for date & time objects; provide timezone context in a separate field where appropriate
      - use Swagger native string/date for date-only fields; provide timezone context in a separate field where appropriate
      - always use strings for monetary/commission amounts, never use float or double. Please refer to [Java BigDecimal](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/math/BigDecimal.html#%3Cinit%3E(java.lang.String)) for more details. 
    
    **Backwards compatibility policy**
    
    We take backwards compatibility seriously and pledge to the following policy:

      - existing URL endpoints will not be removed without sensible sunset warning, but any new new endpoints may be added without prior notice
      - existing attributes in DTOs will not be removed, but new attributes and/or DTO types may be added without prior notice
      - established input names and types (path elements, query parameters) of existing endpoints will not be removed, but a more flexible rules may be applied in case if such endpoint is changed without prior notice
      - types of established DTO attributes will not change
      - mandatory DTO attributes will not be removed but in case if field becomes no longer mandatory, some default value will be sent
      - each minor/backwards compatible API change will result a minor version increase, e.g. `v2.0.1` -> `v.2.0.2`
      - each major/backwards incompatible API change (if any) will result a new set of endpoints/DTOs and will major/middle version increase, e.g. `v2.0.1` -> `v.3.0.0` or `v2.0.1` -> `v.2.1.0`
      - generated .class files for DTO objects will reflect the version name without minor component, e.g. v2.0.9 will be placed in `io.bokun.rest.v2_0` package
      - we do not provide any guarantees over the ordering of DTO JSON siblings (attributes at the same JSON object level). Assume that order may change at any time
      - DTO attributes with null values and absent attributes are semantically equal. We will always prefer the absence but the receiving end must be able to handle nulls if they appear
      - for array types, we generally aim to keep empty arrays for DTO access convenience but don't assume this will be held universally
      - for inherited types (`allOf`), we reserve the right to promote attributes in DTO objects up the inheritance hierarchy without prior notice
      - we will not remove elements from enums without prior notice but reserve the right to add new elements in 

    Some useful links:
    - [Bókun developer documentation portal](https://bokun.dev/)
  contact:
    email: api@bokun.is
  version: 2.0.169
externalDocs:
  description: Find out more about Bókun
  url: https://bokun.io
servers:
  - url: https://api.bokuntest.com
    description: test server
  - url: https://api.bokun.io
    description: production server
tags:
  - name: general
    description: General/common endpoints without affiliation to any particular functionality group.
  - name: marketplace
    description: Endpoints pertaining to Bókun marketplace.
  - name: pricing
    description: Endpoints pertaining to pricing API.
  - name: booking
    description: Endpoints pertaining to booking API.
  - name: experience booking
    description: Endpoints pertaining to experience booking API.
  - name: experience
    description: Endpoints enabling access to your own or contracted products.
  - name: customer
    description: Endpoints pertaining to customers.
  - name: resource
    description: Endpoints pertaining to resource management.
  - name: availability
    description: Endpoints pertaining to availability management.
paths:
  /restapi/v2.0/countries:
    get:
      tags:
        - general
      summary: provide a list of supported countries
      description: provides a list of supported countries
      operationId: getCountries
      parameters:
        - name: languageTag
          in: query
          description: if specified, this will result country names printed in specified language/locale. The format of
            this string IETF BCP 47 language tag, e.g. 'de-DE'. If omitted, this will print country names in English.
          required: false
          schema:
            type: string
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/CountryDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
  /restapi/v2.0/timezones:
    get:
      tags:
        - general
      summary: provide a list of supported time zones
      description: provides a list of supported time zones
      operationId: getTimeZones
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
  /restapi/v2.0/marketplace/contract/{contractId}:
    get:
      tags:
        - marketplace
      summary: Get details of a contract by contract ID
      description: Get details of a contract by contract ID. Requires the caller to have Marketplace contract view permission granted.
      operationId: getContractById
      parameters:
        - name: contractId
          in: path
          description: ID of contract
          required: true
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VendorContractDto'
        '400':
          description: Invalid contract ID supplied
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: Contract not found or is not readable by the current vendor or caller doesn't have Marketplace contract view permission
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
  /restapi/v2.0/marketplace/contracts/seller:
    get:
      tags:
        - marketplace
      summary: Get an array of contract IDs where current vendor acts as a supplier and all vendors of returned contracts are resellers.
      description: Requires the caller to have Marketplace contract view permission granted. Note that this will also bring OTA contracts.
      operationId: getSellerContracts
      parameters:
        - name: country
          in: query
          description: ISO 3166-1 Alpha-2 code. Supported codes&#58; as per `CountryDto::code`. If specified,
            the results will be filtered to only contain resellers from said country.
          required: false
          schema:
            type: string
        - name: status
          in: query
          description: contract status to filter by. If specified, the results will be filtered to only contain contracts with said status.
          required: false
          schema:
            $ref: '#/components/schemas/VendorContractStatusDto'
        - name: sellerId
          in: query
          description: could be used to filter results by arbitrary reseller ID (vendor ID). If used, this will limit result set to zero (if no such contract exists) or one (if contract does exist) items.
          required: false
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  type: integer
                  format: int64
        '403':
          description: Caller doesn't have Marketplace contract view permission.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
  /restapi/v2.0/marketplace/contracts/supplier:
    get:
      tags:
        - marketplace
      summary: Get an array of contract IDs where current vendor acts as a reseller and returned vendors are suppliers.
      description: Requires the caller to have Marketplace contract view permission granted.
      operationId: getSupplierContracts
      parameters:
        - name: country
          in: query
          description: ISO 3166-1 Alpha-2 code. Supported codes&#58; as in `CountryDto::code`. If specified, the
            results will be filtered to only contain resellers from said country.
          required: false
          schema:
            type: string
        - name: status
          in: query
          description: contract status to filter by. If specified, the results will be filtered to only contain contracts with said status.
          required: false
          schema:
            $ref: '#/components/schemas/VendorContractStatusDto'
        - name: supplierId
          in: query
          description: could be used to filter results by arbitrary supplier ID (vendor ID). If used, this will limit result set to zero (if no such contract exists) or one (if contract does exist) items.
          required: false
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  type: integer
                  format: int64
        '403':
          description: Caller doesn't have Marketplace contract view permission.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
  /restapi/v2.0/marketplace/vendor/{vendorId}:
    get:
      tags:
        - marketplace
      summary: Get information about a marketplace vendor who is either your supplier or reseller
      description: Requires the caller to have Marketplace contract view permission granted.
      operationId: getMarketplaceVendor
      parameters:
        - name: vendorId
          in: path
          description: ID of vendor
          required: true
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MarketplaceVendorDto'
        '400':
          description: Invalid vendor ID supplied
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: Vendor not found or no contracts exist between current and requested vendors or caller doesn't have Marketplace contract view permission
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
  /restapi/v2.0/marketplace/vendor/self/:
    get:
      tags:
        - marketplace
      summary: Get information about myself, as a marketplace vendor
      operationId: getMarketplaceVendorSelf
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MarketplaceVendorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
  /restapi/v2.0/marketplace/contract/{contractId}/experience/{experienceId}/commission:
    get:
      tags:
        - marketplace
      summary: Get commission data for given experience product/marketplace contract combo
      description: Get commission data for given experience product/marketplace contract combo. Requires the caller to have Marketplace contract view permission granted.
      operationId: getContractExperienceCommission
      parameters:
        - name: contractId
          in: path
          description: ID of contract
          required: true
          schema:
            type: integer
            format: int64
        - name: experienceId
          in: path
          description: ID of experience product
          required: true
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ExperienceCommissionDto'
        '400':
          description: Invalid contract ID or product ID supplied
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: Contract or product not found or caller doesn't have Marketplace contract view permission granted.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '500':
          description: Misconfigured service
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
  /restapi/v2.0/booking/{bookingId}/invoices:
    get:
      tags:
        - booking
      summary: Get invoices pertaining to specified booking.
      description: Note that some invoices may not be visible to you depending
        on your role in this booking. For example, you will not be able to see customer invoice(s) if you act as a
        supplier and this booking was resold by someone else. In such case, the returned part of the object dedicated
        for customer invoices will be empty. Same if relevant invoices will be absent, e.g. seller invoice might be
        absent if booking was sold by supplier.
      operationId: getBookingInvoices
      parameters:
        - name: invoiceType
          in: query
          description: type of invoices to bring back
          required: true
          schema:
            $ref: '#/components/schemas/BookingInvoicesRequestTypeDto'
        - name: includeHistoric
          in: query
          description: If set to true, this will bring back earlier invoices for given booking, not just the currently
            active invoice. Earlier invoices might exist if this particular booking was amended or cancelled etc. This
            value is false by default / on omission.
          required: false
          schema:
            type: boolean
        - name: bookingId
          in: path
          description: ID of booking. Note this is the ID of booking and not activity/experience booking. Also note this
            is booking ID and not booking reference.
          required: true
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BookingInvoicesDto'
        '400':
          description: Invalid invoiceType or includeHistoric values supplied
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: No permissions to access this booking
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
  /restapi/v2.0/customer/{customerId}:
    get:
      tags:
        - booking
        - customer
      summary: Get customer by ID
      operationId: getCustomerById
      parameters:
        - name: customerId
          in: path
          description: ID of customer
          required: true
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CustomerDto'
        '400':
          description: Invalid customerId supplied
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: No permissions to access this customer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
  /restapi/v2.0/tax/{taxId}:
    get:
      tags:
        - pricing
      summary: Get tax by ID
      operationId: getTaxById
      parameters:
        - name: taxId
          in: path
          description: ID of tax
          required: true
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TaxDto'
        '400':
          description: Invalid taxId supplied or tax object has been deleted
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: No permissions to access this tax
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/taxes:
    get:
      tags:
        - pricing
      summary: Get a list of all taxes owned by the current vendor as a paginated list of objects.
      operationId: getTaxes
      parameters:
        - name: pageNo
          in: query
          description: Page number, zero based
          required: true
          schema:
            type: integer
            format: int32
            minimum: 0
        - name: pageSize
          in: query
          description: Page size (how many max items per single page)
          required: true
          schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 100
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TaxesPagedListDto'
        '400':
          description: Invalid arguments
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/pricing/category/{pricingCategoryId}:
    get:
      tags:
        - pricing
      summary: Get pricing category by ID
      operationId: getPricingCategoryById
      parameters:
        - name: pricingCategoryId
          in: path
          description: ID of pricing category
          required: true
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PricingCategoryDto'
        '400':
          description: Invalid pricingCategoryId supplied or pricing category object has been deleted
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: No permissions to access this pricing category
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
    delete:
      tags:
        - pricing
      summary: Delete pricing category by ID
      operationId: deletePricingCategory
      parameters:
        - name: pricingCategoryId
          in: path
          description: ID of pricing category
          required: true
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Successful operation
        '400':
          description: Invalid pricingCategoryId supplied or pricing category object has been deleted or category still
            being used (linked to at least one product)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: No permissions to access this pricing category
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
    put:
      tags:
        - pricing
      summary: Update pricing category by ID
      operationId: updatePricingCategory
      parameters:
        - name: pricingCategoryId
          in: path
          description: ID of pricing category
          required: true
          schema:
            type: integer
            format: int64
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PricingCategoryDto'
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PricingCategoryDto'
        '204':
          description: responded with if the request did not modify the pricing category
        '400':
          description: Invalid pricingCategoryId supplied or pricing category object has been deleted
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: No permissions to access this pricing category
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/pricing/category:
    post:
      tags:
        - pricing
      summary: Create a new pricing category
      operationId: createPricingCategory
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PricingCategoryDto'
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PricingCategoryDto'
        '400':
          description: Invalid request body supplied
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: No permissions to create a new pricing category or number of max allowed categories limit has been reached
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/pricing/categories:
    get:
      tags:
        - pricing
      summary: Get all pricing categories owned by the current vendor as a paginated list of objects.
      description: result list is ordered by `PricingCategoryDto::id` ascending.
      operationId: getPricingCategories
      parameters:
        - name: pageNo
          in: query
          description: Page number, zero based
          required: true
          schema:
            type: integer
            format: int32
            minimum: 0
        - name: pageSize
          in: query
          description: Page size (how many max items per single page)
          required: true
          schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 100
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PricingCategoriesPagedListDto'
        '400':
          description: Invalid arguments
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/promo/code/{promoCodeId}:
    get:
      tags:
        - pricing
      summary: Get promo code by ID
      operationId: getPromoCodeById
      parameters:
        - name: promoCodeId
          in: path
          description: ID of promo code
          required: true
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PromoCodeDto'
        '400':
          description: Invalid promoCodeId supplied or promo code object has been deleted
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: No permissions to access this promo code
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
    put:
      tags:
        - pricing
      summary: Update promo code by ID
      operationId: updatePromoCode
      parameters:
        - name: promoCodeId
          in: path
          description: ID of promo code
          required: true
          schema:
            type: integer
            format: int64
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PromoCodeDto'
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PromoCodeDto'
        '204':
          description: responded with if the request did not modify the promo code
        '400':
          description: Invalid promoCodeId supplied or promo code object has been deleted
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: No permissions to access this promo code
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/promo/code:
    post:
      tags:
        - pricing
      summary: Create a new promo code
      operationId: createPromoCode
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PromoCodeDto'
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PromoCodeDto'
        '400':
          description: Invalid request body supplied
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: No permissions to create a new promo code or number of max allowed code limit has been reached
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/promo/codes:
    get:
      tags:
        - pricing
      summary: Get all promo codes owned by the current vendor as a paginated list of objects.
      description: result list is ordered by `PromoCodeDto::id` ascending.
      operationId: getPromoCodes
      parameters:
        - name: pageNo
          in: query
          description: Page number, zero based
          required: true
          schema:
            type: integer
            format: int32
            minimum: 0
        - name: pageSize
          in: query
          description: Page size (how many max items per single page)
          required: true
          schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 100
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PromoCodesPagedListDto'
        '400':
          description: Invalid arguments
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
    delete:
      tags:
        - pricing
      summary: Delete promo code(s) by ID
      operationId: deletePromoCodes
      parameters:
        - in: query
          name: promoCodeId
          schema:
            type: array
            items:
              type: integer
              format: int64
          description: promo code ID to delete. Parameter can be sent multiple times, will result multiple promo codes being deleted
          required: true
      responses:
        '200':
          description: Successful operation
        '400':
          description: At least one promo code id was invalid (non-existent or already deleted)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: No permissions to access this promo code
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/price/catalogs:
    get:
      tags:
        - pricing
      summary: Get all price catalogs owned by this vendor.
      description: result list is ordered by `PriceCatalogDto::id` ascending.
      operationId: getPriceCatalog
      parameters:
        - name: pageNo
          in: query
          description: Page number, zero based
          required: true
          schema:
            type: integer
            format: int32
            minimum: 0
        - name: pageSize
          in: query
          description: Page size (how many max items per single page)
          required: true
          schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 100
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PriceCatalogsPagedListDto'
        '400':
          description: Invalid arguments
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/cancellation/policies:
    get:
      tags:
        - pricing
      summary: Get all cancellation policies owned by the current vendor as a paginated list of objects.
      description: result list is ordered by `CancellationPolicyDto::id` ascending.
      operationId: getCancellationPolicies
      parameters:
        - name: pageNo
          in: query
          description: Page number, zero based
          required: true
          schema:
            type: integer
            format: int32
            minimum: 0
        - name: pageSize
          in: query
          description: Page size (how many max items per single page)
          required: true
          schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 100
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CancellationPoliciesPagedListDto'
        '400':
          description: Invalid arguments
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/pricing/schedules:
    get:
      tags:
        - pricing
      summary: Get a list of all price schedules owned by the current vendor as a paginated list of objects.
      operationId: getPriceSchedules
      parameters:
        - name: pageNo
          in: query
          description: Page number, zero based
          required: true
          schema:
            type: integer
            format: int32
            minimum: 0
        - name: pageSize
          in: query
          description: Page size (how many max items per single page)
          required: true
          schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 100
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PriceSchedulesPagedListDto'
        '400':
          description: Invalid arguments
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/pricing/schedules/reorder:
    post:
      tags:
        - pricing
      summary: Reorder price schedules. Order determines priority when date ranges overlap. First in the list = higher priority.
      operationId: reorderPriceSchedules
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PriceSchedulesReorderRequestDto'
      responses:
        '200':
          description: Successful operation
        '400':
          description: Invalid arguments
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/pricing/schedule/{priceScheduleId}:
    get:
      tags:
        - pricing
      summary: Get a specific price schedule by specifying its ID.
      operationId: getPriceScheduleById
      parameters:
        - name: priceScheduleId
          in: path
          description: price schedule ID to get by
          required: true
          schema:
            type: integer
            format: int64
            minimum: 0
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PriceScheduleDto'
        '400':
          description: Invalid argument
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: No permissions to update this price schedule
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '404':
          description: This price schedule was not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
    put:
      tags:
        - pricing
      summary: Update a price schedule
      operationId: updatePriceSchedule
      parameters:
        - name: priceScheduleId
          in: path
          description: price schedule ID to update
          required: true
          schema:
            type: integer
            format: int64
            minimum: 0
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PriceScheduleDto'
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PriceScheduleDto'
        '400':
          description: Invalid argument
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: No permissions to update this price schedule
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '404':
          description: This price schedule was not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
    delete:
      tags:
        - pricing
      summary: Delete a price schedule
      operationId: deletePriceSchedule
      parameters:
        - name: priceScheduleId
          in: path
          description: price schedule ID to delete
          required: true
          schema:
            type: integer
            format: int64
            minimum: 0
      responses:
        '200':
          description: Successful operation
        '400':
          description: Invalid priceScheduleId supplied
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: No permissions to delete this price schedule
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '404':
          description: Price schedule object has been deleted already
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/pricing/schedule:
    post:
      tags:
        - pricing
      summary: Create a new price schedule
      operationId: createPriceSchedule
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PriceScheduleDto'
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PriceScheduleDto'
        '400':
          description: Invalid argument
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: No permissions to create a price schedule
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/experience/{experienceId}/components:
    get:
      tags:
        - experience
      summary: Get selected experience product components
      operationId: getExperienceComponents
      parameters:
        - name: experienceId
          in: path
          description: ID of experience product
          required: true
          schema:
            type: integer
            format: int64
        - name: componentType
          in: query
          description: which component(s) to retrieve. Can be sent multiple times, will result multiple components being retrieved
          required: true
          schema:
            type: array
            items:
              $ref: '#/components/schemas/ExperienceComponentTypeDto'
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ExperienceComponentsDto'
        '400':
          description: Invalid experienceId or componentType supplied
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: No permissions to access this experience product
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
    put:
      tags:
        - experience
      summary: set experience product components. Body payload may contain any combination of updated components.
      operationId: setExperienceComponents
      parameters:
        - name: experienceId
          in: path
          description: ID of experience product
          required: true
          schema:
            type: integer
            format: int64
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ExperienceComponentsDto'
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ExperienceComponentsDto'
        '400':
          description: Invalid experienceId or componentType supplied or invalid body
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: No permissions to access this experience product
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/experience:
    post:
      tags:
        - experience
      summary: Create a new experience product
      operationId: createExperience
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ExperienceComponentsDto'
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ExperienceComponentsDto'
        '400':
          description: Invalid body
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: No permissions to create this experience product (if over limit set per vendor)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/experience/{experienceId}:
    delete:
      tags:
        - experience
      summary: Delete existing experience product
      operationId: deleteExperience
      parameters:
        - name: experienceId
          in: path
          description: ID of experience product
          required: true
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Successful operation
        '400':
          description: Invalid request parameter(s)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: No permissions to delete this experience product
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/experience/{experienceId}/photo:
    post:
      tags:
        - experience
      summary: Upload a new photo to the existing experience product
      operationId: uploadPhotoToExperience
      parameters:
        - name: experienceId
          in: path
          description: ID of experience product
          required: true
          schema:
            type: integer
            format: int64
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                image:
                  type: string
                  format: binary
            encoding:
              image:
                contentType: image/png, image/jpeg, image/gif
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                type: object
                required:
                  - id
                  - url
                properties:
                  id:
                    type: integer
                    format: int64
                    description: ID of the uploaded photo
                  url:
                    type: string
                    description: The URL to use for the end user. Typically this is the URL given by the CDN provider.
                      Make sure that this URL is never cached as it may change without further notice. The property can
                      only be retrieved and never set.
                    maxLength: 255
        '400':
          description: Invalid body
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: No permissions to edit this experience product (if over limit set per vendor)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/extra/{extraId}/photo:
    post:
      tags:
        - experience
      summary: Upload a new photo to the existing extra
      operationId: uploadPhotoToExtra
      parameters:
        - name: extraId
          in: path
          description: ID of extra
          required: true
          schema:
            type: integer
            format: int64
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                image:
                  type: string
                  format: binary
            encoding:
              image:
                contentType: image/png, image/jpeg, image/gif
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                type: object
                required:
                  - id
                  - url
                properties:
                  id:
                    type: integer
                    format: int64
                    description: ID of the uploaded photo
                  url:
                    type: string
                    description: The URL to use for the end user. Typically this is the URL given by the CDN provider.
                      Make sure that this URL is never cached as it may change without further notice. The property can
                      only be retrieved and never set.
                    maxLength: 255
        '400':
          description: Invalid body
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: No permissions to edit experience product extra is attached to
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/experiences/ids:
    get:
      tags:
        - experience
      summary: List IDs of owned experience products
      operationId: listExperienceIds
      parameters:
        - name: activated
          in: query
          description: if true, only return activated experience products. If false - only return deactivated
            experience products. If omitted, both types will be returned.
          required: false
          schema:
            type: boolean
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  type: integer
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/experienceBooking/{experienceBookingId}/notes:
    get:
      tags:
        - experience booking
      summary: Retrieves notes associated with an existing experience booking
      operationId: getExperienceBookingNotes
      parameters:
        - name: experienceBookingId
          in: path
          description: The ID of the experience booking
          required: true
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/ExperienceBookingNoteResponseDto'
        '400':
          description: Invalid body
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: Insufficient permissions to retrieve these experience booking notes
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
    post:
      tags:
        - experience booking
      summary: Creates a new note associated with an existing experience booking
      operationId: createExperienceBookingNote
      parameters:
        - name: experienceBookingId
          in: path
          description: The ID of the experience booking
          required: true
          schema:
            type: integer
            format: int64
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ExperienceBookingNoteRequestDto'
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ExperienceBookingNoteResponseDto'
        '400':
          description: Invalid body
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: Insufficient permissions to create this experience booking note
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/experienceBooking/{experienceBookingId}/notes/{noteId}:
    delete:
      tags:
        - experience booking
      summary: Deletes an existing note associated with an experience booking
      operationId: deleteExperienceBookingNote
      parameters:
        - name: experienceBookingId
          in: path
          description: The ID of the experience booking
          required: true
          schema:
            type: integer
            format: int64
        - name: noteId
          in: path
          description: The ID of the experience booking note
          required: true
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Successful operation (note was deleted)
        '403':
          description: Access to this note is forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '404':
          description: The experience booking note to be deleted was not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
    put:
      tags:
        - experience booking
      summary: Updates an existing note associated with an experience booking
      operationId: updateExperienceBookingNote
      parameters:
        - name: experienceBookingId
          in: path
          description: The ID of the experience booking
          required: true
          schema:
            type: integer
            format: int64
        - name: noteId
          in: path
          description: The ID of the experience booking note
          required: true
          schema:
            type: integer
            format: int64
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateExperienceBookingNoteRequestDto'
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ExperienceBookingNoteResponseDto'
        '400':
          description: Invalid body
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: Insufficient permissions to create this note
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/booking/{bookingId}/payments:
    get:
      tags:
        - booking
      summary: Get customer payments made against given booking
      operationId: getBookingPayments
      parameters:
        - name: bookingId
          in: path
          description: ID of booking
          required: true
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/CustomerPaymentDto'
        '400':
          description: Invalid bookingId
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: No permissions to access this booking
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/booking/{bookingId}/audit-records:
    get:
      tags:
        - booking
      summary: Get audit trail records for given booking
      description: Returns a list of audit trail records for the specified booking, ordered by date descending.
        Note that the set of records returned depends on your role in this booking. Suppliers will only see
        records related to their own product bookings. Callers with no role in the booking will receive an
        empty list.
      operationId: getBookingAuditTrail
      parameters:
        - name: bookingId
          in: path
          description: ID of booking
          required: true
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/BookingAuditRecordDto'
        '400':
          description: Invalid bookingId
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: No permissions to access this booking
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/resource/pools:
    get:
      tags:
        - resource
      summary: Get paginated list of resource pool objects.
      operationId: getResourcePools
      parameters:
        - name: pageNo
          in: query
          description: Page number, zero based
          required: true
          schema:
            type: integer
            format: int32
            minimum: 0
        - name: pageSize
          in: query
          description: Page size (how many max items per single page)
          required: true
          schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 100
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResourcePoolPagedListDto'
        '400':
          description: Invalid or missing mandatory query parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/resource/pool:
    post:
      tags:
        - resource
      summary: Create resource pool, optionally link selected resources against this pool
      operationId: createResourcePool
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ResourcePoolDto'
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResourcePoolDto'
        '400':
          description: Invalid body payload
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/resource/pool/{resourcePoolId}:
    get:
      tags:
        - resource
      summary: Get resource pool by ID
      operationId: getResourcePool
      parameters:
        - name: resourcePoolId
          in: path
          description: Resource pool ID to retrieve
          required: true
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResourcePoolDto'
        '403':
          description: Forbidden access to this pool
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '404':
          description: Pool not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
    put:
      tags:
        - resource
      summary: Update resource pool by ID
      operationId: updateResourcePool
      parameters:
        - name: resourcePoolId
          in: path
          description: Resource pool ID to update
          required: true
          schema:
            type: integer
            format: int64
        - name: limitLinkChangesToProduct
          in: query
          description: When making changes, limit which links between resource pool and start times are affected.
            If specified, this will omit changes for all start times except belonging to given experience product ID.
            Otherwise, if omitted, will update links between this pool and all products.
            This option is incompatible with `skipLinkChanges` (max 1 of these both options can be supplied).
          required: false
          schema:
            type: integer
            format: int64
        - name: skipLinkChanges
          in: query
          description: When making changes, don't change any links between resource pool and start times regardless
            what link information is supplied in the payload.
            This option is incompatible with `limitLinkChangesToProduct` (max 1 of these both options can be supplied).
          required: false
          schema:
            type: boolean
            default: false
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ResourcePoolDto'
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResourcePoolDto'
        '204':
          description: No modifications were made to this pool
        '400':
          description: Invalid payload (request body)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: Forbidden access to this pool
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '404':
          description: Pool not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
    delete:
      tags:
        - resource
      summary: Delete resource pool by ID
      operationId: deleteResourcePool
      parameters:
        - name: resourcePoolId
          in: path
          description: Resource pool ID to delete
          required: true
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Successful operation (pool was deleted)
        '403':
          description: Forbidden access to this pool
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '404':
          description: Pool not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/resources:
    get:
      tags:
        - resource
      summary: Get paginated list of resources including all details, such as capacity.
      operationId: getResources
      parameters:
        - name: pageNo
          in: query
          description: Page number, zero based
          required: true
          schema:
            type: integer
            format: int32
            minimum: 0
        - name: pageSize
          in: query
          description: Page size (how many max items per single page)
          required: true
          schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 100
        - name: poolId
          in: query
          description: Resource pool ID. If set, will only return resources linked to specified requested pool.
          required: false
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResourcePagedListDto'
        '400':
          description: Invalid or missing mandatory query parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: Illegal query parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/resource:
    post:
      tags:
        - resource
      summary: Create resource, optionally link created resource against selected pool(s)
      operationId: createResource
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ResourceDto'
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResourceDto'
        '400':
          description: Invalid body payload
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/resource/{resourceId}:
    get:
      tags:
        - resource
      summary: Get resource by ID
      operationId: getResource
      parameters:
        - name: resourceId
          in: path
          description: Resource ID to retrieve
          required: true
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResourceDto'
        '403':
          description: Forbidden access to this resource
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '404':
          description: Resource not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
    put:
      tags:
        - resource
      summary: Update resource by ID
      operationId: updateResource
      parameters:
        - name: resourceId
          in: path
          description: Resource ID to update
          required: true
          schema:
            type: integer
            format: int64
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ResourceDto'
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResourceDto'
        '204':
          description: No modifications were made to this resource
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '400':
          description: Invalid payload (request body)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: Forbidden access to this resource
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '404':
          description: Resource not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
    delete:
      tags:
        - resource
      summary: Delete resource by ID
      operationId: deleteResource
      parameters:
        - name: resourceId
          in: path
          description: Resource ID to delete
          required: true
          schema:
            type: integer
            format: int64
        - name: replacementResourceId
          in: query
          description: Another resource ID to use as a replacement for deleted resource. Must be active and belong to the same vendor. Value is required if deleted resource has any future bookings.
          required: false
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Successful operation (resource was deleted)
        '400':
          description: Invalid request (resource can't be deleted for whatever reason)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: Forbidden access to this resource
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '404':
          description: Resource not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/allocations:
    get:
      tags:
        - availability
      summary: Get all availability allocation rules current vendor owns.
      operationId: getExperienceAllocations
      parameters:
        - name: startTimeId
          in: query
          description: allows filtering by specific start times if specified. Multiple entries can be specified, too.
          style: form
          explode: true
          schema:
            type: array
            items:
              type: integer
              format: int64
        - name: pageNo
          in: query
          description: Page number, zero based
          required: true
          schema:
            type: integer
            format: int32
            minimum: 0
        - name: pageSize
          in: query
          description: Page size (how many max items per single page)
          required: true
          schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 100
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ExperienceAllocationsPagedListDto'

        '400':
          description: Invalid query parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/allocation:
    post:
      tags:
        - availability
      summary: Create allocation, optionally link created allocation against selected start times
      operationId: createExperienceAllocation
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ExperienceAllocationDto'
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ExperienceAllocationDto'
        '400':
          description: Invalid body payload
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/allocation/{allocationId}:
    get:
      tags:
        - availability
      summary: Get a specified availability allocation rule.
      operationId: getExperienceAllocationById
      parameters:
        - name: allocationId
          in: path
          description: Allocation id to retrieve the object by. Refers to `ExperienceAllocationDto::id`
          required: true
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ExperienceAllocationDto'
        '400':
          description: Invalid path parameter
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
    put:
      tags:
        - availability
      summary: Update specified availability allocation rule.
      operationId: updateExperienceAllocationById
      parameters:
        - name: allocationId
          in: path
          description: Allocation id to update the object by. Refers to `ExperienceAllocationDto::id`
          required: true
          schema:
            type: integer
            format: int64
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ExperienceAllocationDto'
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ExperienceAllocationDto'
        '204':
          description: No changes were made
        '400':
          description: Invalid path parameter
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
    delete:
      tags:
        - availability
      summary: Delete allocation by ID
      operationId: deleteExperienceAllocationById
      parameters:
        - name: allocationId
          in: path
          description: Allocation ID to delete by
          required: true
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Successful operation (allocation was deleted)
        '403':
          description: Forbidden access to this allocation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '404':
          description: Pool not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/startTime/{startTimeId}/allocations:
    get:
      tags:
        - availability
      summary: Get a list of allocation IDs for given start time.
      operationId: getExperienceAllocationsByStartTimeId
      parameters:
        - name: startTimeId
          in: path
          description: Start time id to retrieve allocations by. Refers to `ExperienceStartTimeDto::id`
          required: true
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  type: integer
                  format: int64
        '400':
          description: Invalid path parameter
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
    put:
      tags:
        - availability
      summary: Set allocation IDs for given start time id
      operationId: setExperienceAllocationsByStartTimeId
      parameters:
        - name: startTimeId
          in: path
          description: Start time id to set allocations for. Refers to `ExperienceStartTimeDto::id`
          required: true
          schema:
            type: integer
            format: int64
      requestBody:
        required: true
        description: Array of experience allocation object ids. Must belong to this vendor
        content:
          application/json:
            schema:
              type: array
              items:
                type: integer
                format: int64
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  type: integer
                  format: int64
        '204':
          description: No changes were made.
        '400':
          description: Invalid path parameter or body payload
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/experience/{experienceId}/allocations:
    put:
      tags:
        - availability
      summary: Set allocation IDs for given experience product id
      description: A convenience method. Sets the same allocations for all start times instead of doing it once per each start time
      operationId: setExperienceAllocationsForExperienceProductId
      parameters:
        - name: experienceId
          in: path
          description: Experience product ID to set allocations for
          required: true
          schema:
            type: integer
            format: int64
      requestBody:
        required: true
        description: Array of experience allocation object ids. Must belong to this vendor
        content:
          application/json:
            schema:
              type: array
              items:
                type: integer
                format: int64
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  type: integer
                  format: int64
        '400':
          description: Invalid path parameter or body payload
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/resource/closeouts/{date}:
    get:
      tags:
        - resource
      summary: Get resource closeouts by date. Returns array of owned resources which are closed for said date.
      operationId: getResourceCloseoutsByDate
      parameters:
        - name: date
          in: path
          description: Date for which to get closeouts for. Format yyyy-MM-dd. Must not be in the past.
          required: true
          schema:
            type: string
            minLength: 10
            maxLength: 10
            example: 2026-12-31
        - name: poolId
          in: query
          description: Optionally allows to filter returned closed resources by pool.
          required: false
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                description: Array of resource IDs
                type: array
                items:
                  type: integer
                  format: int64
        '400':
          description: Invalid parameters, e.g. invalid date format
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: Forbidden access to this pool
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/resource/closeout/{date}:
    post:
      tags:
        - resource
      summary: Create resource closeout by date, resource ID which should no longer be bookable.
      operationId: createResourceCloseoutByDate
      parameters:
        - name: date
          in: path
          description: Date for which to get closeouts for. Format yyyy-MM-dd. Must not be in the past.
          required: true
          schema:
            type: string
            minLength: 10
            maxLength: 10
            example: 2026-12-31
        - name: resourceId
          in: query
          description: Resource ID to close on this day.
          required: true
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Successful operation
        '400':
          description: Invalid parameters, e.g. invalid date format.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: Forbidden access to this resource
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '404':
          description: Resource not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
    delete:
      tags:
        - resource
      summary: Delete resource closeout for specified date/resource.
      operationId: deleteResourceCloseoutByDate
      parameters:
        - name: date
          in: path
          description: Date for which to delete closeout for. Format yyyy-MM-dd. Must not be in the past.
          required: true
          schema:
            type: string
            minLength: 10
            maxLength: 10
            example: 2026-12-31
        - name: resourceId
          in: query
          description: Resource ID for which to delete any closeouts
          required: true
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Successful operation.
        '400':
          description: Invalid parameters, e.g. invalid date format.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: Forbidden access to this resource
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '404':
          description: Resource not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/resource/assignments/{date}:
    get:
      tags:
        - resource
      summary: Get resource assignments
      description: Retrieves a list of resource assignments by various parameters. Multiple parameters, if passed, are combined using conjunction.
      operationId: getResourceAssignments
      parameters:
        - name: date
          in: path
          description: Travel date for which to retrieve resource assignments. Format `yyyy-MM-dd`.
          required: true
          schema:
            type: string
            minLength: 10
            maxLength: 10
        - name: experienceId
          in: query
          description: Experience product ID to get resource assignments for. If omitted, assignments for all products will be retrieved.
          required: false
          schema:
            type: integer
            format: int64
        - name: startTimeId
          in: query
          description: if specified, this will only retrieve assignments for specified start time only. Refers to `ExperienceStartTimeDto::id`.
          required: false
          schema:
            type: integer
            format: int64
        - name: bookingId
          in: query
          description: if specified, this will only retrieve assignments for specified booking. Note that if the booking is for a combo parent product,
            the results will not contain resource assignments for combo child product(s).
          required: false
          schema:
            type: integer
            format: int64
        - name: experienceBookingId
          in: query
          description: if specified, this will only retrieve assignments for specified experience booking.
          required: false
          schema:
            type: integer
            format: int64
        - name: poolId
          in: query
          description: if specified, this will only retrieve assignments for specified resource pool.
          required: false
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                description: Array of resource assignment objects
                type: array
                items:
                  $ref: '#/components/schemas/ResourceAssignmentDto'
        '400':
          description: Invalid parameters
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
    delete:
      tags:
        - resource
      summary: Delete resource assignments
      description: Deletes a bunch of resource assignments based on criteria. Each criteria, if passed, is joined using conjunction (all must be met to delete).
      operationId: deleteResourceAssignments
      parameters:
        - name: date
          in: path
          description: Travel date for which to delete resource assignments. Format `yyyy-MM-dd`.
          required: true
          schema:
            type: string
            minLength: 10
            maxLength: 10
        - name: experienceId
          in: query
          description: Experience product ID to delete resource assignments for. If omitted, assignments for all products will be retrieved.
          required: false
          schema:
            type: integer
            format: int64
        - name: startTimeId
          in: query
          description: if specified, this will only delete assignments for specified start time only. Refers to `ExperienceStartTimeDto::id`.
          required: false
          schema:
            type: integer
            format: int64
        - name: bookingId
          in: query
          description: if specified, this will only delete assignments for specified booking.
          required: false
          schema:
            type: integer
            format: int64
        - name: experienceBookingId
          in: query
          description: if specified, this will only delete assignments for specified experience booking.
          required: false
          schema:
            type: integer
            format: int64
        - name: pricingCategoryBookingId
          in: query
          description: if specified, this will only delete assignments for specified pricing category booking.
          required: false
          schema:
            type: integer
            format: int64
        - name: poolId
          in: query
          description: if specified, this will only delete assignments for specified resource pool.
          required: false
          schema:
            type: integer
            format: int64
        - name: resourceId
          in: query
          description: if specified, this will only delete assignments for specified resource.
          required: false
          schema:
            type: integer
            format: int64
        - name: assignmentId
          in: query
          description: if specified, this will only delete assignments for with specified ID.
          required: false
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Successful operation
        '400':
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/resource/assignment/{id}:
    delete:
      tags:
        - resource
      summary: Delete resource assignment
      description: Allows to delete existing resource assignment. Given pricing category booking will no longer be associated to any resource; resource will be freed from this allocation.
      operationId: deleteResourceAssignment
      parameters:
        - name: id
          in: path
          description: ID of resource assignment to delete. Refers to `ResourceAssignmentDto::id`
          required: true
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Successful operation
        '400':
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: No access to this resource assignment
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/resource/assignment/for/experienceBooking/{experienceBookingId}/pool/{poolId}/resource/{resourceId}:
    post:
      tags:
        - resource
      summary: Create resource assignment for experience booking
      description: Allows to assign a resource to an existing experience booking (meaning all underlying pricing category bookings). A previous assignment for the same pool, if exists, will be deleted for all of affected pricing category bookings.
      operationId: createResourceAssignmentForExperienceBooking
      parameters:
        - name: experienceBookingId
          in: path
          description: Experience booking id to allocate this resource/pool to. Caller must be the supplier for the booked product.
          required: true
          schema:
            type: integer
            format: int64
        - name: poolId
          in: path
          description: Resource pool ID for which to link the resource. Caller must be the owner of the pool.
          required: true
          schema:
            type: integer
            format: int64
        - name: resourceId
          in: path
          description: Resource ID for which to link the experience booking to. Caller must be the owner of the resource.
          required: true
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                description: Array of resource assignment objects
                type: array
                items:
                  $ref: '#/components/schemas/ResourceAssignmentDto'
        '400':
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: No access to this resource assignment
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/resource/assignment/for/pricingCategoryBooking/{pricingCategoryBookingId}/pool/{poolId}/resource/{resourceId}:
    post:
      tags:
        - resource
      summary: Create resource assignment for pricing category booking
      description: Allows to assign a resource to an existing single experience pricing category booking. A previous assignment for the same pool, if exists, will be deleted for said booking.
      operationId: createResourceAssignmentForPricingCategoryBooking
      parameters:
        - name: pricingCategoryBookingId
          in: path
          description: Pricing category booking id to allocate this resource/pool to. Caller must be the supplier for the booked product.
          required: true
          schema:
            type: integer
            format: int64
        - name: poolId
          in: path
          description: Resource pool ID for which to link the resource. Caller must be the owner of the pool.
          required: true
          schema:
            type: integer
            format: int64
        - name: resourceId
          in: path
          description: Resource ID for which to link the experience booking to. Caller must be the owner of the resource.
          required: true
          schema:
            type: integer
            format: int64
        - name: assignmentId
          in: query
          description: Resource booking ID for which to replace.
          required: false
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResourceAssignmentDto'
        '400':
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: No access to this resource assignment
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/resource/assignments/relocate/to/{resourcePoolId}/{resourceId}:
    put:
      tags:
        - resource
      summary: Reallocate resource assignment(s) from their existing resource pool / resource to another pool / resource.
      description: Allows to relocate existing resource assignments to another resource pool / resource. Allows overbooking if the caller has relevant permission. Only accessible to product supplier. Old assignment(s) will be freed from allocation.
      operationId: relocateResourceAssignment
      parameters:
        - name: resourcePoolId
          in: path
          description: ID of resource pool to reassign specified bookings/allocations to. Refers to `ResourcePoolDto::id`
          required: true
          schema:
            type: integer
            format: int64
        - name: resourceId
          in: path
          description: ID of resource to reassign specified bookings/allocations to. Refers to `ResourceDto::id`
          required: true
          schema:
            type: integer
            format: int64
      requestBody:
        required: true
        description: a list of `ResourceAssignmentDto::id` (or `ResourceBookingDto::id`) objects to relocate. Note that all of these resource bookings must refer to a product which is owned by the caller (as opposed to resold via marketplace).
        content:
          application/json:
            schema:
              type: array
              items:
                type: integer
                format: int64
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/ResourceAssignmentDto'
        '400':
          description: Invalid parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: No access to resource assignment(s)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/availability/{experienceId}:
    get:
      tags:
        - availability
        - booking
      summary: Get availability of a single experience product. This endpoint will not return any data about sold out/closed/past/out-of-resources availabilities.
      operationId: getExperienceAvailability
      parameters:
        - name: experienceId
          in: path
          description: Experience product ID to get availability for. One can only get availability of owned or marketplace contracted products.
          required: true
          schema:
            type: integer
            format: int64
        - name: from
          in: query
          description: From which date availabilities should be retrieved. Format `yyyy-MM-dd`. Note the `from`..`to` period should not exceed 1 year. Range inclusive.
          required: true
          schema:
            type: string
            minLength: 10
            maxLength: 10
        - name: to
          in: query
          description: Until which date availabilities should be retrieved. Format `yyyy-MM-dd`. Note the `from`..`to` period should not exceed 1 year. Range inclusive.
          required: true
          schema:
            type: string
            minLength: 10
            maxLength: 10
        - name: showId
          in: query
          description: If true, every response object will have `ExperienceAvailabilityDto::id` attribute printed.
          required: false
          schema:
            type: boolean
            default: false
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                description: Array of availability objects
                type: array
                items:
                  $ref: '#/components/schemas/ExperienceAvailabilityDto'
        '400':
          description: Invalid parameters, e.g. `from` is after `to`
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: Forbidden access to this product
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '404':
          description: Product not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/availability/{experienceId}/statistics:
    get:
      tags:
        - availability
      summary: Get availability statistics of a single experience product. Note that this endpoint is only available for the supplier of requested product. The result object contains much more data about given slot, also returns data about past/sold out/closed/out-of-resources availabilities.
      operationId: getExperienceAvailabilityStatistics
      parameters:
        - name: experienceId
          in: path
          description: Experience product ID to get availability for. One can only get closeouts of owned or marketplace contracted products.
          required: true
          schema:
            type: integer
            format: int64
        - name: from
          in: query
          description: From which date availabilities should be retrieved. Format `yyyy-MM-dd`. Note the `from`..`to` period should not exceed 1 month. Range inclusive.
          required: true
          schema:
            type: string
            minLength: 10
            maxLength: 10
        - name: to
          in: query
          description: Until which date availabilities should be retrieved. Format `yyyy-MM-dd`. Note the `from`..`to` period should not exceed 1 month. Range inclusive.
          required: true
          schema:
            type: string
            minLength: 10
            maxLength: 10
        - name: showId
          in: query
          description: If true, every response object will have `ExperienceAvailabilityDto::id` attribute printed.
          required: false
          schema:
            type: boolean
            default: false
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                description: Array of availability statistics objects
                type: array
                items:
                  $ref: '#/components/schemas/ExperienceAvailabilityStatisticsDto'
        '400':
          description: Invalid parameters, e.g. `from` is after `to`
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: Forbidden access to this product
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '404':
          description: Product not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  /restapi/v2.0/availability/{experienceId}/closeouts:
    get:
      tags:
        - availability
      summary: Get availability closeouts for given product ID.
      operationId: getExperienceCloseouts
      parameters:
        - name: experienceId
          in: path
          description: Experience product ID to get closeouts for. One can only get closeouts of owned or marketplace contracted products.
          required: true
          schema:
            type: integer
            format: int64
        - name: from
          in: query
          description: From which date closeouts should be retrieved. Format `yyyy-MM-dd`. Note the `from`..`to` period should not exceed 1 year. Range inclusive.
          required: true
          schema:
            type: string
            minLength: 10
            maxLength: 10
        - name: to
          in: query
          description: Until which date closeouts should be retrieved. Format `yyyy-MM-dd`. Note the `from`..`to` period should not exceed 1 year. Range inclusive.
          required: true
          schema:
            type: string
            minLength: 10
            maxLength: 10
        - name: startTimeId
          in: query
          description: if specified, this will only retrieve closeouts for specified start time, as opposed to all start times of given product. Refers to `ExperienceStartTimeDto::id`.
          required: false
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                description: Array of closeouts objects
                type: array
                items:
                  $ref: '#/components/schemas/ExperienceCloseoutDto'
        '400':
          description: Invalid parameters, e.g. `from` is after `to`
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: Forbidden access to this product
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '404':
          description: Product not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
    post:
      tags:
        - availability
      summary: Create availability closeouts for given product ID.
      operationId: createExperienceCloseouts
      parameters:
        - name: experienceId
          in: path
          description: Experience product ID to create closeouts for. One can only create closeouts for owned product only.
          required: true
          schema:
            type: integer
            format: int64
        - name: from
          in: query
          description: From which date closeouts should be created. Format `yyyy-MM-dd`. Note the `from`..`to` period should not exceed 1 year. Range inclusive.
          required: true
          schema:
            type: string
            minLength: 10
            maxLength: 10
        - name: to
          in: query
          description: Until which date closeouts should be created. Format `yyyy-MM-dd`. Note the `from`..`to` period should not exceed 1 year. Range inclusive.
          required: true
          schema:
            type: string
            minLength: 10
            maxLength: 10
        - name: startTimeId
          in: query
          description: if specified, this will only created closeouts for specified start time, as opposed to all start times of given product. Refers to `ExperienceStartTimeDto::id`.
          required: false
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Successful operation, at least one closeout was successfully created.
        '204':
          description: No closeouts were created.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '400':
          description: Invalid body
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: Forbidden access to this product
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '404':
          description: Product not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
    delete:
      tags:
        - availability
      summary: Delete availability closeouts for given product ID.
      operationId: deleteExperienceCloseouts
      parameters:
        - name: experienceId
          in: path
          description: Experience product ID to delete closeouts for. One can only delete closeouts of owned products.
          required: true
          schema:
            type: integer
            format: int64
        - name: from
          in: query
          description: From which date closeouts should be deleted. Format `yyyy-MM-dd`. Note the `from`..`to` period should not exceed 1 year. Range inclusive.
          required: true
          schema:
            type: string
            minLength: 10
            maxLength: 10
        - name: to
          in: query
          description: Until which date closeouts should be deleted. Format `yyyy-MM-dd`. Note the `from`..`to` period should not exceed 1 year. Range inclusive.
          required: true
          schema:
            type: string
            minLength: 10
            maxLength: 10
        - name: startTimeId
          in: query
          description: if specified, this will only limit closeout deletion for specified start time, as opposed to all start times of given product. Refers to `ExperienceStartTimeDto::id`.
          required: false
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Successful operation
        '204':
          description: No closeouts were deleted.
        '400':
          description: Invalid parameters, e.g. `from` is after `to`
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: Forbidden access to this product
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '404':
          description: Product not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

  ########################################### end of API endpoints, DTOs below ###########################################


  /restapi/v2.0/experience/{bokunProductId}/availability/changed:
    post:
      tags:
        - availability
      summary: Inform Bokun about product availability change (designed for Channel Manager products).
      description: Note that this only applies to Channel Manager (aka
        Inventory Service) linked experience products. This call will trigger availability pull originated by Bokun.
        Such pull will later possibly send an availability update to configured listeners, such as OTAs which have
        availability notification push enabled.
      operationId: productAvailabilityChanged
      parameters:
        - name: bokunProductId
          in: path
          description: ID of experience product in Bokun
          required: true
          schema:
            type: integer
            format: int64
        - name: dateFrom
          in: query
          description: date (inclusive) from which the availability has changed. RFC 3339, section 5.6 format.
            Can't be in the past, considering the time zone of the product. Past dates will result 400 error.
          required: true
          schema:
            type: string
            format: date
            example: 2024-12-31
        - name: dateTo
          in: query
          description: date (inclusive) until which the availability has changed. RFC 3339, section 5.6 format.
            Dates up to 1 year ahead (considering product time zone) are supported, any further dates will result 400 response.
          required: true
          schema:
            type: string
            format: date
            example: 2024-12-31
      responses:
        '200':
          description: Successful operation. Expect a call from Bokun in the next few moments.
        '400':
          description: Invalid bokunProductId (either does not exist or is not a Channel Manager product)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '403':
          description: No permissions to access this product.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'
        '429':
          description: Number of requests over allocated quota. Currently at most 1 call per same product per minute is supported.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StandardErrorDto'

components:
  schemas:
    ActiveHistoricSellerInvoicesDto:
      type: object
      description: wrapper for keeping active and historic seller invoices.
      required:
        - historicSellerInvoices
      properties:
        activeSellerInvoice:
          $ref: '#/components/schemas/SellerInvoiceDto'
#          description: currently active seller invoice (if one exists and the requester has access to them)
        historicSellerInvoices:
          type: array
          description: previous seller invoices for this booking (if they exist and the requester has access to them), otherwise empty list
          items:
            $ref: '#/components/schemas/SellerInvoiceDto'

    AddonPricingTypeDto:
      type: string
      enum:
        - INCLUDED_IN_PRICE
#        description: this particular addon does not have a separate price. Price specified already includes this addon for free
        - PRICED_SEPARATELY
#        description: this particular addon defines its own price which is separate from price per pricing category or per booking

    AddonSelectionTypeDto:
      type: string
      enum:
        - OPTIONAL
#        description: this particular addon may or may not be selected at user's will
        - PRESELECTED
#        description: this particular addon must be selected (UI shows as preselected without ability to opt out)
        - UNAVAILABLE
#          description: this particular addon can not be selected

    AddressDto:
      type: object
      description: an object to hold address details
      properties:
        id:
          type: integer
          format: int64
          description: ID of this address object
        addressLine1:
          type: string
          maxLength: 255
        addressLine2:
          type: string
          maxLength: 255
        addressLine3:
          type: string
          maxLength: 255
        city:
          type: string
          maxLength: 255
        state:
          type: string
          maxLength: 255
        postalCode:
          type: string
          maxLength: 255
        countryCode:
          type: string
          description: ISO 3166-1 alpha-2 country code. Served as upper case.
          minLength: 2
          maxLength: 2
        latitude:
          type: number
          format: double
          description: latitude, as per ISO 6709
          minimum: -90.0
          maximum: 90.0
        longitude:
          type: number
          format: double
          description: longitude, as per ISO 6709
          minimum: -180.0
          maximum: 180.0
        googlePlaceId:
          type: string
          description: Google Place ID for this address. Note that in some cases all other items, such as address line 1
            etc. might be missing and only this element might be present.
          maxLength: 255

    AffiliateInvoiceDto:
      allOf:
        - $ref: '#/components/schemas/CommonInvoiceDto'
        - type: object
          required:
            - recipientVendorId
          properties:
            recipientVendorId:
              type: integer
              format: int64
              description: ID of the vendor (MarketplaceVendorDto::ID) who is the recipient of this invoice
            issuerAffiliateId:
              type: integer
              format: int64
              description: ID of the affiliate (`AffiliateDto::id`, TBD) who has issued this invoice. Optional.
            issuerVendorId:
              type: integer
              format: int64
              description: ID of the vendor (MarketplaceVendorDto::ID) who has issued this invoice. Optional.
            issuerAgentId:
              type: integer
              format: int64
              description: ID of the agent (AgentDto::ID, TBD) who has issued this invoice. Optional.

    AgentInvoiceDto:
      allOf:
        - $ref: '#/components/schemas/CommonInvoiceDto'
        - type: object
          required:
            - issuerVendorId
            - agentId
          properties:
            issuerVendorId:
              type: integer
              format: int64
              description: ID of the vendor (MarketplaceVendorDto::ID) who has issued this invoice.
            recipientAgentId:
              type: integer
              format: int64
              description: ID of agent (`AgentDto::id`, TBD) who has assisted with this sale and is the recipient of
                this invoice

    AllowedChangeIntervalDto:
      type: string
      enum:
        - ALWAYS
#          description: change allowed always
        - BEFORE
#          description: change only allowed before certain event (e.g. before booking)
        - AFTER
#          description: change only allowed after certain event (e.g. after booking)
        - NEVER
#          description: change not allowed

    BarcodeFormatDto:
      type: string
      enum:
        - QR_CODE
        - CODE_128
        - PDF_417
        - DATA_MATRIX
        - AZTEC
        - NONE

    BookingAuditRecordDto:
      type: object
      required:
        - id
        - bookingId
        - date
        - errorOccurred
      properties:
        id:
          type: integer
          format: int64
          description: ID of this audit record
        bookingId:
          type: integer
          format: int64
          description: ID of the booking this record belongs to
        productBookingId:
          type: integer
          format: int64
          description: ID of the product booking (activity booking) this record is associated with, if applicable
        date:
          $ref: '#/components/schemas/TimestampDto'
        bookingChannelId:
          type: integer
          format: int64
          description: ID of the booking channel through which this action was performed
        extranetUsername:
          type: string
          description: username of the extranet user who performed this action, if applicable
        status:
          $ref: '#/components/schemas/BookingStatusDto'
        action:
          type: string
          maxLength: 255
          description: description of the action performed
        location:
          type: string
          maxLength: 1000
          description: URL or location where the action was performed
        referer:
          type: string
          maxLength: 1000
          description: HTTP referer at the time of the action
        errorOccurred:
          type: boolean
          description: whether an error occurred during this action

    BookingInvoicesDto:
      type: object
      required:
        - historicCustomerInvoices
        - historicAffiliateInvoices
        - historicAgentInvoices
        - sellerInvoices
        - bookingId
      properties:
        bookingId:
          type: integer
          format: int64
          description: ID of the booking these invoices are for
        activeCustomerInvoice:
          $ref: '#/components/schemas/CustomerInvoiceDto'
#          description: currently active customer invoice (if one exists and the requester has access to it)
        historicCustomerInvoices:
          type: array
          description: previous customer invoices for this booking (if they exist and the requester has access to it), otherwise empty list
          items:
            $ref: '#/components/schemas/CustomerInvoiceDto'
        activeAffiliateInvoice:
          $ref: '#/components/schemas/AffiliateInvoiceDto'
#          description: currently active affiliate invoice (if one exists and the requester has access to them)
        historicAffiliateInvoices:
          type: array
          description: previous affiliate invoices for this booking (if they exist and the requester has access to them), otherwise empty list
          items:
            $ref: '#/components/schemas/AffiliateInvoiceDto'
        activeAgentInvoice:
          $ref: '#/components/schemas/AgentInvoiceDto'
#          description: currently active agent invoice (if one exists and the requester has access to them)
        historicAgentInvoices:
          type: array
          description: previous agent invoices for this booking (if they exist and the requester has access to them), otherwise empty list
          items:
            $ref: '#/components/schemas/AgentInvoiceDto'
        sellerInvoices:
          type: object
          description: a map where keys are activity booking IDs in string format, and value is object pointing to active/historic invoices
          additionalProperties:
            $ref: '#/components/schemas/ActiveHistoricSellerInvoicesDto'

    BookingInvoicesRequestTypeDto:
      type: string
      enum:
        - ALL
#          description: request is for all types of invoices listed in this enum
        - AGENT
#          description: request is for agent invoices only
        - AFFILIATE
#          description: request is for affiliate invoices only
        - CUSTOMER
#          description: request is for customer invoices only
        - SELLER
#          description: request is for seller invoices only

    BookingStatusDto:
      type: string
      enum:
        - CART
        - REQUESTED
        - RESERVED
        - CONFIRMED
        - TIMEOUT
        - ABORTED
        - CANCELLED
        - ERROR
        - ARRIVED
        - NO_SHOW
        - REJECTED

    CancellationPoliciesPagedListDto:
      allOf:
        - $ref: '#/components/schemas/PagedListDto'
        - type: object
          required:
            - items
          properties:
            items:
              type: array
              items:
                $ref: '#/components/schemas/CancellationPolicyDto'

    CancellationPolicyDto:
      type: object
      required:
        - title
        - type
        - defaultPolicy
      properties:
        id:
          description: id of this object
          type: integer
          format: int64
        title:
          type: string
          maxLength: 140
        type:
          $ref: '#/components/schemas/CancellationPolicyTypeDto'
        created:
          $ref: '#/components/schemas/TimestampDto'
          #          description: Date/time this rule was created. Can only be received, never sent
        taxId:
          type: integer
          format: int64
          description: reference to `TaxDto::id`. This tax is applied for invoice line item(s) if cancellation policy is triggered.
        simpleCutoffHours:
          type: integer
          format: int32
          description: cutoff for full refund in hours, only relevant if `type == SIMPLE`.
        defaultPolicy:
          type: boolean
          description: true if this policy is the default across all products, false otherwise
        penaltyRules:
          type: array
          description: a set of rules which apply when policy is triggered. Set only if `type == ADVANCED`
          items:
            $ref: '#/components/schemas/CancellationPolicyPenaltyRuleDto'

    CancellationPolicyPenaltyRuleDto:
      type: object
      required:
        - cutoffHours
        - charge
        - chargeType
      properties:
        id:
          type: integer
          format: int64
          description: id of this penalty rule
        created:
          $ref: '#/components/schemas/TimestampDto'
          #          description: Date/time this rule was created. Can only be received, never sent
        cutoffHours:
          type: integer
          format: int32
          description: The `24` in `if less than 24 hours then 100% charge`. Can also specify number of days if ((cutoffHours >= 24) && (cutoffHours % 24 == 0)).
        charge:
          type: number
          format: double
          description: How much to charge. Can either be percent or amount, depending on `chargeType`. If amount is used, the currency is taken from the sale.
        chargeType:
          $ref: '#/components/schemas/CancellationPolicyPenaltyRuleChargeTypeDto'

    CancellationPolicyPenaltyRuleChargeTypeDto:
      type: string
      enum:
        - AMOUNT
        - PERCENTAGE

    CancellationPolicyTypeDto:
      type: string
      enum:
        - NON_REFUNDABLE
        - FULL_REFUND
        - SIMPLE
        - ADVANCED

    CommonInvoiceDto:
      type: object
      required:
        - id
        - issued
        - currency
        - lineItems
        - total
        - issuerTimeZone
      discriminator:
        propertyName: ignored
      properties:
        id:
          type: integer
          format: int64
          description: ID of this invoice
        issued:
          $ref: '#/components/schemas/TimestampDto'
#          description: Date/time this invoice was issued
        currency:
          type: string
          minLength: 3
          maxLength: 3
          description: ISO 4217 currency code. The currency for all of line items / totals of this invoice.
        lineItems:
          type: array
          items:
            $ref: '#/components/schemas/InvoiceLineItemDto'
        total:
          type: string
          format: number
          description: Total for this invoice. That is the sum of all line items, including taxes, discounts, fees,
            promo codes etc.
        issuerTimeZone:
          type: string
          description: Time zone of the issuer vendor. IANA/Olson style format.
          example: '"Europe/Vilnius", "PST", "UTC"'
        recipientTimeZone:
          type: string
          description: Time zone of the recipient entity (could be vendor or agent, depends on the context) if known.
            IANA/Olson style format.
          example: '"Europe/Vilnius", "PST", "UTC"'

    CommonPriceRuleDto:
      type: object
      required:
        - priceCatalogId
        - currency
        - amount
        - rate
      properties:
        id:
          type: integer
          format: int64
          description: price rule id. ID numbering is independent and may clash among different types (extra, pickup and so on).
        rate:
          $ref: '#/components/schemas/IdExternalIdDto'
        created:
          $ref: '#/components/schemas/TimestampDto'
          #          description: Date/time this rule was created. Can only be received, never sent
        priceCatalogId:
          type: integer
          format: int64
          description: reference to `PriceCatalogDto::id`
        currency:
          type: string
          minLength: 3
          maxLength: 3
          description: ISO 4217 currency code. Currency for this price rule.
        amount:
          type: string
          format: number
          description: price amount for this rule.
        priceScheduleId:
          type: integer
          format: int64
          description: reference to ID of the price schedule object (TBD). If omitted, price is classified as "base" price.
        pricingCategoryId:
          type: integer
          format: int64
          description: reference to `PricingCategoryDto::id`. Can only be sent if this price is per person rather than per booking.

    CompanyDto:
      type: object
      description: contains details about the company
      required:
        - id
        - name
        - registrationNumber
        - registrationAddress
      properties:
        id:
          type: integer
          format: int64
          description: ID of this company object within Bokun (as opposed to the official company ID or registration number)
        name:
          type: string
          description: official company name
        registrationNumber:
          type: string
          description: company registration number
        vatNumber:
          type: string
          description: company VAT number
        registrationAddress:
          $ref: '#/components/schemas/AddressDto'
        billingAddress:
          $ref: '#/components/schemas/AddressDto'

    ContactInformationDto:
      type: object
      required:
        - type
        - required
      properties:
        type:
          $ref : '#/components/schemas/ContactInformationTypeDto'
        required:
          type: boolean
          description: whether this is a required field (true) or not (false). For mandatory fields it is required to enter them during the checkout process
        requiredBeforeDeparture:
            type: boolean
            description: whether this is a required field before departure (true) or not (false). For mandatory fields it is required to enter them before the departure date

    ContactInformationTypeDto:
      type: string
      description: an enum containing all possible types of customer information that is collected by the system during the booking process
      enum:
        - TITLE
        - FIRST_NAME
        - LAST_NAME
        - PERSONAL_ID_NUMBER
        - EMAIL
        - PHONE_NUMBER
        - NATIONALITY
        - GENDER
        - ORGANIZATION
        - PASSPORT_ID
        - PASSPORT_EXPIRY
        - ADDRESS
        - DATE_OF_BIRTH
        - LANGUAGE

    CountryDto:
      type: object
      required:
        - code
        - name
      properties:
        code:
          type: string
          description: ISO 3166-1 Alpha-2 code
        name:
          type: string
          description: name of this country

    CustomerDto:
      type: object
      properties:
        id:
          type: integer
          format: int64
          description: ID of this customer
        email:
          type: string
          description: customer email address
        title:
          type: string
          description: customer title (e.g. Mr/Mrs/Ms)
        firstName:
          type: string
          description: customer first name
        lastName:
          type: string
          description: customer last name
        address:
          type: string
          description: customer address
        postCode:
          type: string
          description: customer post code
        state:
          type: string
          description: customer state
          example: 'FL'
        city:
          type: string
          description: customer city
        country:
          type: string
          minLength: 2
          maxLength: 2
          description: customer country of residence. ISO 3166-1 alpha 2 code.
        nationality:
          type: string
          minLength: 2
          maxLength: 2
          description: customer nationality. ISO 3166-1 alpha 2 code.
        language:
          type: string
          description: customer language
        phoneNumber:
          type: string
          description: customer phone number with country code (if provided)
          example: '+44 7890123456'
        organization:
          type: string
          description: organization this customer belongs to
        sex:
          type: string
          description: customer sex
        passportId:
          type: string
          description: customer passport ID
        dateOfBirth:
          type: string
          format: date

    CustomerInvoiceDto:
      allOf:
        - $ref: '#/components/schemas/CommonInvoiceDto'
        - type: object
          required:
            - issuerVendorId
            - customerId
            - fees
          properties:
            issuerVendorId:
              type: integer
              format: int64
              description: ID of the vendor (MarketplaceVendorDto::ID) who has issued this invoice.
            promoCodeId:
              type: integer
              format: int64
              description: ID of promo code if applied during the payment of this booking
            customerId:
              type: integer
              format: int64
              description: ID of the customer (CustomerDto::id) for this booking
            fees:
              type: array
              description: Any fees if applied for this invoice
              items:
                $ref: '#/components/schemas/FeeDto'

    CustomInputFieldValueDto:
      type: object
      description: contains value for a custom input field
      required:
        - customInputFieldId
      properties:
        customInputFieldId:
          type: integer
          format: int64
          description: ID of the custom field (`CustomInputFieldDto.id`) that was used to create this value
        value:
          type: string
          description: string representation of the value for given custom input field
          minLength: 0
          maxLength: 4294967295

    CustomerPaymentDto:
      type: object
      required:
        - id
        - currency
        - amount
        - paymentType
      properties:
        id:
          type: integer
          format: int64
          description: Customer payment ID
        currency:
          type: string
          minLength: 3
          maxLength: 3
          description: ISO 4217 currency code. Currency for this payment
        amount:
          type: string
          format: number
          description: paid amount in `currency`. Note that if refund(s) was/were performed, the amount will be negative.
        comment:
          type: string
          maxLength: 1000
          description: comment if available for this payment
        creationDate:
          $ref: '#/components/schemas/TimestampDto'
#          description: transaction date/time of this payment
        paymentType:
          $ref: '#/components/schemas/PaymentTypeDto'
        paymentProviderType:
          type: string
          description: type of payment provider. Exposed as free string as opposed to enum as types might be appearing dynamically. Unset if paid by gift card etc.
        giftCardId:
          type: integer
          format: int64
          description: set if `type == GIFT_CARD` and card refers to Bokun-issued gift card. Refers to `GiftCardDto::id` (TBD)
        externalCardId:
          type: integer
          format: int64
          description: set if `type == GIFT_CARD` and card refers to externally-issued gift card, e.g. YAY card. Refers to `ExternalGiftCardDto::id` (TBD)
        paymentReferenceId:
          type: string
          description: unique payment reference used by payment gateway and/or payment provider

    DayOfWeekDto:
      type: string
      enum:
        - MONDAY
        - TUESDAY
        - WEDNESDAY
        - THURSDAY
        - FRIDAY
        - SATURDAY
        - SUNDAY

    DropoffPriceRuleDto:
      allOf:
        - $ref: '#/components/schemas/CommonPriceRuleDto'
        - type: object

    DurationDto:
      type: object
      required:
        - minutes
        - hours
        - days
        - weeks
      properties:
        minutes:
          type: integer
          format: int32
          description: duration (minutes part)
          minimum: 0
          maximum: 59
        hours:
          type: integer
          format: int32
          description: duration (hours part)
          minimum: 0
          maximum: 23
        days:
          type: integer
          format: int32
          description: duration (days part)
          minimum: 0
          maximum: 6
        weeks:
          type: integer
          format: int32
          description: duration (weeks part)
          minimum: 0

    ExperienceActivationSettingsDto:
      type: object
      required:
        - activated
      properties:
        activated:
          type: boolean
          description: if true, this means this product is activated (or will be activated if requested) and vice versa.
        lastActivationDate:
          $ref: '#/components/schemas/TimestampDto'

    ExperienceAllocationDto:
      type: object
      description: defines a rule on how to distribute the availability among different vendors/booking channels
      required:
        - title
        - deadline
        - resellerIds
        - supplierBookingChannelIds
        - startTimeIds
      properties:
        id:
          type: integer
          format: int64
          description: ID of this allocation rule
        title:
          type: string
          minLength: 1
          maxLength: 255
        start:
          type: string
          format: date
          description: since when does this rule apply from? Optional, inclusive.
        end:
          type: string
          format: date
          description: until when does this rule apply to? Optional, inclusive.
        deadline:
          type: integer
          format: int32
          description: This rule ceases to be valid for a specific departure slot when there are less than specified number of hours left till departure.
            For example, if the value is 1, then availability restriction applies always except when 1 hour (or less) is left till departure.
        resellerIds:
          type: array
          description: for which vendor (reseller) IDs this rule applies. The list should not contain supplier own id. Rule will 
            match instantly if the incoming availability check will originate from vendors specified in this list.
            The list can be empty but only if at least one value is specified in `bookingChannelIds`.
          items:
            type: integer
            format: int64
        supplierBookingChannelIds:
          type: array
          description: for which booking channel IDs this rule applies. Rule will match instantly if the incoming availability 
            check will originate from a booking channel specified here. Note that channels in this list can only be those
            owned by the supplier of the product. Booking channel(s) of reseller vendor(s) should not be specified here.
            The list can be empty but only if at least one value is specified in `resellerIds`.
          items:
            type: integer
            format: int64
        startTimeIds:
          type: array
          description: which start times does this rule apply to. Note that multiple rules linked against the same start
            time can not have common `resellerId`s or `supplierBookingChannelId`s. The IDs here refer to `ExperienceStartTimeDto::id`.
            The list can be empty meaning that no start time is using this.
          items:
            type: integer
            format: int64
        guaranteedSeatPercentage:
          type: integer
          format: int32
          minimum: 0
          maximum: 100
          description: How many percent (of total availability for given slot) should this rule guarantee to all linked 
            resellers/booking channels combined (not each!). These guaranteed seats will not be granted to anybody else
            unless the allocation date range doesn't apply or the deadline passes. Note that guaranteed seats can be 
            expressed either as percentage (this attribute) or raw number (`guaranteedSeatCount`). Zero value is a valid 
            option meaning the rule will work as a limiting rule only without any guarantees.
        guaranteedSeatCount:
          type: integer
          format: int32
          minimum: 0
          description: same as `guaranteedSeatPercentage` but expressed as raw number as opposed to percentage.
        seatLimitPercentage:
          type: integer
          format: int32
          minimum: 0
          maximum: 100
          description: How many percent (of total availability for given slot) should this rule cap for the linked 
            resellers/booking channels together (not each!). The cap is valid as long as the rule applies.
            Note that either percentage expression or raw number must be specified but not both.
        seatLimitCount:
          type: integer
          format: int32
          minimum: 0
          description: same as `seatLimitPercentage` except expressed as a raw number instead of percent.

    ExperienceAllocationsPagedListDto:
      allOf:
        - $ref: '#/components/schemas/PagedListDto'
        - type: object
          required:
            - items
          properties:
            items:
              type: array
              items:
                $ref: '#/components/schemas/ExperienceAllocationDto'

    ExperienceAvailabilityDto:
      type: object
      description: contains information about availability of an experience product. This endpoint is available for all resellers as well as the original supplier of the requested product.
      required:
        - date
        - startTimeId
        - remainingPax
        - minPax
      properties:
        id:
          type: string
          description: unique ID of this availability object.
        date:
          type: string
          format: yyyy-MM-dd
        startTimeId:
          type: integer
          format: int64
          description: ID of start time object, refers to `ExperienceStartTimeDto::id`
        time:
          type: string
          format: time in 24 hour format, e.g. "16:30" or "05:15". This field only appears for `DATE_AND_TIME` products; never appears for `DATE` nor `PASS` products.
          minLength: 5
          maxLength: 5
        remainingPax:
          type: integer
          format: int32
          minimum: 0
          description: how many remaining seats are left to book
        remainingPickups:
          type: integer
          format: int32
          minimum: 0
          description: how many pickup slots are left to book. This field only appears if the experience product is configured to use pickup allotment and has limited pickup slots available.
        minPax:
          type: integer
          format: int32
          minimum: 1
          description: this attribute contains how many passengers are required for an event to happen. 
            This number only reflects the value defined at availability rule level and is impacted by existing booking count.
            For example, if the rule defines that there's a requirement to book at least 5 pax and there would have been already 5 passengers booked, this field would then have value of 1 as this field can never be zero.
            Note that each rate might define a similar independent parameter which, if set to a greater value, could override this setting. For example if a rate is tiered and requires min 2 adults, the fact that this field has a value of `1` makes it irrelevant in the context of a single booking.
            Note that rate settings are provided separately as opposed to copied for every availability slot.
        guidedLanguages:
          type: array
          description: a list of guided languages applicable for this availability slot. Only present if there are guided languages defined for product.
          items:
            type: string

    ExperienceAvailabilityStatisticsDto:
      allOf:
        - $ref: '#/components/schemas/ExperienceAvailabilityDto'
        - type: object
          required:
            - closed
            - unlimited
            - pastCutoff
            - tooEarly
            - paxBooked
          properties:
            closed:
              type: boolean
              description: if true, this availability slot is closed off by the supplier. If false, this availability slot is open for business or its closure state is unknown.
            unlimited:
              type: boolean
              description: if true, this availability slot has unlimited capacity for passenger sales (not pickups!). If false, this availability slot has limited capacity or the state is unknown.
            pastCutoff:
              type: boolean
              description: if true, this availability slot is now past cutoff time. If false, this availability slot is within cutoff limits.
            tooEarly:
              type: boolean
              description: if true, this availability slot is not yet bookable because of early booking limit restrictions. If false, this availability slot is within early booking limit restrictions.
            initialPax:
              type: integer
              format: int32
              description: if set, this field will contain the number of available seats as originally defined in the availability rule. Omitted if unknown (e.g. Inventory Service) or unlimited.
            initialPickups:
              type: integer
              format: int32
              description: return how many pickup seats were originally available for booking. Field only appears if this product has pickup system enabled and uses pickup allotment.
            paxBooked:
              type: integer
              format: int32
              description: How many passengers have booked this slot at the time of check (for typical non-combo, non-IS products). 
                For combos, this tells how many combo products were booked. 
                For Inventory Service products, this tells how many IS products were booked *in Bokun* rather than external channels.
            pickupsBooked:
              type: integer
              format: int32
              description: return how many passengers have booked pickups for this slot at the time of check. Field only appears if this product has pickups available for purchase.
            remainingResources:
              type: integer
              format: int32
              description: return how many resources are remaining for this slot. Field only appears if this product has resource pool(s) connected to this slot.
                If multiple resource pools are assigned to the same start time, this will return the minimum availability of all such pools.
            recurrenceRuleId:
              type: integer
              format: int64
              description: returns ID of the recurrence rule object, if available.

    ExperienceRecurrenceRuleDto:
      type: object
      description: Availability rule. A set of such objects define availability for experience product.
      required:
        - recurrenceRule
        - maxCapacity
      properties:
        id:
          type: integer
          format: int64
          description: ID of this experience recurrence rule
        recurrenceRule:
          $ref: '#/components/schemas/RecurrenceRuleDto'
        maxCapacity:
          type: integer
          format: int32
          description: what is the maximum number of passengers supplier can accept for this availability rule?
        maxCapacityForPickup:
          type: integer
          format: int32
          description: used if pickup is enabled. Sets the amount of available seats in your pick-up service for this rule
        minTotalPax:
          type: integer
          format: int32
          description: if set, the experience will only be bookable if minimum participants is met
        allStartTimes:
          type: boolean
          description: Mandatory if `bookingType == DATE_AND_TIME`, otherwise should be omitted. if set to `true`, this rule will apply to all start times; in which case `startTimes` array should not be sent.
            If set to `false`, this rule will apply to specific start times, specified in now mandatory `startTimes` array. The array should contain
            references to Bokun-local start time ids and/or external IDs. Sending empty `startTimes` array has the same effect as having `allStartTimes == true`.
        startTimes:
          type: array
          items:
            $ref: '#/components/schemas/IdExternalIdDto'
        guidedLanguages:
          type: array
          items:
            type: string
            description: a list of guided languages this rule is applicable to. Elements are ISO 639 two letter language codes, e.g. 'en', 'es' and so on.

    EarlyBookingLimitType:
      type: string
      enum:
        # Applicable to: date and time, date and pass types. Enforces no early limits. Most common.
        - UNLIMITED
        # Applicable to `ActivityBookingType::DATE_AND_TIME` & `ActivityBookingType::DATE` types. Permits booking no earlier than specific/static date and time (both date and time are absolute).
        - SPECIFIC_DATE_TIME
        # Applicable to `ActivityBookingType::DATE_AND_TIME` & `@link ActivityBookingType::DATE` types. Permits booking no earlier than X days
        # before travel date at some specific time on the day of booking (number of days is relative, time of day is absolute).
        - RELATIVE_TO_TRAVEL_DATE_SPECIFIC_TIME
        # Applicable to: `ActivityBookingType::DATE_AND_TIME` & `ActivityBookingType::DATE` types. Permits booking no earlier than X months
        # before travel date at some specific time on the day of booking (months before is relative, time of day absolute).
        - MONTHS_BEFORE_TRAVEL_DATE_SPECIFIC_TIME
    MarketplaceVisibilityTypeDto:
      type: string
      enum:
        - PUBLIC
        - PRIVATE
        - UNLISTED
    ExperienceEarlyBookingLimitDto:
      type: object
      description: Contains available options / selections for early booking limit (aka booking opening date). This feature allows limiting sales further in the future.
      required:
        - limitType
      properties:
        limitType:
          $ref: '#/components/schemas/EarlyBookingLimitType'
        specificDateTime:
          # Used if limitType is `SPECIFIC_DATE_TIME` (in which case mandatory, otherwise should be omitted). This date/time is in the time zone of the experience product
          $ref: '#/components/schemas/LocalDateTimeDto'
        daysBefore:
          description: Used if `limitType` is `RELATIVE_TO_TRAVEL_DATE_SPECIFIC_TIME` (in which case mandatory, otherwise should be omitted).
          type: integer
          format: int32
          minimum: 0
        monthsBefore:
          description: Used if `limitType` is `MONTHS_BEFORE_TRAVEL_DATE_SPECIFIC_TIME` (in which case mandatory, otherwise should be omitted).
          type: integer
          format: int32
          minimum: 0
        time:
          # Used if `limitType` is `RELATIVE_TO_TRAVEL_DATE_SPECIFIC_TIME` or `MONTHS_BEFORE_TRAVEL_DATE_SPECIFIC_TIME`. This value serves the time (hour of day and minute of hour) for both of these options.
          # Value mandatory for both limit types only, otherwise should be omitted.
          # This refers to absolute time (local to product) when availability goes live. Note that even though `daysBefore`/`monthsBefore` is relative, `time` is absolute/fixed.
          $ref: '#/components/schemas/LocalTimeDto'

    ExperienceBookingTypeDto:
      type: string
      enum:
        - PASS
#          description: The activity is booked by buying a pass which has an optional expiry date (e.g. museums, exhibitions, theme parks, etc.).
        - DATE
#          description: The activity is booked on a date basis. Start date must be specified when booking. Time within day does not need to be specified.
        - DATE_AND_TIME
#          description: The activity is booked on a date and time basis. Both start date and time must be selected when booking.

    ExperienceBookingQuestionContextDto:
      type: string
      enum:
        - BOOKING
        - PASSENGER
        - EXTRA

    ExperienceBookingQuestionDataTypeDto:
      type: string
      enum:
        - SHORT_TEXT
        - LONG_TEXT
        - INT
        - DOUBLE
        - BOOLEAN
        - CHECKBOX_TOGGLE
        - DATE
        - DATE_AND_TIME
        - OPTIONS

    ExperienceBookingQuestionDto:
      type: object
      required:
        - label
        - personalData
        - required
        - dataType
        - pricingCategoryTriggerSelection
        - rateTriggerSelection
        - extraTriggerSelection
        - context
      properties:
        id:
          type: integer
          format: int64
          description: question ID
        created:
          $ref: '#/components/schemas/TimestampDto'
#          description: Date/time this question was created. Can only be received, never sent
        lastModified:
          $ref: '#/components/schemas/TimestampDto'
#          description: Date/time this question was last modified. Can only be received, never sent
        label:
          type: string
          description: this is the question the customer will be asked
          minLength: 1
          maxLength: 255
        personalData:
          type: boolean
          description: whether this question is asking for personal data
        required:
          type: boolean
          description: whether answer for this question is required (mandatory)
        requiredBeforeDeparture:
          type: boolean
          description: whether answer for this question is required before departure (mandatory)
        help:
          type: string
          description: Extra text that explains the question further
          minLength: 1
          maxLength: 255
        placeholder:
          type: string
          description: This text will appear when there is no value filled in
          minLength: 1
          maxLength: 255
        dataType:
          $ref: '#/components/schemas/ExperienceBookingQuestionDataTypeDto'
        defaultValue:
          type: string
          description: Default value of the answer if the question hasn't been answered
          minLength: 1
          maxLength: 255
        context:
          $ref: '#/components/schemas/ExperienceBookingQuestionContextDto'
        pricingCategoryTriggerSelection:
          $ref: '#/components/schemas/ExperienceBookingQuestionTriggerSelectionDto'
        pricingCategoryTriggers:
          type: array
          items:
            type: integer
            format: int64
            description: list of `PricingCategoryDto::id`s. Specified only if `pricingCategoryTriggerSelection==SELECTED_ONLY`. Question is triggered only if given pricing category(ies) is/are booked.
        rateTriggerSelection:
          $ref: '#/components/schemas/ExperienceBookingQuestionTriggerSelectionDto'
        rateTriggers:
          type: array
          description: list of rate ids and/or external ids. Specified only if `rateTriggerSelection==SELECTED_ONLY`. Question is triggered only if given rate(s) is/are booked.
          items:
            $ref: '#/components/schemas/IdExternalIdDto'
        extraTriggerSelection:
          $ref: '#/components/schemas/ExperienceBookingQuestionTriggerSelectionDto'
        extraTriggers:
          type: array
          items:
            $ref: '#/components/schemas/IdExternalIdDto'
        options:
          type: array
          description: should be set if `dataType == OPTIONS`. Contains all possible entries for option selection.
          items:
            $ref: '#/components/schemas/ExperienceBookingQuestionOptionDto'

    ExperienceBookingQuestionOptionDto:
      type: object
      required:
        - label
        - value
      properties:
        id:
          type: integer
          format: int64
          description: option ID
        label:
          type: string
          description: question label (text)
          minLength: 1
          maxLength: 255
        value:
          type: string
          description: actual value that will be recorded once the relevant label is selected
          minLength: 1
          maxLength: 255

    ExperienceBookingQuestionTriggerSelectionDto:
      type: string
      enum:
        - ANY
        - SELECTED_ONLY

    ExperienceBoxSettingsDto:
      type: object
      description: box is a wrapper around another product which allows certain level of customization. The following fields are permitted to be overridden`:` title, description, photos and videos, externalId
      required:
        - isBox
      properties:
        isBox:
          type: boolean
          description: if true, this product will be created as box and will require experience product ID which you are boxing.
        boxedProductId:
          type: integer
          format: int64
          description: this should refer to another product ID which is being boxed. Only own or contracted non-boxed, non-combo products can be boxed.
        overridePhotosVideos:
          type: boolean
          description: whether this box is allowed to override photos and videos of its parent. Mandatory if `isBox` is `true`
        overrideCustomInputFieldValues:
          type: boolean
          description: whether this box is allowed to override custom input field values of its parent. Mandatory if `isBox` is `true`
        overrideItinerary:
          type: boolean
          description: whether this box is allowed to override itinerary of its parent. Mandatory if `isBox` is `true`

    ExperienceCapacityTypeDto:
      type: string
      enum:
        - FREE_SALE
#          description: Can be sold without performing capacity checks.
        - LIMITED
#          description: Only a limited number of seats, and remaining capacity must be checked before booking.
        - ON_REQUEST
#          description: No capacity is managed. Instead, the operator must manually take decision on whether to confirm or reject each booking request.

    ExperienceCategoryDto:
      type: string
      enum:
        - WALKING_TOUR
        - BUS_OR_MINIVAN_TOUR
        - AIR_OR_HELICOPTER_TOUR
        - SAILING_OR_BOAT_TOUR
        - PRIVATE_CAR_TOUR
        - SEAT_IN_COACH_TOUR
        - SEGWAY_TOUR
        - SNOWMOBILE_TOUR
        - ATV_OR_QUAD_TOUR
        - BIKE_TOUR
        - HOP_ON_HOP_OFF_TOUR
        - TOURIST_PASS
        - RAIL_PASS
        - AMUSEMENT_PARK
        - AIRPORT_LOUNGE
        - SHOWS_AND_MUSICALS
        - SPECTATOR_SPORTS
        - FESTIVAL
        - MUSEUMS_AND_EXHIBITIONS
        - SIGHTSEEING_ATTRACTION
        - ZOOS_AND_AQUARIUMS
        - SIGHTSEEING
        - ARTS_AND_CULTURE
        - CLASSES_AND_WORKSHOPS
        - CULINARY
        - NIGHTLIFE
        - SHOPPING
        - PHOTOGRAPHY
        - TV_AND_MOVIES
        - ESCAPE_GAME
        - SPA_AND_WELLNESS
        - ADVENTURE
        - WATER
        - NATURE
        - SAFARI_AND_WILDLIFE
        - BIRDWATCHING
        - DOLPHIN_OR_WHALEWATCHING
        - SURFING
        - CANOEING
        - CAVING
        - CLIMBING
        - DIVING
        - GLACIER_HIKING
        - HIKING
        - HORSEBACK_RIDING
        - ICE_CLIMBING
        - KAYAKING
        - RAFTING
        - SEA_ANGLING
        - HUNTING
        - FISHING
        - SKIING
        - SNORKELING
        - SELF_DRIVE_TOUR
        - PRIVATE_ROUNDRIP
        - MINI_CRUISE
        - CITY_BREAK
        - SHORT_BREAK
        - SUN_AND_BEACH
        - PILGRIMAGE_OR_RELIGION
        - MOTORCYCLE_TOURS
        - MOUNTAIN_BIKE
        - GOLF
        - MULTISPORT
        - EDUCATIONAL_TOUR
        - LANGUAGE_TOUR
        - MEDICAL_TOUR
        - CULTURAL_AND_THEME_TOURS
        - DAY_TRIPS_AND_EXCURSIONS
        - HOLIDAY_AND_SEASONAL_TOURS
        - LUXURY_AND_SPECIAL_OCCASIONS
        - OBSTACLE_COURSES
        - ADRENALINE_AND_EXTREME
        - PAINTBALL
        - PARAGLIDING
        - RUNNING
        - SHORE_EXCURSIONS
        - THEME_PARKS
        - TROLLEY_TOURS
        - LAYOVER_TOURS
        - CLASSIC_CAR_TOURS
        - UNDERGROUND_TOURS
        - PLANTATION_TOURS
        - HORSE_CARRIAGE_RIDE
        - SKIP_THE_LINE
        - CITY_TOURS
        - TRANSFERS_AND_GROUND_TRANSPORT
        - VIP_AND_EXCLUSIVE
        - WEDDING_AND_HONEYMOON
        - EBIKE_TOUR
        - BUS_TOUR
        - MINIVAN_TOUR
        - JET_SKI_TOUR
    ExperienceCloseoutDto:
      type: object
      description: contains information about closed availabilities for a single date / single product
      required:
        - date
        - startTimeIds
      properties:
        date:
          type: string
          format: date
          description: date when this closeout is active
        startTimeIds:
          description: start times that are closed. This can be just a subset of all start times allocated for requested product.
          type: array
          items:
            type: integer
            format: int64

    ExperienceComboSettingsDto:
      type: object
      description: enabling combo unlocks `ExperienceStartTimeDto::comboStartTimeMappings`.
      required:
        - isCombo
      properties:
        isCombo:
          type: boolean
          description: true if this experience product is a combo of other products, false otherwise
        ticketPerComboComponent:
          type: boolean
          description: if true, customer gets tickets for each combo part as well as a ticket for the combo itself. If 
             false, ticket will only be sent for combo parent. This field is mandatory if `isCombo=true`.
        ticketComboComponents:
          type: array
          description: mandatory if `ticketPerComboComponent=true`. This specifies IDs of combo parts (experience product IDs) 
             for which tickets should be sent.
          items:
            type: integer
            format: int64

    ExperienceComboPricingCategoryMappingDto:
      type: object
      required:
        - comboChildPricingCategoryId
        - comboParentPricingCategoryId
      properties:
        comboParentPricingCategoryId:
          type: integer
          format: int64
          description: refers to `PricingCategoryDto::id` of parent combo product
        comboChildPricingCategoryId:
          type: integer
          format: int64
          description: refers to `PricingCategoryDto::id` of child combo product

    ExperienceComboRateMappingDto:
      type: object
      description: parent rate can be referenced either via `id` or `externalId` (or both if pointing to the same object). Child rate can only be referenced via `id`.
      required:
        - comboParentRate
        - comboChildRateId
      properties:
        comboParentRate:
          $ref: '#/components/schemas/IdExternalIdDto'
        comboChildRateId:
          type: integer
          format: int64
          description: Rate id (`ExperienceRateDto.id`) of the rate that is being mapped against parent rate. External IDs not accepted.

    ExperienceComboStartTimeMappingDto:
      type: object
      required:
        - comboChildStartTimeId
        - inheritPickupFromParent
        - rateMappings
        - pricingCategoryMappings
      properties:
        id:
          type: integer
          format: int64
        comboChildStartTimeId:
          type: integer
          format: int64
          description: must contain reference to `ExperienceStartTimeDto::id` of combo child product. Product must active and published.
            Can be own or contracted.
        inheritPickupFromParent:
          type: boolean
          description: if true, it will inherit pickup settings from the parent combo. Otherwise, `pickupPlace` must be specified.
        pickupPlace:
          type: string
          maxLength: 255
          description: pickup place to use if `inheritPickupFromParent = false`
        dropoffPlace:
          type: string
          maxLength: 255
        rateMappings:
          type: array
          items:
            $ref: '#/components/schemas/ExperienceComboRateMappingDto'
        pricingCategoryMappings:
          type: array
          items:
            $ref: '#/components/schemas/ExperienceComboPricingCategoryMappingDto'

    ExperienceCommissionDto:
      type: object
      required:
        - product
        - extras
      properties:
        product:
          $ref: '#/components/schemas/TicketCategoryCommissionDto'
#          description: commissions for all ticket categories for this product
        pickupDropoff:
          $ref: '#/components/schemas/TicketCategoryCommissionDto'
#          description: commissions for all ticket categories for pickups/dropoffs for this product
        extras:
          type: array
          items:
            $ref: '#/components/schemas/ExtraCommissionDto'

    ExperienceComponentsDto:
      type: object
      description: object which contains a collection of selected experience product components, such as description,
        title and so on. Each component comes with its own structure/requirements. Absence of each element on update 
        is treated as if the relevant element should stay unchanged (as opposed to deleted).
      properties:
        lastModified:
          $ref: '#/components/schemas/TimestampDto'
        created:
          $ref: '#/components/schemas/TimestampDto'
        externalId:
          type: string
          description: ID which is meant to reference the ID of this product on some external system
        title:
          type: string
          description: product title
          minLength: 1
          maxLength: 140
        shortDescription:
          type: string
          description: short description (aka excerpt) of this product
        description:
          type: string
          description: longer description of this product. HTML format
          maxLength: 4294967295
        keywords:
          description: a list of product keywords. Max length of all keywords is 1000 chars providing extra separator is used for each keyword.
          type: array
          items:
            type: string
        type:
          $ref: '#/components/schemas/ExperienceTypeDto'
        privateExperience:
          type: boolean
          description: true if this particular experience product is marked as private, false otherwise
        timeZone:
          type: string
          description: IANA/Olson style time zone string. If unset per-product, will return the time zone of the supplier who owns this product
        categories:
          type: array
          items:
            $ref: '#/components/schemas/ExperienceCategoryDto'
        themes:
          type: array
          items:
            $ref: '#/components/schemas/ExperienceThemeDto'
        difficultyLevel:
          $ref: '#/components/schemas/ExperienceDifficultyDto'
        minAge:
          type: integer
          format: int32
          description: minimum age required to participate in this activity
        duration:
          $ref: '#/components/schemas/DurationDto'
        onRequestDeadline:
          $ref: '#/components/schemas/DurationDto'
        location:
          $ref: '#/components/schemas/GooglePlaceDto'
        itinerary:
          type: array
          items:
            $ref: '#/components/schemas/ExperienceItineraryDto'
        photos:
          type: array
          items:
            $ref: '#/components/schemas/PhotoDto'
        videos:
          type: array
          items:
            $ref: '#/components/schemas/VideoDto'
        guidanceTypes:
          $ref: '#/components/schemas/ExperienceGuidedLanguagesDto'
        inclusions:
          type: array
          items:
            $ref: '#/components/schemas/ExperienceInclusionExclusionTypeDto'
        included:
          type: string
          description: This string contains any additional inclusions which are not mentioned in `inclusions`. Typically these are some custom items. HTML format
        exclusions:
          type: array
          items:
            $ref: '#/components/schemas/ExperienceInclusionExclusionTypeDto'
        excluded:
          type: string
          description: This string contains any additional exclusions which are not mentioned in `exclusions`. Typically these are some custom items. HTML format
        knowBeforeYouGo:
          type: array
          items:
            $ref: '#/components/schemas/ExperienceKnowBeforeYouGoTypeDto'
        attention:
          type: string
          description: This string contains any additional know before you go items which are not mentioned in `knowBeforeYouGo`. Typically these are some custom items. HTML format
        requirements:
          type: string
          description: This string contains text for "what should your travellers bring with them" aka "requirements". HTML format
        extras:
          description: a list of extras this product is associated to. Note that each extra still needs to be linked to activity rate(s) to be bookable.
          type: array
          items:
            $ref: '#/components/schemas/ExtraDto'
        bookingType:
          $ref: '#/components/schemas/ExperienceBookingTypeDto'
        defaultOpeningHours:
          $ref: '#/components/schemas/OpeningHoursDto'
        seasonalOpeningHours:
          description: opening hours if defined for specific seasons as opposed to default opening hours which are valid all time, unless overridden by seasonal hours.
          type: array
          items:
            $ref: '#/components/schemas/SeasonalOpeningHoursDto'
        cutoff:
          $ref: '#/components/schemas/ExperienceCutoffDto'
        capacityType:
          $ref: '#/components/schemas/ExperienceCapacityTypeDto'
        startTimes:
          type: array
          items:
            $ref: '#/components/schemas/ExperienceStartTimeDto'
        availabilityRules:
          type: array
          items:
            $ref: '#/components/schemas/ExperienceRecurrenceRuleDto'
        passSettings:
          $ref: '#/components/schemas/ExperiencePassSettingsDto'
        pricingCategories:
          $ref: '#/components/schemas/ExperiencePricingCategoriesDto'
        rates:
          $ref: '#/components/schemas/ExperienceRatesDto'
        pricing:
          $ref: '#/components/schemas/ExperiencePricingDto'
        mainPaxInfo:
          type: array
          description: What information to ask the main contact (as opposed to other passengers, see `informationToAskOtherPassengers`)
          items:
            $ref: '#/components/schemas/ContactInformationDto'
        otherPaxInfo:
          type: array
          description: What information to ask the all other passengers (as opposed to main passenger, see `informationToAskMainContact`)
          items:
            $ref: '#/components/schemas/ContactInformationDto'
        bookingQuestions:
          type: array
          description: any custom questions to ask once this product is booked through widgets or API. Doesn't apply to OTA bookings.
          items:
            $ref: '#/components/schemas/ExperienceBookingQuestionDto'
        returnProductId:
          type: integer
          format: int64
          description: this will set return product ID in case if product type is `TRANSPORT`. Error will be returned if the product is not of type `TRANSPORT`. The ID should refer to another experience product which is active, published, belongs to the same vendor, is not already connected to another product and is not a box.
        combo:
          $ref: '#/components/schemas/ExperienceComboSettingsDto'
        ticket:
          $ref: '#/components/schemas/ExperienceTicketDto'
        bookingLabels:
          type: array
          description: a list of booking label IDs. If set, when this activity is booked, the selected product group labels are applied automatically to the booking.
          items:
            type: integer
            format: int64
        flags:
          description: a list of product flags. Max length of all flags is 1000 chars providing extra separator is used for each flag.
          type: array
          items:
            type: string
        customInputFieldValues:
          type: array
          description: a list of values for custom input fields. All values (present or not) are listed for all custom input fields which are associated with the vendor of this product and linked to Experiences product category
          items:
            $ref: '#/components/schemas/CustomInputFieldValueDto'
        commissionGroupId:
          type: integer
          format: int64
          description: refers to `ExperienceCommissionGroup::id` (TBD) if set, otherwise absent/null.
        inventorySettings:
          $ref: '#/components/schemas/ExperienceInventorySettingsDto'
        allowCustomizedBookings:
          type: boolean
          description: if set to true, the supplier will be able to book using arbitrary price/group sizes in the booking desk. 
            Customized bookings are disabled by default (value of this flag is false).
        boxSettings:
          $ref: '#/components/schemas/ExperienceBoxSettingsDto'
        activation:
          $ref: '#/components/schemas/ExperienceActivationSettingsDto'
        meetingType:
          $ref: '#/components/schemas/ExperienceMeetingSettingsDto'
        marketplaceVisibilityType:
          $ref: '#/components/schemas/MarketplaceVisibilityTypeDto'
        id:
          type: integer
          format: int64
          description: prints experience product ID. This attribute is read-only.
        earlyBookingLimit:
          $ref: '#/components/schemas/ExperienceEarlyBookingLimitDto'
        reservationTimeout:
          type: integer
          format: int32
          minimum: 15
          description: For how long to keep reservations (in minutes) for this product before they get aborted due to inactivity.
    ExperienceComponentTypeDto:
      type: string
      enum:
        - ACTIVATION
        - ALL
        - ALLOW_CUSTOMIZED_BOOKINGS
        - ATTENTION
        - AVAILABILITY_RULES
        - BOOKING_LABELS
        - BOOKING_QUESTIONS
        - BOOKING_TYPE
        - BOX_SETTINGS
        - CAPACITY_TYPE
        - CATEGORIES
        - COMBO
        - COMMISSION_GROUP_ID
        - CREATED
        - CUSTOM_INPUT_FIELD_VALUES
        - CUTOFF
        - DEFAULT_OPENING_HOURS
        - DESCRIPTION
        - DIFFICULTY_LEVEL
        - DURATION
        - EARLY_BOOKING_LIMIT
        - EXCLUDED
        - EXCLUSIONS
        - EXTERNAL_ID
        - EXTRAS
        - FLAGS
        - GUIDANCE_TYPES
        - INCLUDED
        - INCLUSIONS
        - INVENTORY_SETTINGS
        - ITINERARY
        - KEYWORDS
        - KNOW_BEFORE_YOU_GO
        - LAST_MODIFIED
        - LOCATION
        - MAIN_PAX_INFO
        - MARKETPLACE
        - MEETING_TYPE
        - MIN_AGE
        - ON_REQUEST_DEADLINE
        - OTHER_PAX_INFO
        - PASS_SETTINGS
        - PHOTOS
        - PRICING
        - PRICING_CATEGORIES
        - PRIVATE_EXPERIENCE
        - RATES
        - REQUIREMENTS
        - RETURN_PRODUCT_ID
        - SEASONAL_OPENING_HOURS
        - SHORT_DESCRIPTION
        - START_TIMES
        - THEMES
        - TICKET
        - TIME_ZONE
        - TITLE
        - TYPE
        - VIDEOS
        - ID
        - RESERVATION_TIMEOUT

    ExperienceCutoffDto:
      type: object
      description: mandatory if new product is created, optional if updated.
      required:
        - type
        - minutes
        - hours
        - days
        - weeks
      properties:
        type:
          $ref: '#/components/schemas/ExperienceCutoffTypeDto'
        referenceHour:
          type: integer
          description: must be specified if `type == RELATIVE_TO_ONE_SET_TIME`. Refers to some particular time (hour of 
            day, 24hr format) along with `referenceMinute`. Cutoff will be applied in relation to this time.
          minimum: 0
          maximum: 23
        referenceMinute:
          type: integer
          description: must be specified if `type = RELATIVE_TO_ONE_SET_TIME`. Refers to some particular time (minute of
            hour) along with `referenceHour`. Cutoff will be applied in relation to this time.
          minimum: 0
          maximum: 59
        minutes:
          type: integer
          description: cutoff time (minutes part)
          minimum: 0
          maximum: 59
        hours:
          type: integer
          description: cutoff time (hours part)
          minimum: 0
          maximum: 23
        days:
          type: integer
          description: cutoff time (days part)
          minimum: 0
          maximum: 6
        weeks:
          type: integer
          description: cutoff time (weeks part)
          minimum: 0
          maximum: 51

    ExperienceCutoffTypeDto:
      type: string
      enum:
        - RELATIVE_TO_START_TIME
#          description: cutoff (if set) is applied in relation to each of defined start times. For date/pass products the reference point is the midnight (00:00) before travel day.
        - RELATIVE_TO_WORKING_HOURS_OPEN
#          description: cutoff (if set) is applied in relation to operating hours (when does the business open on the given day).
        - RELATIVE_TO_WORKING_HOURS_CLOSE
#          description: cutoff (if set) is applied in relation to operating hours (when does the business close on the given day).
        - RELATIVE_TO_ONE_SET_TIME
#          description: cutoff (if set) is applied in relation to some arbitrary time specified under activity.
      x-enum-varnames:
        - RELATIVE_TO_START_TIME
        - RELATIVE_TO_WORKING_HOURS_OPEN
        - RELATIVE_TO_WORKING_HOURS_CLOSE
        - RELATIVE_TO_ONE_SET_TIME

    ExperienceDifficultyDto:
      type: string
      enum:
        - VERY_EASY
        - EASY
        - MODERATE
        - CHALLENGING
        - DEMANDING
        - EXTREME

    ExperienceExtraSelectionTypeDto:
      type: string
      enum:
        - OPTIONAL
#        description: use this option to make extra optional. End user may or may not purchase it with the booking
        - PRESELECTED
#        description: use this option to make extra mandatory/preselected. End user will not be able to remove this selection

    ExperienceGuidanceTypeDto:
      type: string
      enum:
        - GUIDED
#          description: This experience is guided by a live guide.
        - HEADPHONES
#          description: Guidance is offered via headphones.
        - READING_MATERIAL
#          description: Guidance is offered via reading material.

    ExperienceGuidedLanguagesDto:
      type: object
      description: keys are strings limited to `ExperienceGuidanceTypeDto` type and values are arrays of strings.
      properties:
        keyType:
          $ref: '#/components/schemas/ExperienceGuidanceTypeDto'
      additionalProperties:
        type: array
        items:
          type: string
          description: items are locales, e.g. 'en', 'es' and so on.

    ExperienceInclusionExclusionTypeDto:
      type: string
      enum:
        - ENTRY_OR_ADMISSION_FEE
        - FUEL_SURCHARGE
        - LANDING_AND_FACILITY_FEES
        - PARKING_FEES
        - ENTRY_TAX
        - DEPARTURE_TAX
        - NATIONAL_PARK_ENTRANCE_FEE
        - GOODS_AND_SERVICES_TAX
        - TIP_OR_GRATUITY
        - FOOD_AND_DRINKS
        - WIFI
        - BUS_FARE

    ExperienceInventoryExtraMappingDto:
      description: the `platformExtra` refers to extra object in Bokun, which can be referenced either via `ExtraDto::id` or 
        `ExtraDto::externalId`. `remoteExtraId` is the extra id which is coming from Inventory plugin.
      type: object
      required:
        - platformExtra
        - remoteExtraId
      properties:
        platformExtra:
          $ref: '#/components/schemas/IdExternalIdDto'
        remoteExtraId:
          type: string
          description: ID of remote extra on the Inventory Service (external to Bokun platform).

    ExperienceInventoryPricingCategoryMappingDto:
      type: object
      required:
        - platformPricingCategoryId
        - remotePricingCategoryId
      properties:
        platformPricingCategoryId:
          type: integer
          format: int64
          description: reference to `PricingCategoryDto::id`; ID of pricing category linked to this product (Bokun platform local).
        remotePricingCategoryId:
          type: string
          description: ID of remote pricing category on Inventory Service (external to Bokun platform).

    ExperienceInventoryRateMappingDto:
      description: binds Bokun platform rate (via reference to `ActivityRateDto::id` and/or `ActivityRateDto::externalId`) against remote rate (id only).
      type: object
      required:
        - platformRate
        - remoteRateId
      properties:
        platformRate:
          $ref: '#/components/schemas/IdExternalIdDto'
        remoteRateId:
          type: string
          description: ID of remote rate on Inventory Service (external to Bokun platform).

    ExperienceInventorySettingsDto:
      type: object
      required:
        - enabled
      properties:
        enabled:
          description: true if Inventory Service should be enabled for this product, false if disabled
          type: boolean
        inventoryPluginId:
          type: string
          description: Bokun's ID of Inventory Plugin. ID is assigned at the time of plugin registration (done by Bokun staff). 
            Note the plugin should also be configured for the calling vendor. Mandatory if `enabled=true`, otherwise should be omitted.
        remoteProductId:
          type: string
          description: ID of the corresponding product, as reported by the plugin (external to Bokun platform). This 
            product is or will be mapped against Bokun-local experience product. Mandatory if `enabled=true`, otherwise should be omitted.
        rateMappings:
          type: array
          description: A list of local to remote rate mappings. Mandatory if `enabled=true`, otherwise should be omitted.
          items:
            $ref: '#/components/schemas/ExperienceInventoryRateMappingDto'
        pricingCategoryMappings:
          type: array
          description: A list of local to remote pricing category mappings. Mandatory if `enabled=true`, otherwise should be omitted.
          items:
            $ref: '#/components/schemas/ExperienceInventoryPricingCategoryMappingDto'
        extraMappings:
          type: array
          description: A list of local to remote extra mappings. Optional if `enabled=true`, otherwise should be omitted.
          items:
            $ref: '#/components/schemas/ExperienceInventoryExtraMappingDto'

    ExperienceItineraryDto:
      type: object
      description: itinerary item (aka agenda item)
      required:
        - title
        - photos
      properties:
        id:
          type: integer
          format: int64
          description: ID of this itinerary item
        title:
          type: string
          maxLength: 255
          description: itinerary item title
        excerpt:
          type: string
          maxLength: 255
          description: short description for this itinerary item
        description:
          type: string
          maxLength: 4294967295
          description: long description (HTML) for this itinerary item
        address:
          $ref: '#/components/schemas/AddressDto'
        photos:
          type: array
          description: a list of photo IDs (a reference to `PhotoDto::id`) that are assigned to this experience product
            and selected to be used for this particular itinerary item
          items:
            type: integer
            format: int64

    ExperienceMeetingSettingsDto:
      type: object
      description: this object contains parameters for passenger pickup (and/or meeting points) as well as dropoff
      required:
        - type
        - dropoffService
      properties:
        type:
          $ref: '#/components/schemas/ExperienceMeetingTypeDto'
        meetingPointPlaceGroupId:
          description: can be used instead of `startPointAddresses` for better reuse. Refers to ID of a place group object. If set, `meetingPointAddresses` should be absent and vice versa.
          type: integer
          format: int64
        meetingPointAddresses:
          description: used if `type` is one of (`MEET_ON_LOCATION`, `MEET_ON_LOCATION_OR_PICK_UP`). Alternatively, `startPointPlaceGroupId` must be used.
          type: array
          items:
            $ref: '#/components/schemas/ExperienceMeetingPointDto'
        allPickupPlaceGroups:
          type: boolean
          description: if set to true, this will infer that all pickup place groups (currently linked against the product as well as those created in the future) 
            will be applicable for this product. If set to false, `pickupPlaceGroupIds` must contain specific IDs applicable for this product.
            This is a mandatory field if pickup is enabled (`type` is either `PICK_UP` or `MEET_ON_LOCATION_OR_PICK_UP`).
        pickupPlaceGroupIds:
          type: array
          description: a set of place group IDs applicable for pickup service of this product. Mandatory if `allPickupPlaceGroups == false`, otherwise should be absent.
          items:
            type: integer
            format: int64
        pickupMinutesBefore:
          description: How much time before departure does the pick-up start (in minutes)? This can only be used if `pickupTimeLocationBased == false` (which provides pickup settings per each pickup place).
            Either this, or `pickupTimeByLocation` is mandatory if pickup is enabled (`type` is either `PICK_UP` or `MEET_ON_LOCATION_OR_PICK_UP`). Can be negative if pickup is serviced after start time.
          type: integer
          format: int32
        pickupTimeWindow:
          description: How much time (in minutes) does your service allow for pickup? Mandatory if `type` is either `PICK_UP` or `MEET_ON_LOCATION_OR_PICK_UP`.
          type: integer
          minimum: 0
        pickupTimeLocationBased:
          type: boolean
          description: if `false`, pickup time applies for all locations identically (as specified via `pickupMinutesBefore`).
            If true, one must provide pick up times for each location via `pickupTimeByLocation`. Mandatory if `type` is either `PICK_UP` or `MEET_ON_LOCATION_OR_PICK_UP`.
        pickupTimeByLocation:
          type: array
          description: specified if `pickupTimeLocationBased == true`.
          items:
            $ref: '#/components/schemas/ExperiencePickupTimeByLocationDto'
        pickupAllotment:
          description: if `false`, this pickup service can always be booked. If `true`, only a certain number of items of this pickup service can be booked.
            If `true`, the relevant allotment number should be provided via `ExperienceRecurrenceRuleDto::maxCapacityForPickup`. Mandatory if `type` is either `PICK_UP` or `MEET_ON_LOCATION_OR_PICK_UP`.
          type: boolean
        customPickupAllowed:
          description: if enabled, one can allow the customer to enter custom pickup location. The customer will then fill out an address to be picked up at.
            Mandatory if `type` is either `PICK_UP` or `MEET_ON_LOCATION_OR_PICK_UP`.
          type: boolean
        showPickupMessageOnTicket:
          type: boolean
          description: if enabled, this will show a custom message to the customers ticket depending on the customers pick-up preference.
            Mandatory if `type` is either `PICK_UP` or `MEET_ON_LOCATION_OR_PICK_UP`, otherwise should be absent.
        showNoPickupMessageOnTicket:
          type: boolean
          description: if enabled, ticket will display a custom message in case if no pickup is purchased/selected.
            Mandatory if `type` is either `PICK_UP` or `MEET_ON_LOCATION_OR_PICK_UP`, otherwise should be absent.
        noPickupMessage:
          type: string
          description: message to display in case if `showNoPickupMessageOnTicket == true`. HTML format.
          maxLength: 4000
        dropoffService:
          type: boolean
          description: if true, this enables dropoff service for this product, false otherwise.
        customDropoffAllowed:
          description: if enabled, one can allow the customer to enter custom dropoff location. The customer will then fill out an address to be dropped off at.
            Mandatory if `dropoffService` is true.
          type: boolean
        dropoffPlacesSameAsPickup:
          description: if enabled, this will make use place IDs for dropoff using the same settings as for pickup. `dropoffPlaceGroupIds` should be provided otherwise.
            Mandatory if `dropoffService` is true. This flag can't be enabled if `allDropoffPlaceGroups` is enabled.
          type: boolean
        allDropoffPlaceGroups:
          type: boolean
          description: if set to true, this will infer that all dropoff place groups (currently linked against the product as well as those created in the future)
            will be applicable for this product. If set to `false`, `dropoffPlaceGroupIds` must contain specific IDs applicable for dropoffs of this product.
            If set to `true`, `dropoffPlaceGroupIds` must be absent. This is a mandatory field if dropoff is enabled (`dropoffService` is `true`).
            This flag can't be enabled if `dropoffPlacesSameAsPickup` is enabled.
        dropoffPlaceGroupIds:
          type: array
          description: a set of place group IDs applicable for dropoff of this product. Only sent/accepted if `dropoffPlacesSameAsPickup` is `false`.
          items:
            type: integer
            format: int64

    ExperienceMeetingTypeDto:
      type: string
      enum:
        - MEET_ON_LOCATION
        - PICK_UP
        - MEET_ON_LOCATION_OR_PICK_UP

    ExperiencePassSettingsDto:
      type: object
      description: is used to keep specific settings if `ExperienceBookingTypeDto` value is `PASS`.
      required:
        - expiryType
      properties:
        expiryType:
          $ref: '#/components/schemas/PassExpiryTypeDto'
        capacity:
          type: integer
          format: int32
          minimum: 0
          description: global capacity for selling the pass. Specifies how many total passes can be sold. Applicable if experience `capacityType` is `LIMITED`.
        expiryDate:
          type: string
          format: date
          description: applicable if `expiryType` is `FIXED_DATE`. Denotes date when this pass expires (last day of validity).
        validForDays:
          type: integer
          format: int32
          description: applicable if `expiryType` is `RELATIVE_DATE`. Specifies after how many days from the purchase the pass expires.

    ExperiencePickupTimeByLocationDto:
      type: object
      required:
        - placeId
        - minBeforeStart
      properties:
        placeId:
          type: integer
          format: int64
          description: points to pickup place location ID
        minBeforeStart:
          type: integer
          format: int32
          description: how much time (in minutes) is a pickup serviced for this location? Can be negative if pick up is planned after the start time.

    ExperiencePricingCategoriesDto:
      type: object
      required:
        - defaultId
        - ids
      properties:
        defaultId:
          type: integer
          format: int64
          description: ID of default pricing category (`PricingCategoryDto::id`) for this product. Must be among supplied `ids`
        ids:
          type: array
          description: ordered list of `PricingCategoryDto::id`s. Contains active pricing categories assigned to this product
          items:
            type: integer
            format: int64
        replacements:
          description: a list of pricing category ID replacements. Replacements are required if removed (by omission) pricing categories are referenced by bookings. 
            Every `ExperiencePricingCategoryReplacementDto::replacementId` should be mentioned among `ids`.
          type: array
          items:
            $ref: '#/components/schemas/ExperiencePricingCategoryReplacementDto'

    ExperiencePricingCategoryReplacementDto:
      type: object
      required:
        - removedId
        - replacementId
      properties:
        removedId:
          type: integer
          format: int64
          description: ID of pricing category (`PricingCategoryDto::id`) which is being removed
        replacementId:
          type: integer
          format: int64
          description: ID of pricing category (`PricingCategoryDto::id`) which replaces the removed ID

    ExperienceRatesDto:
      type: object
      required:
        - rates
        - defaultRate
      properties:
        defaultRate:
          $ref: '#/components/schemas/IdExternalIdDto'
        rates:
          description: contains actual rate information. Order of this list does matter - rates in the system will be ordered accordingly to this input.
          type: array
          items:
            $ref: '#/components/schemas/ExperienceRateDto'

    ExperienceRateDto:
      type: object
      description: rate is one of the central entities in Bokun when it comes to experience products. Rate binds product pricing as well as governs settings such as pickup, dropoff, extras and so on.
      required:
        - title
        - pickupSelectionType
        - dropoffSelectionType
        - cancellationPolicyId
        - pricedPerPerson
        - allPricingCategories
      properties:
        id:
          type: integer
          format: int64
          description: ID of this rate
        externalId:
          type: string
          maxLength: 140
          description: can be used to reference a rate in external system. Can be used to reference e.g. default rate when creating product. Each context might enforce own uniqueness criteria.
        title:
          type: string
          description: rate title
          maxLength: 255
        description:
          type: string
          description: rate description
          maxLength: 1000
        created:
          $ref: '#/components/schemas/TimestampDto'
#          description: Date/time this rate was created. Can only be received, never sent
        lastModified:
          $ref: '#/components/schemas/TimestampDto'
#          description: Date/time this rate was last modified. Can only be received, never sent
        minPerBooking:
          type: integer
          format: int32
          description: bookings for this rate will have guaranteed min passenger count as specified by this property
          default: 1
        maxPerBooking:
          type: integer
          format: int32
          description: if set, bookings for this rate will have guaranteed max passenger count (inclusive) as specified by this property. Absence means there is no max limit.
        pickupSelectionType:
          $ref: '#/components/schemas/AddonSelectionTypeDto'
#          description: mandatory only if pickup is enabled, otherwise should not be sent. Allows to make pickup disabled VS enabled & optional VS enabled & mandatory for this rate. Note: if `meetingType` is `MEET_ON_LOCATION`, then this will always be `UNAVAILABLE`.
        pickupPricingType:
          $ref: '#/components/schemas/AddonPricingTypeDto'
#          description: mandatory only if pickup is enabled, otherwise should not be sent. Specifies whether pickup is included in the price or whether it is priced separately.
        pickupPricedPerPerson:
          type: boolean
          description: mandatory only if pickup is enabled (`meetingType` is not `MEET_ON_LOCATION` and `pickupPricingType` is `PRICED_SEPARATELY`), otherwise should not be sent. True if pickup is priced per single passenger; false if priced per booking (regardless how many pax booked)
        dropoffSelectionType:
          $ref: '#/components/schemas/AddonSelectionTypeDto'
#          description: mandatory only if dropoff is enabled at product level (`offersDropoffService` is `true`), otherwise should not be sent. Allows to make dropoff disabled VS enabled & optional VS enabled & mandatory for this rate.
        dropoffPricingType:
          $ref: '#/components/schemas/AddonPricingTypeDto'
#          description: mandatory only if dropoff is enabled, otherwise should not be sent.
        dropoffPricedPerPerson:
          type: boolean
          description: mandatory only if dropoff is enabled, otherwise should not be sent. True if dropoff is priced per single passenger; false if priced per booking (regardless how many pax booked)
        cancellationPolicyId:
          type: integer
          format: int64
          description: refers to ID of the cancellation policy object (tbd).
        pricedPerPerson:
          type: boolean
          description: if set to true, prices for this rate are expressed per person (per pricing category). If set to false, price is set per booking regardless how many pax booked
        tieredPricingEnabled:
          type: boolean
          description: must be present if `pricedPerPerson` is `true` and vice versa. If set to true, this unlocks the ability to set prices per different price tiers (e.g. one price per single pax, different price for 2..3 pax etc).
        tiers:
          type: array
          description: should only be sent if `tieredPricingEnabled` is `true`. Should contain pax ranges for specific pricing categories applicable for this rate. Tiers must be continuous and not overlap
          items:
            $ref: '#/components/schemas/ExperienceRateTierDto'
        extraConfigs:
          type: array
          description: a list of configuration objects linking this rate with extras
          items:
            $ref: '#/components/schemas/ExperienceRateExtraConfigDto'
        allStartTimes:
          type: boolean
          description: if set to true, this will infer that all start times (currently linked against the product as well as those created in the future) will be applicable for this rate. 
            If set to false, `startTimes` must contain specific IDs applicable for this rate. This flag must be specified only if `bookingType` is `DATE_AND_TIME`, otherwise omitted.
        startTimes:
          description: a list of start times applicable for this rate. Only sent/accepted if `allStartTimes` is `false` and `bookingType` is `DATE_AND_TIME`. Each element can be specified via `id` and/or `externalId`.
            Specifying empty array has the same effect as having `allStartTimes` set to `true`.
          type: array
          items:
            $ref: '#/components/schemas/IdExternalIdDto'
        allPricingCategories:
          type: boolean
          description: if set to true, this will infer that all pricing categories (currently linked against the product as well as those created in the future) will be applicable for this rate. If set to false, `pricingCategoryIds` must contain specific IDs applicable for this rate.
        pricingCategoryIds:
          type: array
          description: a set of pricing category IDs (`PricingCategoryDto::id`) applicable for this rate. Only sent/accepted if `allPricingCategories` is `false`.
          items:
            type: integer
            format: int64

    ExperienceRateExtraConfigDto:
      type: object
      required:
        - extra
        - selectionType
        - pricingType
        - pricedPerPerson
      properties:
        id:
          type: integer
          format: int64
          description: ID of this extra config object
        extra:
          $ref: '#/components/schemas/IdExternalIdDto'
        selectionType:
          $ref: '#/components/schemas/ExperienceExtraSelectionTypeDto'
        pricingType:
          $ref: '#/components/schemas/AddonPricingTypeDto'
        pricedPerPerson:
          type: boolean
          description: if set to true, this extra is priced per person (single pax). False if per booking.

    ExperienceRateTierDto:
      type: object
      required:
        - minPassengersRequired
        - pricingCategoryId
      properties:
        id:
          type: integer
          format: int64
          description: ID of this tier config object
        minPassengersRequired:
          type: integer
          format: int32
          description: number of min pax required to book this tier
        maxPassengersRequired:
          type: integer
          format: int32
          description: number of min pax required to book this tier
        pricingCategoryId:
          type: integer
          format: int64
          description: specifies which pricing category (`PricingCategoryDto::id`) is defined with this pricing tier

    ExperienceKnowBeforeYouGoTypeDto:
      type: string
      enum:
        - STROLLER_OR_PRAM_ACCESSIBLE
        - WHEELCHAIR_ACCESSIBLE
        - LIMITED_MOBILITY_ACCESSIBLE
        - LIMITED_SIGHT_ACCESSIBLE
        - ANIMALS_OR_PETS_ALLOWED
        - PUBLIC_TRANSPORTATION_NEARBY
        - INFANT_SEATS_AVAILABLE
        - INFANTS_MUST_SIT_ON_LAPS
        - PASSPORT_REQUIRED
        - DRESS_CODE

    ExperiencePricingDto:
      type: object
      description: contains a list of pricing rules for extras, pickups, dropoffs as well as experience itself.
      required:
        - experiencePriceRules
        - extraPriceRules
        - pickupPriceRules
        - dropoffPriceRules
        - priceCatalogCurrencies
      properties:
        experiencePriceRules:
          type: array
          description: a list of rules to be used for experience pricing. Previously existing rules should be copied with their IDs, new rules should be added. Omitted rules will be deleted.
          items:
            $ref: '#/components/schemas/ExperiencePriceRuleDto'
        extraPriceRules:
          type: array
          description: a list of rules to be used for extra pricing. Previously existing rules should be copied with their IDs, new rules should be added. Omitted rules will be deleted.
          items:
            $ref: '#/components/schemas/ExtraPriceRuleDto'
        pickupPriceRules:
          type: array
          description: a list of rules to be used for pickup pricing. Previously existing rules should be copied with their IDs, new rules should be added. Omitted rules will be deleted.
          items:
            $ref: '#/components/schemas/PickupPriceRuleDto'
        dropoffPriceRules:
          type: array
          description: a list of rules to be used for dropoff pricing. Previously existing rules should be copied with their IDs, new rules should be added. Omitted rules will be deleted.
          items:
            $ref: '#/components/schemas/DropoffPriceRuleDto'
        priceCatalogCurrencies:
          type: array
          description: a list of currencies configured for each catalog. One entry per one catalog
          items:
            $ref: '#/components/schemas/ExperiencePriceCatalogCurrenciesDto'

    ExperiencePriceCatalogCurrenciesDto:
      type: object
      description: specifies which price catalogs are linked to each product, as well as which currencies are applicable for said catalog
      required:
        - priceCatalogId
        - currencies
        - defaultCurrency
      properties:
        priceCatalogId:
          type: integer
          format: int64
          description: refers to `PriceCatalogDto::id`
        currencies:
          type: array
          items:
            type: string
            minLength: 3
            maxLength: 3
            description: ISO 4217 currency code
        defaultCurrency:
          type: string
          minLength: 3
          maxLength: 3
          description: ISO 4217 currency code. The currency for all of line items / totals of this invoice. Must refer to one of the `currencies` listed above

    ExperiencePriceRuleDto:
      allOf:
        - $ref: '#/components/schemas/CommonPriceRuleDto'
        - type: object
          properties:
            tierId:
              type: integer
              format: int64
              description: reference to `ExperienceRateTierDto::id`

    ExtraPriceRuleDto:
      allOf:
        - $ref: '#/components/schemas/CommonPriceRuleDto'
        - type: object
          properties:
            extra:
              $ref: '#/components/schemas/IdExternalIdDto'

    ExperienceMeetingPointDto:
      type: object
      required:
        - title
        - address
      properties:
        id:
          type: integer
          format: int64
          description: ID of this meeting point
        title:
          type: string
          description: a descriptive name for the place, e.g. "Grand Central Station", "Joe's bakery", etc.
          minLength: 1
          maxLength: 255
        address:
          $ref: '#/components/schemas/AddressDto'

    ExperienceStartTimeDto:
      type: object
      description: Contains details about each start time. Note that if you want to assign this start time to specific rate(s), this is managed in rate settings.
      properties:
        id:
          type: integer
          format: int64
          description: ID of this start time
        externalId:
          type: string
          maxLength: 140
          description: Used to refer to an ID in another system (e.g. origin system) as well as for various relationships. For example, externalId can be used
            to reference a particular start time in rate settings on product creation. Each context might enforce own uniqueness criteria.
        label:
          type: string
          maxLength: 100
          description: (internal) label for this start time. Available only if `ExperienceBookingTypeDto=DATE_AND_TIME`. Internal labels are only visible for the supplier
        externalLabel:
          type: string
          maxLength: 24
          description: (external) label for this start time. Widgets will display this label next to their start time / departure. Available only if `ExperienceBookingTypeDto=DATE_AND_TIME`.
        hour:
          type: integer
          format: int32
          minimum: 0
          maximum: 23
          description: hour of day when this event starts. Works hand in hand with minute. Available only if `ExperienceBookingTypeDto=DATE_AND_TIME`.
        minute:
          type: integer
          format: int32
          minimum: 0
          maximum: 59
          description: minute of hour of day when this event starts. Available only if `ExperienceBookingTypeDto=DATE_AND_TIME`.
        overrideTimeWhenPickup:
          type: boolean
          description: if true and pickup enabled, this will signal the fact that start time will be different if pickup is booked. Available only if `ExperienceBookingTypeDto=DATE_AND_TIME`. Defaults to false if not specified.
        pickupHour:
          type: integer
          format: int32
          minimum: 0
          maximum: 23
          description: hour of day when pickup starts. Works hand in hand with pickup minute. Available only if `ExperienceBookingTypeDto=DATE_AND_TIME`. Defaults to 0 if not specified.
        pickupMinute:
          type: integer
          format: int32
          minimum: 0
          maximum: 59
          description: minute of hour of day when pickup starts for this event. Works hand in hand with pickup hour. Available only if `ExperienceBookingTypeDto=DATE_AND_TIME`. Defaults to 0 if not specified.
        voucherPickupMsg:
          type: string
          description: Message to display on the ticket, if and only if this start time is booked with pick up. Available only if `ExperienceBookingTypeDto=DATE_AND_TIME`.
          maxLength: 1000
        durationMinutes:
          type: integer
          format: int32
          description: duration of event if this start time is booked (minutes part). Available only if `ExperienceBookingTypeDto=DATE_AND_TIME`. Defaults to 0 if not specified.
          minimum: 0
          maximum: 59
        durationHours:
          type: integer
          format: int32
          description: duration of event if this start time is booked (hours part). Available only if `ExperienceBookingTypeDto=DATE_AND_TIME`. Defaults to 0 if not specified.
          minimum: 0
          maximum: 23
        durationDays:
          type: integer
          format: int32
          description: duration of event if this start time is booked (days part). Available only if `ExperienceBookingTypeDto=DATE_AND_TIME`. Defaults to 0 if not specified.
          minimum: 0
          maximum: 6
        durationWeeks:
          type: integer
          format: int32
          description: duration of event if this start time is booked (weeks part). Available only if `ExperienceBookingTypeDto=DATE_AND_TIME`. Defaults to 0 if not specified.
          minimum: 0
        comboStartTimeMappings:
          type: array
          description: this is only allowed if parent product is combo. Combo products are required to have their start
            times mapped against start times of other products (own or resold).
          items:
            $ref: '#/components/schemas/ExperienceComboStartTimeMappingDto'

    ExperienceThemeDto:
      type: string
      enum:
        - FAMILY_FRIENDLY
        - ECO_FRIENDLY
        - ROMANTIC
        - LUXURY
        - RAINY_DAY
        - SKIP_THE_LINE
        - GROUP_FRIENDLY
        - INDOOR
        - OUTDOOR
        - PRIVATE_ACTIVITY
        - TAILOR_MADE
        - BEACH
        - ADULTS_ONLY
        - COUPLES
        - SENIOR
        - YOUTH
        - VOLUNTEERS

    ExperienceTicketDto:
      type: object
      description: product ticket settings
      required:
        - ticketPerPerson
      properties:
        barcodeFormat:
          $ref: '#/components/schemas/BarcodeFormatDto'
# description: if omitted, the default barcode format is used which is set at vendor level
        ticketPerPerson:
          type: boolean
          description: if true, a ticket is issued per each passenger. If false, a single ticket is issued for all recipients of the same booking
        ticketMsg:
          type: string
          description: message to show on the ticket. This message will be visible on all tickets for this experience booking
          minimum: 0
          maxLength: 4294967295

    ExperienceTypeDto:
      type: string
      enum:
        - DAY_TOUR_OR_ACTIVITY
        - ATTRACTION
        - EVENT
        - TRANSPORT
        - MULTI_DAY_TOUR

    ExtraCommissionDto:
      type: object
      required:
        - id
      properties:
        id:
          type: integer
          format: int64
          description: Extra ID
        commission:
          $ref: '#/components/schemas/TicketCategoryCommissionDto'

    ExtraDto:
      type: object
      required:
        - title
        - maxPerBooking
        - limitByPax
      properties:
        id:
          type: integer
          format: int64
          description: ID of this extra
        externalId:
          type: string
          description: ID which is meant to reference a corresponding ID of this product on some external system
          maxLength: 140
        title:
          type: string
          maxLength: 255
          description: title of this extra
        description:
          type: string
          description: description of this extra
          maxLength: 4000
        maxPerBooking:
          type: integer
          format: int32
          minimum: 0
          description: if set to a positive integer, this will set the extra to have a limit on how much extra items can 
            be booked regardless of how many participants booking has. A positive value is mutually exclusive with
            `limitByPax=true`.
        photo:
          $ref: '#/components/schemas/PhotoDto'
        type:
          $ref: '#/components/schemas/ExtraTypeDto'
        limitByPax:
          type: boolean
          description: if set to true, maximum amount on the bookable quantity of this extra is the same amount as the 
            number of participants for the booking. `true` value is mutually exclusive with `maxPerBooking > 0`
        commissionGroupId:
          type: integer
          format: int64
          description: refers to commission group object this extra belongs to. Commission group objects allow setting specific commissions for a set of items.

    ExtraTypeDto:
      type: string
      enum:
        - FOOD
        - DRINKS
        - SAFETY
        - TRANSPORT
        - DONATION
        - OTHERS

    FeeDto:
      type: object
      required:
        - title
        - amount
      properties:
        title:
          type: string
          description: Fee title
        amount:
          type: string
          format: number
          description: fee amount. Currency is normally part of the outer object which encloses this one

    GooglePlaceDto:
      type: object
      properties:
        id:
          type: integer
          format: int64
          description: Internal Bokun ID of this object (as opposed to Google place ID)
        countryCode:
          type: string
          description: ISO 3166-1 alpha-2 country code. Served as upper case.
          minLength: 2
          maxLength: 2
        city:
          type: string
          description: name of the city
          maxLength: 255
        state:
          type: string
          description: name of the state
          maxLength: 255
        name:
          type: string
          description: name of the place
          example: Joe's restaurant
          maxLength: 255
        placeId:
          type: string
          description: Google place ID (as per Google place API)
          maxLength: 255
        latitude:
          type: number
          format: double
          description: latitude, as per ISO 6709
          minimum: -90.0
          maximum: 90.0
        longitude:
          type: number
          format: double
          description: longitude, as per ISO 6709
          minimum: -180.0
          maximum: 180.0
        lookupLang:
          type: string
          description: Language to use for location lookup. Supported languages are listed in https://developers.google.com/maps/faq#languagesupport
            The language parameter, if passed, is used in order to initialize the place name (and possibly other parameters) in requested language.
            This parameter is only used for incoming data when creating or updating the location and is never returned back to the client.
          maxLength: 255

    InvoiceLineItemDto:
      type: object
      required:
        - ref
        - title
        - quantity
        - unitPrice
      properties:
        ref:
          type: string
          description: string reference for this line item. Unique among all other references and could be used as a
            string ID.
        title:
          type: string
          description: name for this line item
          example: 'Adults'
        quantity:
          type: integer
          format: int32
          description: How many items have been booked?
        unitPrice:
          type: string
          format: number
          description: How much would it cost (pre-tax, pre-discount) if the quantity was 1. [BigDecimal format](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/math/BigDecimal.html#%3Cinit%3E(java.lang.String))
        discountPercentage:
          type: string
          format: number
          description: How much discount (as a percentage value) was applied to this line item. [BigDecimal format](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/math/BigDecimal.html#%3Cinit%3E(java.lang.String))
        discountAmount:
          type: string
          format: number
          description: How much discount (as the monetary value) applied to this line item. [BigDecimal format](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/math/BigDecimal.html#%3Cinit%3E(java.lang.String))
        taxId:
          type: integer
          format: int64
          description: ID of Tax object used to compute this line item (if present). Otherwise absent/null.
        taxPercentage:
          type: string
          format: number
          description: Tax percentage. Present if taxId is present and vice versa. [BigDecimal format](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/math/BigDecimal.html#%3Cinit%3E(java.lang.String))
        taxAmount:
          type: string
          format: number
          description: Tax amount amount for this line item. Present if taxId is present and vice versa. [BigDecimal format](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/math/BigDecimal.html#%3Cinit%3E(java.lang.String))
        taxIncluded:
          type: boolean
          description: if true it means that tax amount is already incorporated into unitPrice. If false it means that
            this amount will be added on top of unit price. Present if taxId is present and vice versa
        total:
          type: string
          format: number
          description: Total amount for this line item. [BigDecimal format](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/math/BigDecimal.html#%3Cinit%3E(java.lang.String))
        pricingCategoryId:
          type: integer
          format: int64
          description: If this line item was the cause of a pricing category booked (either as extra, pickup, dropoff or
            standalone product), this will point to pricing category id. Absent if per-booking etc.
        extraId:
          type: integer
          format: int64
          description: If this line item was the cause of an extra being booked, this will point to extra id
        pickup:
          type: boolean
          description: If this line item was the cause of a pickup being booked, this will be set to true. Otherwise false
        dropoff:
          type: boolean
          description: If this line item was the cause of a dropoff being booked, this will be set to true. Otherwise false
        rateId:
          type: integer
          format: int64
          description: This will point to the rate ID booked, if the line item is applicable to a rate (as opposed
            to e.g. custom fees etc)
        commissionPercentage:
          type: string
          format: number
          description: Commission percentage for this line item. Pertains to `SellerInvoiceDto`, `AgentInvoiceDto` and
            `AffiliateInvoiceDto` objects only, otherwise null/absent. [BigDecimal format](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/math/BigDecimal.html#%3Cinit%3E(java.lang.String))
        commissionAmount:
          type: string
          format: number
          description: Commission amount for this line item. Pertains to `SellerInvoiceDto`, `AgentInvoiceDto` and
            `AffiliateInvoiceDto` objects only, otherwise null/absent. [BigDecimal format](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/math/BigDecimal.html#%3Cinit%3E(java.lang.String))
        experienceId:
          type: integer
          format: int64
          description: refers to experience product id in Bokun if this line item relates to it directly or indirectly
            (e.g. adult ticket or extra or pickup was purchased which is part of relevant experience product)
        experienceExternalId:
          type: string
          description: refers to experience product external id if this line item relates to it directly or indirectly
            (e.g. adult ticket or extra or pickup was purchased which is part of relevant experience product)
        giftCardId:
          type: integer
          format: int64
          description: refers to gift card product id in Bokun if a gift card was booked
        experienceBookingId:
          type: integer
          format: int64
          description: refers to experience booking ID (aka Activity booking ID) if available

    IdExternalIdDto:
      type: object
      description: this object wraps id (of some entity, type depends on context) as well as external id. External id refers to id on another platform than Bokun
        but allows referencing it as a convenience. At least one of `id`, `externalId` must be passed. In most cases, passing both IDs is OK as long as they 
        refer to the same object.
      properties:
        id:
          type: integer
          format: int64
        externalId:
          type: string

    LocalDateDto:
      type: object
      description: defines date without time zone.
      required:
        - year
        - month
        - dayOfMonth
      properties:
        year:
          type: integer
          format: int32
          minimum: 0
        month:
          $ref: '#/components/schemas/MonthDto'
        dayOfMonth:
          type: integer
          format: int32
          minimum: 1
          maximum: 31

    LocalDateTimeDto:
      type: object
      description: wrapper for `LocalDateDto` / `LocalTimeDto`
      required:
        - date
        - time
      properties:
        date:
          $ref: '#/components/schemas/LocalDateDto'
        time:
          $ref: '#/components/schemas/LocalTimeDto'

    LocalTimeDto:
      type: object
      description: defines time without time zone.
      required:
        - hour
        - minute
        - second
      properties:
        hour:
          description: hour of the day, 24 hr format
          type: integer
          format: int32
          minimum: 0
          maximum: 23
        minute:
          description: minute of hour
          type: integer
          format: int32
          minimum: 0
          maximum: 59
        second:
          description: second of minute
          type: integer
          format: int32
          minimum: 0
          maximum: 59

    MarketplaceVendorDto:
      type: object
      description: a lightweight representation of a vendor object, designed to be used for marketplace purposes.
        Contains details such as company address, code, VAT - things you'd need for issuing invoices.
      required:
        - id
        - title
        - company
        - timeZone
      properties:
        id:
          type: integer
          format: int64
          description: ID of this vendor
        title:
          type: string
          description: title (aka name) of this company in the Bokun marketplace
        description:
          type: string
          description: vendor description, as filled by vendor themselves
          maxLength: 255
        company:
          $ref: '#/components/schemas/CompanyDto'
        timeZone:
          format: string
          description: IANA/Olson style time zone of this vendor. Note that products might have this overridden.
          example: '"Europe/Vilnius", "PST", "UTC"'
        websiteUrl:
          format: string
          description: URL of the public website for this vendor
        tripadvisorUrl:
          format: string
          description: URL of the public website for this vendor on TripAdvisor
        facebookUrl:
          format: string
          description: URL of the public website for this vendor on Facebook
        instagramUrl:
          format: string
          description: URL of the public website for this vendor on Instagram
        linkedinUrl:
          format: string
          description: URL of the public website for this vendor on LinkedIn
        trustpilotUrl:
          format: string
          description: URL of the public website for this vendor on Trustpilot
        twitterUrl:
          format: string
          description: URL of the public website for this vendor on Twitter

    MonthDto:
      type: string
      enum:
        - JANUARY
        - FEBRUARY
        - MARCH
        - APRIL
        - MAY
        - JUNE
        - JULY
        - AUGUST
        - SEPTEMBER
        - OCTOBER
        - NOVEMBER
        - DECEMBER

    OpeningHoursDto:
      type: object
      required:
        - monday
        - tuesday
        - wednesday
        - thursday
        - friday
        - saturday
        - sunday
      properties:
        id:
          type: integer
          format: int64
        monday:
          $ref: '#/components/schemas/OpeningHoursWeekdayDto'
        tuesday:
          $ref: '#/components/schemas/OpeningHoursWeekdayDto'
        wednesday:
          $ref: '#/components/schemas/OpeningHoursWeekdayDto'
        thursday:
          $ref: '#/components/schemas/OpeningHoursWeekdayDto'
        friday:
          $ref: '#/components/schemas/OpeningHoursWeekdayDto'
        saturday:
          $ref: '#/components/schemas/OpeningHoursWeekdayDto'
        sunday:
          $ref: '#/components/schemas/OpeningHoursWeekdayDto'
      discriminator:
        propertyName: ignored

    OpeningHoursWeekdayDto:
      type: object
      required:
        - open24Hours
      properties:
        open24Hours:
          type: boolean
          description: true if this establishment is open for the entire day, false otherwise
        timeIntervals:
          type: array
          items:
            $ref: '#/components/schemas/OpeningHoursTimeIntervalDto'

    OpeningHoursTimeIntervalDto:
      type: object
      required:
        - openForHours
        - openForMinutes
        - openFrom
      properties:
        id:
          type: integer
          format: int64
        openFrom:
          $ref: '#/components/schemas/LocalTimeDto'
        openForHours:
          type: integer
          format: int32
          maximum: 23
          minimum: 0
          description: Specifies for how many hours is open. This is added to openFrom along with openForMinutes to get the closing time.
        openForMinutes:
          type: integer
          format: int32
          maximum: 59
          minimum: 0
          description: Specifies for how many minutes is open. This is added to openFrom along with openForHours to get the closing time.

    PagedListDto:
      type: object
      required:
        - pageNo
        - pageSize
        - totalPageCount
        - totalCount
      properties:
        pageNo:
          type: integer
          format: int32
          description: page number, zero based
          minimum: 0
        pageSize:
          type: integer
          format: int32
          description: page size (how many items in a single page)
          minimum: 1
          maximum: 100
        totalPageCount:
          type: integer
          format: int32
          description: how many pages are there in total?
          minimum: 0
        totalCount:
          type: integer
          format: int32
          description: how many rows are there in total?
          minimum: 0

    PassExpiryTypeDto:
      type: string
      enum:
        - NEVER
#        description: The pass is forever valid
        - FIXED_DATE
#        description: The pass is valid until a fixed date as specified in the settings.
        - RELATIVE_DATE
#        description: The pass is valid for a period relative to the purchase date (e.g. for 1 year after purchase).

    PaymentTypeDto:
      type: string
      enum:
        - WEB_PAYMENT
        - POINT_OF_SALE
        - CASH
        - VOUCHER
        - GIFT_CARD
        - ROOM_CHARGE
        - BANK_TRANSFER
        - POS_TERMINAL

    PhotoDto:
      type: object
      properties:
        id:
          type: integer
          format: int64
          description: ID of this photo
        originalUrl:
          type: string
          description: URL of the photo, if original image is to be retrieved. Derived files are meant to use different 
            URLs which provide near-instant access to transformed (resized, cropped, etc.) invariants. Note that this 
            attribute is read only - one can not create nor update the URL using the same endpoint which creates or 
            updates photo metadata as file upload handling is done separately. Passing the same value is OK.
          maxLength: 255
        url:
          type: string
          description: The URL to use for the end user. Typically this is the URL given by the CDN provider.
            Make sure that this URL is never cached as it may change without further notice. The property can
            only be retrieved and never set.
          maxLength: 255
        caption:
          type: string
          description: caption for this photo
          maxLength: 255
        alternateText:
          type: string
          description: visually impaired users using screen readers will be read an alt attribute to better understand 
            an image
          maxLength: 255
        height:
          type: integer
          description: height of this picture, in pixels (if available)
          format: int32
          maximum: 10000
        width:
          type: integer
          description: width of this picture, in pixels (if available)
          format: int32
          maximum: 10000

    PickupPriceRuleDto:
      allOf:
        - $ref: '#/components/schemas/CommonPriceRuleDto'
        - type: object

    PricingCategoriesPagedListDto:
      allOf:
        - $ref: '#/components/schemas/PagedListDto'
        - type: object
          required:
            - items
          properties:
            items:
              type: array
              items:
                $ref: '#/components/schemas/PricingCategoryDto'

    PricingCategoryDto:
      type: object
      required:
        - id
        - title
        - ticketCategory
        - occupancy
        - ageQualified
        - dependent
        - internalUseOnly
        - sumDependentCategories
      properties:
        id:
          type: integer
          format: int64
          description: ID of this pricing category
        title:
          type: string
          description: title for this pricing category object
          maxLength: 255
        ticketCategory:
          $ref: '#/components/schemas/TicketCategoryDto'
        occupancy:
          type: integer
          format: int32
          description: |-
            For `TicketCategory.GROUP`:
              * 0: reserve as many seats per group as there are passengers booked
              * more than 0: reserve as many seats per group as `groupSize`(this attribute is then expected to match `groupSize`)

            For all other ticket categories: reserve as many seats per passenger as specified in this attribute
        groupSize:
          type: integer
          format: int32
          description: mandatory if `ticketCategory == GROUP`, otherwise should be absent
        ageQualified:
          type: boolean
        minAge:
          type: integer
          format: int32
          description: mandatory if `ageQualified=true`, otherwise should be absent
          minimum: 0
        maxAge:
          type: integer
          format: int32
          description: mandatory if `ageQualified=true`, otherwise should be absent
          minimum: 0
        dependent:
          type: boolean
          description: if true, this pricing category depends on some other (see `masterCategoryId`). In other words, it
            can only be booked if the master category is booked. If false, no dependencies exist.
        masterCategoryId:
          type: integer
          format: int64
          description: set if `dependent` is true. Points to another `PricingCategoryDto::id` which has to be booked in 
            order for this category to be bookable.
        maxPerMaster:
          type: integer
          format: int32
          description: how many seats of this pricing category can be booked for one master category? Mandatory if `masterCategoryId` is set, otherwise should be absent.
        sumDependentCategories:
          type: boolean
          description: if true, a limit (specified via `maxDependentSum`) is enforced when purchasing seats for child categories.
        maxDependentSum:
          type: integer
          format: int32
          description: must be specified if `sumDependentCategories` is true, otherwise should be absent.
        internalUseOnly:
          type: boolean
          description: if set, this category can only be booked directly by the supplier and not resold through marketplace or OTAs

    PriceCatalogsPagedListDto:
      allOf:
        - $ref: '#/components/schemas/PagedListDto'
        - type: object
          required:
            - items
          properties:
            items:
              type: array
              items:
                $ref: '#/components/schemas/PriceCatalogDto'

    PriceCatalogDto:
      type: object
      required:
        - title
      properties:
        id:
          type: integer
          format: int64
          description: id of this price catalog
        title:
          type: string
          description: title of this price catalog
          maxLength: 255
        defaultPriceCatalog:
          type: boolean
          description: true if this price catalog is the default for this vendor, false otherwise

    PriceScheduleDto:
      type: object
      required:
        - id
        - title
        - creationDate
        - recurrenceRule
      properties:
        id:
          type: integer
          format: int64
          description: ID of this price schedule
        title:
          type: string
          description: title of this price schedule
        creationDate:
          $ref: '#/components/schemas/TimestampDto'
#          description: Creation date/time of this schedule
        lastModifiedDate:
          $ref: '#/components/schemas/TimestampDto'
#          description: Date/time price schedule was last modified
        recurrenceRule:
          $ref: '#/components/schemas/RecurrenceRuleDto'

    PriceSchedulesPagedListDto:
      allOf:
        - $ref: '#/components/schemas/PagedListDto'
        - type: object
          required:
            - items
          properties:
            items:
              type: array
              items:
                $ref: '#/components/schemas/PriceScheduleDto'

    PriceSchedulesReorderRequestDto:
      type: object
      required:
        - priceScheduleIds
      properties:
        priceScheduleIds:
          type: array
          items:
            type: integer
            format: int64

    PromoCodeDto:
      type: object
      required:
        - id
        - code
        - perPerson
        - validForAllProducts
      properties:
        id:
          type: integer
          format: int64
          description: ID of this promo code
        code:
          type: string
          description: promo code itself. Used by the customers during the checkout process.
            Must be unique among all promo codes for any given vendor although duplicates can exist among deleted codes.
            Note that the code will be uppercased automatically (if not yet) on insertion.
          maxLength: 32
        description:
          type: string
          description: some description for this code.
          maxLength: 140
        discountPercentage:
          type: number
          format: double
          description: discount percentage for this code. 0% means no discount, 100% means full discount.
            Either all of (`discountPercentage`; `discountPercentageAppliesToExtras`; `discountPercentageAppliesToPickupAndDropoff`) or 
            all of (`discountAmount`; `discountAmountCurrency`; `discountAmountPerPerson`) must be present
          minimum: 0
          maximum: 100
        discountPercentageAppliesToExtras:
          type: boolean
          description: if true, this promo code will be eligible for extras purchased with this booking. False otherwise.
            Either all of (`discountPercentage`; `discountPercentageAppliesToExtras`; `discountPercentageAppliesToPickupAndDropoff`) or
            all of (`discountAmount`; `discountAmountCurrency`; `discountAmountPerPerson`) must be present
        discountPercentageAppliesToPickupAndDropoff:
          type: boolean
          description: if true, this promo code will be eligible for pickups and/or drop offs purchased with this booking. False otherwise.
            Either all of (`discountPercentage`; `discountPercentageAppliesToExtras`; `discountPercentageAppliesToPickupAndDropoff`) or
            all of (`discountAmount`; `discountAmountCurrency`; `discountAmountPerPerson`) must be present
        discountAmount:
          type: number
          format: double
          description: fixed amount discount to be used for this code. 0 means no discount.
            Either all of (`discountPercentage`; `discountPercentageAppliesToExtras`; `discountPercentageAppliesToPickupAndDropoff`) or
            all of (`discountAmount`; `discountAmountCurrency`; `discountAmountPerPerson`) must be present
          minimum: 0
        discountAmountCurrency:
          type: string
          description: currency for `discountAmount` attribute. Must be a valid ISO 4217 currency code. Also check if
            the entered currency is supported by Bokun before using it for promo code creation/edit.
            Either all of (`discountPercentage`; `discountPercentageAppliesToExtras`; `discountPercentageAppliesToPickupAndDropoff`) or
            all of (`discountAmount`; `discountAmountCurrency`; `discountAmountPerPerson`) must be present
        discountAmountPerPerson:
          type: boolean
          description: if true, the promo code discount amount will be applied once per each passenger. If false, the promotion will be applied once per entire booking.
            Either all of (`discountPercentage`; `discountPercentageAppliesToExtras`; `discountPercentageAppliesToPickupAndDropoff`) or
            all of (`discountAmount`; `discountAmountCurrency`; `discountAmountPerPerson`) must be present
        bookingValidFrom:
          type: string
          format: date
          description: if specified, this will make this promo code eligible if booked from (and including) the specified date
        bookingValidTo:
          type: string
          format: date
          description: if specified, this will make this promo code eligible if booked up to (and including) the specified date
        travelValidFrom:
          type: string
          format: date
          description: if specified, this will make this promo code eligible if travelling from (and including) the specified date
        travelValidTo:
          type: string
          format: date
          description: if specified, this will make this promo code eligible if travelling up to (and including) the specified date
        travelValidDaysOfWeek:
          type: array
          description: which days of week are eligible for this promo code? Empty array means all days.
          items:
              $ref: '#/components/schemas/DayOfWeekDto'
        travelValidMonths:
          type: array
          description: which months are eligible for this promo code? Empty array means all months.
          items:
            $ref: '#/components/schemas/MonthDto'
        maxUsages:
          type: integer
          format: int32
          description: if specified, will limit how many times this promo code can be used
        validForAllProducts:
          type: boolean
          description: if set to true, this promo code will apply to all products. Otherwise it will apply to selected products only
        validForProducts:
          type: array
          items:
            type: integer
            format: int64
            description: non-deleted experience product ID

    PromoCodesPagedListDto:
      allOf:
        - $ref: '#/components/schemas/PagedListDto'
        - type: object
          required:
            - items
          properties:
            items:
              type: array
              items:
                $ref: '#/components/schemas/PromoCodeDto'

    RecurrenceRuleDto:
      type: object
      properties:
        startDate:
          type: string
          format: date
          description: when does this recurrence rule start (year/month/day of month)
        endDate:
          type: string
          format: date
          description: when does this recurrence rule stop (year/month/day of month). Optional.
        byWeekday:
          type: array
          description: on which days of week does this event occur? If omitted, it is assumed it occurs on every day of the week.
            Note this works in conjunction with byMonth. If both are defined, the result will be conjunction of these sets.
          items:
            $ref: '#/components/schemas/DayOfWeekDto'
        byMonth:
          type: array
          description: on which days of month does this event occur? If omitted, it is assumed it occurs on every day of the month.
            Note this works in conjunction with byWeekday. If both are defined, the result will be conjunction of these sets.
          items:
            $ref: '#/components/schemas/MonthDto'
    # disabled: interval, bySetPos, byMonthDay, byYearDay, byHour and byMinute are not supported in the UI currently and setting such rule would break the UI

    ResourceAllocationPolicyDto:
      type: string
      enum:
        - ROUND_ROBIN
        - ORDERLY
        - EMPTY_THEN_STICK
        - EMPTY_THEN_PRIVATE
        - MANUAL

    ResourceAssignmentDto:
      allOf:
        - $ref: '#/components/schemas/ResourceBookingDto'
        - type: object
          required:
            - startTimeId
          properties:
            startTimeId:
              type: integer
              format: int64
              description: ID of start time booked (refers to `ExperienceStartTimeDto::id`)
            experienceId:
              type: integer
              format: int64
              description: ID of experience product booked (refers to `ExperienceComponentsDto::id`)

    ResourceBookingDto:
      type: object
      required:
        - pricingCategoryBookingId
        - resourcePoolId
        - resourceId
      properties:
        id:
          type: integer
          format: int64
          description: ID of this resource booking
        pricingCategoryBookingId:
          type: integer
          format: int64
          description: ID of linked pricing category booking (which in turns refers to product booking)
        resourcePoolId:
          type: integer
          format: int64
          description: ID of booked resource pool
        resourceId:
          type: integer
          format: int64
          description: ID of booked resource

    ResourceDto:
      type: object
      required:
        - title
        - capacity
        - resourcePoolIds
      properties:
        id:
          type: integer
          format: int64
          description: ID of this resource
        title:
          type: string
          description: title of this resource
          maxLength: 255
        capacity:
          type: integer
          format: int32
          minimum: 0
          description: how many (seats, passengers, etc.) can this resource handle at any given time slot?
        created:
          $ref: '#/components/schemas/TimestampDto'
        lastModified:
          $ref: '#/components/schemas/TimestampDto'
        resourcePoolIds:
          type: array
          items:
            type: integer
            format: int64
        userId:
          type: integer
          format: int64
          description: if this resource is associated to an extranet user, this field will be initialized with the extranet user id, otherwise empty/omitted

    ResourcePoolPagedListDto:
      allOf:
        - $ref: '#/components/schemas/PagedListDto'
        - type: object
          required:
            - items
          properties:
            items:
              type: array
              items:
                $ref: '#/components/schemas/ResourcePoolDto'

    ResourcePagedListDto:
      allOf:
        - $ref: '#/components/schemas/PagedListDto'
        - type: object
          required:
            - items
          properties:
            items:
              type: array
              items:
                $ref: '#/components/schemas/ResourceDto'

    BaseExperienceBookingNoteDto:
      type: object
      required:
        - text
      properties:
        text:
          type: string
          description: The text content of this note
          maxLength: 255

    UpdateExperienceBookingNoteRequestDto:
      allOf:
        - $ref: '#/components/schemas/BaseExperienceBookingNoteDto'

    ExperienceBookingNoteRequestDto:
      allOf:
        - $ref: '#/components/schemas/BaseExperienceBookingNoteDto'
        - type: object
          required:
            - type
          properties:
            type:
              $ref: '#/components/schemas/ExperienceBookingNoteTypeDto'

    ExperienceBookingNoteResponseDto:
      allOf:
        - $ref: '#/components/schemas/BaseExperienceBookingNoteDto'
        - type: object
          required:
            - id
            - owner_id
            - type
          properties:
            id:
              type: integer
              format: int64
              description: The ID of this experience booking note
            owner_id:
              type: integer
              format: int64
              description: The ID of the owner of the experience booking note
            type:
              $ref: '#/components/schemas/ExperienceBookingNoteTypeDto'

    ExperienceBookingNoteTypeDto:
      type: string
      enum:
        - GENERAL
        - FINANCE
        - OPERATIONS

    ResourcePoolDto:
      type: object
      required:
        - title
        - resources
        - links
        - resourceIds
      properties:
        id:
          type: integer
          format: int64
          description: ID of this resource pool
        title:
          type: string
          description: title of this resource pool
          maxLength: 255
        created:
          $ref: '#/components/schemas/TimestampDto'
        lastModified:
          $ref: '#/components/schemas/TimestampDto'
        resourceIds:
          type: array
          items:
            type: integer
            format: int64
            description: ID of resources linked to this pool
        links:
          type: array
          items:
            $ref: '#/components/schemas/ResourcePoolLinkDto'

    ResourcePoolLinkDto:
      type: object
      description: Resource link object maintains the link between one resource pool and one start time, plus resource allocation 
        settings for this particular link. As this object is designed to be embedded inside ResourcePool, it doesn't duplicate it's id.
      required:
        - experienceStartTimeId
        - allocationPolicy
      properties:
        experienceStartTimeId:
          type: integer
          format: int64
          description: ID of connected start time
        allocationPolicy:
          $ref: '#/components/schemas/ResourceAllocationPolicyDto'

    RoundingModeDto:
      type: string
      description: |
        This object mimics Java's `java.math.RoundingMode`:
        * `UP` - Rounding mode to round away from zero. Always increments the digit prior to a non-zero discarded 
          fraction. Note that this rounding mode never decreases the magnitude of the calculated value.
        * `DOWN` - Rounding mode to round towards zero. Never increments the digit prior to a discarded fraction (i.e., 
          truncates). Note that this rounding mode never increases the magnitude of the calculated value.
        * `CEILING` - Rounding mode to round towards positive infinity. If the result is positive, behaves as for `UP`; 
          if negative, behaves as for `DOWN`. Note that this rounding mode never decreases the calculated value.
        * `FLOOR` - Rounding mode to round towards negative infinity. If the result is positive, behave as for `DOWN`; 
          if negative, behave as for `UP`. Note that this rounding mode never increases the calculated value.
        * `HALF_UP` - Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which 
          case round up. Behaves as for `UP` if the discarded fraction is ≥ 0.5; otherwise, behaves as for `DOWN`. Note 
          that this is the rounding mode commonly taught at school.
        * `HALF_DOWN` - Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in 
          which case round down. Behaves as for `UP` if the discarded fraction is > 0.5; otherwise, behaves as for 
          `DOWN`.
        * `HALF_EVEN` - Rounding mode to round towards the "nearest neighbor" unless both neighbors are equidistant, in 
          which case, round towards the even neighbor. Behaves as for `HALF_UP` if the digit to the left of the 
          discarded fraction is odd; behaves as for `HALF_DOWN` if it's even. Note that this is the rounding mode that 
          statistically minimizes cumulative error when applied repeatedly over a sequence of calculations. It is 
          sometimes known as "Banker's rounding," and is chiefly used in the USA.
        * `UNNECESSARY` - Rounding mode to assert that the requested operation has an exact result, hence no rounding 
          is necessary.
      enum:
        - UP
        - DOWN
        - CEILING
        - FLOOR
        - HALF_UP
        - HALF_DOWN
        - HALF_EVEN
        - UNNECESSARY

    SeasonalOpeningHoursDto:
      allOf:
        - $ref: '#/components/schemas/OpeningHoursDto'
        - type: object
          required:
            - startMonth
            - startDay
            - endMonth
            - endDay
          properties:
            startYear:
              type: integer
              format: int32
              description: when does this period start (year)? Optional if starts on certain month/day every year.
            startMonth:
              type: integer
              format: int32
              description: when does this period start (month)?
              minimum: 1
              maximum: 12
            startDay:
              type: integer
              format: int32
              description: when does this period start (day of month)?
              minimum: 1
              maximum: 31
            endYear:
              type: integer
              format: int32
              description: when does this period end (year)? Optional if ends on certain month/day every year.
            endMonth:
              type: integer
              format: int32
              description: when does this period end (month)?
              minimum: 1
              maximum: 12
            endDay:
              type: integer
              format: int32
              description: when does this period end (day of month)?
              minimum: 1
              maximum: 31

    SellerInvoiceDto:
      allOf:
        - $ref: '#/components/schemas/CommonInvoiceDto'
        - type: object
          required:
            - issuerVendorId
            - recipientVendorId
          properties:
            reconciledAt:
              $ref: '#/components/schemas/TimestampDto'
#              description: if this seller invoice was reconciled, this field will contain the reconciliation date and time.
            issuerVendorId:
              type: integer
              format: int64
              description: ID of the vendor (MarketplaceVendorDto::ID) who has issued this invoice
            recipientVendorId:
              type: integer
              format: int64
              description: ID of the vendor (MarketplaceVendorDto::ID) who is the recipient of this invoice

    StandardErrorDto:
      type: object
      required:
        - error
      properties:
        error:
          type: string
          description: Error text

    TaxesPagedListDto:
      allOf:
        - $ref: '#/components/schemas/PagedListDto'
        - type: object
          required:
            - items
          properties:
            items:
              type: array
              items:
                $ref: '#/components/schemas/TaxDto'

    TaxDto:
      type: object
      required:
        - id
        - title
        - included
        - roundingMode
        - percentage
        - components
      properties:
        id:
          type: integer
          format: int64
          description: ID of this tax
        title:
          type: string
          description: title for this tax object
        included:
          type: boolean
          description: true if this tax object is inclusive (tax amount is already included when displaying rack rate
            price), false if excluded (tax amount is added on top at later booking stages)
        roundingMode:
          $ref: '#/components/schemas/RoundingModeDto'
        percentage:
          type: string
          format: number
          description: Overall tax percentage value, computed from all components. [BigDecimal format](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/math/BigDecimal.html#%3Cinit%3E(java.lang.String))
        components:
          type: array
          description: tax components which make up the overall total percentage
          items:
            $ref: '#/components/schemas/TaxDtoComponents'

    TaxDtoComponents:
      type: object
      required:
        - id
        - title
        - percentage
        - compounding
      properties:
        id:
          type: integer
          format: int64
          description: ID of this tax component
        title:
          type: string
          description: title of this tax component
        percentage:
          type: string
          format: number
          description: Percentage of this tax component. [BigDecimal format](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/math/BigDecimal.html#%3Cinit%3E(java.lang.String))
        compounding:
          type: boolean
          description: if true, this tax component will be used by summing up this particular component. For
            example if tax is made of two 10% *non-compound* components, the overall percentage is `10% + 10% =
            20%`. If false, the total percentage is calculated by applying percentage of top of each other. For
            example if tax is made of two 10% *compound* components, the overall percentage is
            `(100 * 1.1) * 1.1 = 121`, or 21%. This flag only makes any difference if more than one such flag is
            present.

    TicketCategoryCommissionDto:
      type: object
      description: keys are strings limited to `TicketCategoryDto` type. Values are strings of [BigDecimal format](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/math/BigDecimal.html#%3Cinit%3E(java.lang.String)).
      properties:
        keyType:
          $ref: '#/components/schemas/TicketCategoryDto'
      additionalProperties:
        type: string
        format: number
        description: see [BigDecimal](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/math/BigDecimal.html#%3Cinit%3E(java.lang.String))

    TicketCategoryDto:
      type: string
      enum:
        - ADULT
        - CHILD
        - TEENAGER
        - INFANT
        - SENIOR
        - STUDENT
        - MILITARY
        - GROUP
        - OTHER

    TimestampDto:
      type: integer
      format: int64
      description: Number of milliseconds since January 1, 1970, 00:00:00 UTC

    VendorContractDto:
      type: object
      required:
        - id
        - creationDate
        - sellerId
        - supplierId
        - status
        - supplierMayCancelBookings
        - supplierMayChangeBookings
        - sellerMayCancelBookings
        - sellerMayChangeBookings
        - contactDetailsHidden
        - products
      properties:
        id:
          type: integer
          format: int64
          example: 10
        creationDate:
          $ref: '#/components/schemas/TimestampDto'
#          description: Creation date/time of this contract
        lastModifiedDate:
          $ref: '#/components/schemas/TimestampDto'
#          description: Date/time contract was last modified
        lastAcceptedDate:
          $ref: '#/components/schemas/TimestampDto'
#          description: Date/time contract was last accepted by both parties (seller and supplier). Absent or null if never accepted
        lastCancelledDate:
          $ref: '#/components/schemas/TimestampDto'
#          description: Date/time contract was last cancelled by either party (seller or supplier). Absent or null if never cancelled
        sellerId:
          type: integer
          format: int64
#          description: Vendor ID who acts as a seller in reference of this contract.
          example: 144
        supplierId:
          type: integer
          format: int64
#          description: Vendor ID who acts as a supplier in reference of this contract.
          example: 144
        status:
          $ref: '#/components/schemas/VendorContractStatusDto'
#          description: Returns contract status.
        amendmentStatus:
          $ref: '#/components/schemas/VendorContractStatusDto'
#          description: If this contract has/had an amendment proposal, this field will provide a reference to its last amendment status. If this contract never had any amendment(s), this field will be null.
        supplierMayCancelBookings:
          $ref: '#/components/schemas/AllowedChangeIntervalDto'
        supplierMayChangeBookings:
          $ref: '#/components/schemas/AllowedChangeIntervalDto'
        sellerMayCancelBookings:
          $ref: '#/components/schemas/AllowedChangeIntervalDto'
        sellerMayChangeBookings:
          $ref: '#/components/schemas/AllowedChangeIntervalDto'
        contactDetailsHidden:
          type: boolean
          description: Whether customer contacts are made available for supplier at the time of booking (true) or
            later/never (false)
        contactDetailsHiddenUntilDays:
          type: integer
          format: int32
          description: If contactDetailsHidden=false, this may indicate that contact details are not made available
            instantly after the booking but X days before travel date instead. If this value is null, contact details are not shared at all.
          example: 1
        currency:
          type: string
          minLength: 3
          maxLength: 3
          description: ISO 4217 currency code. The currency used to settle payments between seller/supplier once a
            product is resold. Present if the contract has been accepted / terms agreed, otherwise absent/null.
        products:
          type: array
          items:
            type: integer
            format: int64
          description: array of experience product IDs that are made sellable by this supplier to the reseller as part
            of this contract. Array is always present but is only populated if the contract has been accepted / terms have been agreed.

    VendorContractStatusDto:
      type: string
      enum:
        - PROPOSED_BY_SELLER
        - PROPOSED_BY_SUPPLIER
        - TERMS_REQUESTED_BY_SELLER
        - REJECTED_BY_SELLER
        - REJECTED_BY_SUPPLIER
        - ACCEPTED
        - CANCELLED_BY_SELLER
        - CANCELLED_BY_SUPPLIER
        - ABORTED_BY_SELLER
        - ABORTED_BY_SUPPLIER
        - TIMEOUT
        - FROZEN

    VideoDto:
      type: object
      required:
        - id
        - sourceUrl
      properties:
        id:
          type: integer
          format: int64
          example: 10
        sourceUrl:
          type: string
          description: URL of the video. Note that currently only YouTube and Vimeo URLs are supported
          maxLength: 255

  securitySchemes:
    AccessKey:
      type: apiKey
      name: access-key
      in: header
    SecretKey:
      type: apiKey
      name: secret-key
      in: header

security:
  - AccessKey: []
    SecretKey: []
