x-explorer-enabled: false
openapi: 3.0.3
servers:
  - url: 'https://pos.uk.eagleeye.com/2.0'
    description: UK Production
info:
  version: 1.2.1
  title: Message At Till API
  description: |
    # Message At Till
    This API allows apps to request extra information from EES AIR. It can be shown on a till screen or printed on customer receipts. EES AIR uses external data to create these messages.
    The API also helps apps report if a message printed correctly. AIR updates the message status, indicating if it printed successfully. This helps track important messages and ensures smooth communication.

paths:
  /connect/messages:
    post:
      summary: Create
      operationId: retrieveMessagesAtTill
      tags:
        - Message At Till
      description: >-
        This API endpoint allows the calling application to request a set of additional information from EES AIR. These Messages could then be displayed on a Till screen, printed on a Consumer receipt, etc. EES AIR uses configurations or even data from external systems to construct returned Messages.
      requestBody:
        $ref: '#/components/requestBodies/messagesPayload'
      parameters:
        - $ref: '#/components/parameters/httpAcceptEncodingRequest'
        - $ref: '#/components/parameters/httpConnectionRequest'
        - $ref: '#/components/parameters/httpContentTypeRequest'
        - $ref: '#/components/parameters/eesAuthenticationClientId'
        - $ref: '#/components/parameters/eesAuthenticationRequestHash'
        - $ref: '#/components/parameters/eesMessageId'
        - $ref: '#/components/parameters/customSubsystemId'
        - $ref: '#/components/parameters/customWildCard'
      responses:
        200:
          $ref: '#/components/responses/messagesResponsePayload'
        400:
          $ref: '#/components/responses/error400Response'
        401:
          $ref: '#/components/responses/error401Response'
        403:
          $ref: '#/components/responses/error403Response'
        404:
          $ref: '#/components/responses/error404Response'
        409:
          $ref: '#/components/responses/error409Response'
        415:
          $ref: '#/components/responses/error415Response'
        429:
          $ref: '#/components/responses/error429Response'
        500:
          $ref: '#/components/responses/error500Response'
        503:
          $ref: '#/components/responses/error503Response'
        504:
          $ref: '#/components/responses/error504Response'

  /connect/messages/report:
    post:
      summary: Report Status
      operationId: reportMessagesAtTill
      tags:
        - Message At Till
      description: This API allows the calling application to report back on the print status of requested Messages. AIR needs to update the Message record based on the print status e.g whether a Message has printed successfully or not.
      requestBody:
        $ref: '#/components/requestBodies/messageReportPayload'
      parameters:
        - $ref: '#/components/parameters/httpAcceptEncodingRequest'
        - $ref: '#/components/parameters/httpConnectionRequest'
        - $ref: '#/components/parameters/httpContentTypeRequest'
        - $ref: '#/components/parameters/eesAuthenticationClientId'
        - $ref: '#/components/parameters/eesAuthenticationRequestHash'
        - $ref: '#/components/parameters/eesMessageId'
        - $ref: '#/components/parameters/customSubsystemId'
        - $ref: '#/components/parameters/customWildCard'
      responses:
        200:
          $ref: '#/components/responses/messageReportResponsePayload'
        207:
          $ref: '#/components/responses/message207Response'
        400:
          $ref: '#/components/responses/error400Response'
        401:
          $ref: '#/components/responses/error401Response'
        403:
          $ref: '#/components/responses/error403Response'
        404:
          $ref: '#/components/responses/error404Response'
        409:
          $ref: '#/components/responses/error409Response'
        415:
          $ref: '#/components/responses/error415Response'
        429:
          $ref: '#/components/responses/error429Response'
        500:
          $ref: '#/components/responses/error500Response'
        503:
          $ref: '#/components/responses/error503Response'
        504:
          $ref: '#/components/responses/error504Response'

components:
  schemas:
    walletAccountEntity:
      type: object
      required:
        - accountId
        - walletId
        - campaignId
        - type
        - clientType
        - status
        - state
        - dates
        - meta
        - balances
        - dateCreated
        - lastUpdated
      description: The Wallet Account object.
      properties:
        accountId:
          type: string
          format: string
          description: EES AIR Wallet Account ID
          example: '20081'
        walletId:
          type: string
          format: string
          description: EES AIR Wallet ID
          example: '1178'
        campaignId:
          type: string
          description: >-
            The Campaign ID (Scheme ID, Programme ID or Plan ID) this Wallet
            Account belongs to.
          example: '3001'
        type:
          type: string
          description: EES AIR Wallet Account Type.
          enum:
            - ECOUPON
            - VOUCHER
            - STAMP_CARD
            - PAPER
            - DEBIT
            - PLASTIC
            - POINTS
            - BASIC_SUBSCRIPTION
            - CONTINUITY
          example: ECOUPON
        clientType:
          type: string
          description: Account client type.
          example: null
        status:
          type: string
          description: Account status
          enum:
            - ACTIVE
            - BLOCKED
            - CANCELLED
            - DELETED
            - EXPIRED
            - INACTIVE
            - INVALIDATED
            - LOCKED
            - STOLEN
            - USED
          example: ACTIVE
        state:
          type: string
          description: >-
            Account state, managed per retailer base, list of possible enum
            values could be set-up as part of the Onboarding process.
          example: null
        dates:
          $ref: '#/components/schemas/datesEntity'
        meta:
          $ref: '#/components/schemas/metaEntity'
        balances:
          $ref: '#/components/schemas/accountBalancesEntity'
        dateCreated:
          description: Date this Account was created
          type: string
          format: date-time
        lastUpdated:
          description: Date this Account was last updated
          type: string
          format: date-time

    campaignAccountEnrichment:
      type: object
      required:
        - enrichmentType
        - campaignName
        - campaignReference
        - qualifier
        - reward
      properties:
        enrichmentType:
          type: string
          enum:
            - COUPON
        campaignName:
          type: string
          format: string
          description: Campaign Name
        campaignReference:
          type: string
          format: string
          description: Campaign Reference
        qualifier:
          type: array
          nullable: true
          items:
            type: object
            description: TBC (reserved for future use)
        token:
          type: string
          format: string
          description: Token
          nullable: true
        reward:
          type: object
          nullable: true
          required:
            - offerId
            - offerName
            - posReference
          properties:
            offerId:
              type: string
              format: string
              description: Offer ID
              nullable: true
            offerName:
              type: string
              format: string
              description: Offer Name
              nullable: true
            posReference:
              type: string
              format: string
              description: Offer reference (Promo Id)
              nullable: true
        custom:
          description: Configured custom form fields in key-value pair format, grouped by form
          nullable: true
          type: object
        restrictions:
          type: object
          properties:
            limits:
              type: object
              properties:
                period:
                  type: array
                  items:
                    type: object
                    properties:
                      threshold:
                        type: string
                        description: Redemption Restriction Type
                        enum:
                          - LIFETIME
                          - DAY
                          - WEEK
                          - MONTH
                          - YEAR
                      start:
                        type: string
                        format: ees-date-time
                        description: Information when next restriction cycle would start in ATOM date-time format
                        nullable: false
                      limit:
                        type: integer
                        format: int32
                        description: Numeric limit for this Redemption Restriction Type
                        nullable: false
                      used:
                        type: integer
                        format: int32
                        description: Amount of Redemptions for that particular Restriction Type
                        nullable: false
                      remaining:
                        type: integer
                        format: int32
                        description: Remaining Redemptions for that particular Restriction Type
                        nullable: false
                creditsPerPeriod:
                  type: array
                  items:
                    type: object
                    properties:
                      threshold:
                        type: string
                        description: Credit Restriction Type.
                        enum:
                          - ACCOUNT_REWARD_DAY
                          - ACCOUNT_REWARD_WEEK
                      start:
                        type: string
                        format: date-time
                        description: Information when next restriction cycle would start in ATOM date-time format.
                        nullable: false
                      limit:
                        type: integer
                        format: int32
                        description: Numeric limit for this Credit Restriction Type.
                        nullable: false
                      used:
                        type: integer
                        format: int32
                        description: Amount of Credits for that particular Restriction Type.
                        nullable: false
                      remaining:
                        type: integer
                        format: int32
                        description: Remaining Credits for that particular Restriction Type.
                        nullable: false
                rewardsPerPeriod:
                  type: array
                  items:
                    type: object
                    properties:
                      threshold:
                        type: string
                        description: Reward Restriction Type.
                        enum:
                          - ACCOUNT_REWARD_DAY
                          - ACCOUNT_REWARD_UNITS_DAY
                          - ACCOUNT_REWARD_UNITS_WEEK                          -
                          - ACCOUNT_REWARD_MONTH
                          - ACCOUNT_REWARD_UNITS_MONTH
                          - ACCOUNT_REWARD_UNITS_YEAR
                          - ACCOUNT_REWARD_UNITS_LIFETIME
                      start:
                        type: string
                        format: date-time
                        description: Information when next restriction cycle would start in ATOM date-time format.
                        nullable: false
                      limit:
                        type: integer
                        format: int32
                        description: Numeric limit for this Reward Restriction Type.
                        nullable: false
                      used:
                        type: integer
                        format: int32
                        description: Amount of Rewards for that particular Restriction Type.
                        nullable: false
                      remaining:
                        type: integer
                        format: int32
                        description: Remaining Rewards for that particular Restriction Type.
                        nullable: false
        redemptionWindows:
          type: object
          properties:
            rolling:
              type: array
              nullable: true
              items:
                $ref: '#/components/schemas/windowEntity'
            exclusions:
              type: array
              nullable: true
              items:
                $ref: '#/components/schemas/exclusionWindowEntity'

    programmeAccountEnrichment:
      type: object
      required:
        - enrichmentType
        - programmeName
        - programmeReference
      properties:
        enrichmentType:
          type: string
          nullable: false
          enum:
            - PROGRAMME
        programmeName:
          type: string
          format: string
          nullable: false
          description: Programme Name
        programmeReference:
          type: string
          format: string
          nullable: false
          description: Programme Reference
        token:
          type: string
          format: string
          description: Token
          nullable: true

    stampAccountEnrichment:
      type: object
      required:
        - enrichmentType
        - schemeName
        - schemeReference
      properties:
        enrichmentType:
          type: string
          enum:
            - STAMP
        schemeName:
          type: string
          format: string
          description: Scheme Name
        schemeReference:
          type: string
          format: string
          description: Scheme Reference
        properties:
          type: object

    pointsAccountEnrichment:
      type: object
      required:
        - enrichmentType
        - schemeName
        - schemeReference
      properties:
        enrichmentType:
          type: string
          enum:
            - POINTS
        schemeName:
          type: string
          format: string
          description: Scheme Name
        schemeReference:
          type: string
          format: string
          description: Scheme Reference
        properties:
          type: object
          properties:
            redemptionRates:
              type: object
              nullable: true
              description: Scheme Redemption Rates
            goodwill:
              type: object
              nullable: true
              description: Scheme Goodwill
            credit:
              type: object
              nullable: true
              description: Scheme Redemption Rates
            debit:
              type: object
              nullable: true
              description: Scheme Debit
            details:
              type: object
              nullable: true
              description: Scheme Details
            earnRates:
              type: object
              nullable: true
              description: Scheme Earn Rates
            baseEarn:
              type: object
              nullable: true
              description: Scheme Base Earn
            pointsExpiry:
              type: object
              nullable: true
              properties:
                validTo:
                  type: string
                  format: date-time
                  nullable: false
                  description: Time at which the points expire.
                points:
                  type: integer
                  format: int32
                  nullable: false
                  default: 0
                  description: Number of points.

    continuityAccountEnrichment:
      type: object
      required:
        - enrichmentType
        - campaignName
        - campaignReference
      properties:
        token:
          type: string
          nullable: true
          description: The account's token
        qualifier:
          type: object
          description: The campaign's qualifications
          properties:
            continuity:
              type: object
              properties:
                totalTransactionCount:
                  nullable: true
                  type: integer
                  description: The number of transactions required to qualify for this coupon.
                totalTransactionSpend:
                  nullable: true
                  type: integer
                  description: The total spend amount required to qualify for this coupon.
                totalTransactionUnits:
                  nullable: true
                  type: integer
                  description: Account override for totalTransactionUnits - Only valid if campaign uses totalTransactionUnits.
        reward:
          type: object
          nullable: true
          required:
            - offerId
            - offerName
            - posReference
          properties:
            offerId:
              type: string
              format: string
              description: Offer ID
              nullable: true
            offerName:
              type: string
              format: string
              description: Offer Name
              nullable: true
            posReference:
              type: string
              format: string
              description: Offer reference (Promo Id)
              nullable: true
        custom:
          description: Configured custom form fields in key-value pair format, grouped by form
          nullable: true
          type: object
        restrictions:
          type: object
          properties:
            limits:
              type: object
              properties:
                period:
                  type: array
                  items:
                    type: object
                    properties:
                      threshold:
                        type: string
                        description: Redemption Restriction Type
                        enum:
                          - LIFETIME
                          - DAY
                          - WEEK
                          - MONTH
                          - YEAR
                      start:
                        type: string
                        format: ees-date-time
                        description: Information when next restriction cycle would start in ATOM date-time format
                        nullable: false
                      limit:
                        type: integer
                        format: int32
                        description: Numeric limit for this Redemption Restriction Type
                        nullable: false
                      used:
                        type: integer
                        format: int32
                        description: Amount of Redemptions for that particular Restriction Type
                        nullable: false
                      remaining:
                        type: integer
                        format: int32
                        description: Remaining Redemptions for that particular Restriction Type
                        nullable: false
        redemptionWindows:
          type: object
          properties:
            rolling:
              type: array
              nullable: true
              items:
                $ref: '#/components/schemas/windowEntity'
            exclusions:
              type: array
              nullable: true
              items:
                $ref: '#/components/schemas/exclusionWindowEntity'
        enrichmentType:
          type: string
          enum:
            - CONTINUITY
        campaignName:
          type: string
          format: string
          description: Campaign Name.
        campaignReference:
          type: string
          format: string
          description: Campaign Reference.

    accountEnrichmentEntity:
      oneOf:
        - $ref: '#/components/schemas/campaignAccountEnrichment'
        - $ref: '#/components/schemas/programmeAccountEnrichment'
        - $ref: '#/components/schemas/pointsAccountEnrichment'
        - $ref: '#/components/schemas/stampAccountEnrichment'
        - $ref: '#/components/schemas/continuityAccountEnrichment'

    windowEntity:
      type: object
      required:
        - startDay
        - startTime
        - endDay
        - endTime
      properties:
        startDay:
          type: string
          description: Window definition Start Day (Weekday name)
          enum:
            - MONDAY
            - TUESDAY
            - WEDNESDAY
            - THURSDAY
            - FRIDAY
            - SATURDAY
            - SUNDAY
        startTime:
          type: string
          format: time
          pattern: '^([01]?[0-9]|2[0-3]):([0-5][0-9])$'
          description: Window definition Start Time (in 24h format)
        endDay:
          type: string
          description: Window definition End Day (Weekday name)
          enum:
            - MONDAY
            - TUESDAY
            - WEDNESDAY
            - THURSDAY
            - FRIDAY
            - SATURDAY
            - SUNDAY
        endTime:
          type: string
          format: time
          pattern: '^([01]?[0-9]|2[0-3]):([0-5][0-9])$'
          description: Window definition End Time (in 24h format)

    exclusionWindowEntity:
      type: object
      required:
        - start
        - end
      properties:
        start:
          type: string
          format: ees-date-time
          description: Exclusion Window Start (ATOM format)
          pattern: >-
            ^((((19|[2-9]\d)(0[48]|[2468][048]|[13579][26])|(([2468][048]|[3579][26])00))\-02\-29|((19\d{2}|[2-9]\d{3})\-((0[13578]|1[02])\-31))|((19\d{2}|[2-9]\d{3})\-(0[13-9]|1[0-2])\-(29|30))|((19\d{2}|[2-9]\d{3})\-(0[1-9]|1[0-2])\-(0[1-9]|1[0-9]|2[0-8])))\T([01][0-9]\:[0-5][0-9]\:[0-5][0-9]|2[0-3]\:[0-5][0-9]\:[0-5][0-9]))(\+|\-)([01][0-9]\:[0-5][0-9]|2[0-3]\:[0-5][0-9])$
        end:
          type: string
          format: string
          description: Exclusion Window End (ATOM format)
          pattern: >-
            ^((((19|[2-9]\d)(0[48]|[2468][048]|[13579][26])|(([2468][048]|[3579][26])00))\-02\-29|((19\d{2}|[2-9]\d{3})\-((0[13578]|1[02])\-31))|((19\d{2}|[2-9]\d{3})\-(0[13-9]|1[0-2])\-(29|30))|((19\d{2}|[2-9]\d{3})\-(0[1-9]|1[0-2])\-(0[1-9]|1[0-9]|2[0-8])))\T([01][0-9]\:[0-5][0-9]\:[0-5][0-9]|2[0-3]\:[0-5][0-9]\:[0-5][0-9]))(\+|\-)([01][0-9]\:[0-5][0-9]|2[0-3]\:[0-5][0-9])$

    metaEntity:
      type: object
      description: >-
        Key-Value object, please note key name length should be less then 255
        characters and key values should be less then 255 characters
      example:
        key1: Value1
        key2: Another Value

    adjustmentRulesEntity:
      type: object
      properties:
        externalAdjustment:
          type: boolean
          nullable: false
          default: false
          description: If the object (summary/basket item) has been modified by the POS at all with information we don't know about
        externalAdjustmentReason:
          type: string
          description: The reason for externalAdjustment
        ignore:
          type: boolean
          nullable: false
          default: false
          description: Ignore object as if not sent

    fulfilledBaseEarnEntity:
      description: Records the base earn points rewarded to customer during mid fulfil requests.
      type: array
      items:
        type: object
        properties:
          targetedAccountId:
            type: string
            format: string
            nullable: false
            description: EES AIR Account ID.
          points:
            type: integer
            format: int32
            nullable: false
            default: 0
            description: Total value of base earn points rewarded.

    qualifiesResultsEntity:
      description: If an offer was buy a pizza and get a free garlic bread, the pizza would have this entity against it
      type: array
      items:
        type: object
        properties:
          totalMatchingUnits:
            type: integer
            format: int32
            description: The number of products forming part of the offer's qualification
          totalMatchingSpend:
            type: integer
            format: int32
            description: The monetary value this product contributes towards the offer's qualification
          instanceId:
            type: string
            format: string
            description: The reference back to the offer reward which these qualifiers relate

    contributionResultsEntity:
      description: If an offer was spend £30 get £5 off, this entity would be against each of the products contributing to the £5 off, with their combined `value`s adding up to the £5.
      type: array
      nullable: true
      items:
        type: object
        properties:
          value:
            type: integer
            format: int32
            description: The proportional contribution to the discount/points given
          instanceId:
            type: string
            format: string
            description: The reference back to the offer which these items contributed

    adjustmentResultsEntity:
      type: array
      items:
        type: object
        properties:
          resourceType:
            type: string
            description: EES Resource Type
            nullable: false
            enum:
              - CAMPAIGN
          resourceId:
            type: string
            format: string
            description: EES AIR Resource ID (Campaign ID, Programme ID, Scheme ID)
            nullable: false
          playOrderPosition:
            type: integer
            format: int32
            nullable: true
            description: The exact position the offer was triggered during analysis
          success:
            type: boolean
            nullable: true
          type:
            type: string
            description: Operation Type
            nullable: false
            enum:
              - redeem
              - createRedeem
          value:
            type: integer
            format: int32
            nullable: false
            description: Operation Amount
          isUnredeemable:
            type: boolean
            nullable: false
            description: Boolean Flag indicating if this offer should be Unredeemable
          relatedAccountIds:
            type: array
            items:
              type: string
              format: string
              description: EES AIR Account ID
          targetedAccountId:
            type: string
            format: string
            description: EES AIR Account ID
          targetedWalletId:
            type: string
            format: string
            description: EES AIR Wallet ID. Nullable
            nullable: true
          multiItem:
            type: array
            items:
              type: string
              format: string
              description: Used for coupons that can span multiple SKU's in a basket, links basket items together based on SKU
          totalDiscountAmount:
            type: integer
            format: int32
            description: The monetary effect of the discount in the lowest unit of currency
          totalMatchingUnits:
            type: integer
            format: int32
            description: The number of products the adjustment was applied to
          instanceId:
            type: string
            format: string
            description: A mechanism to distinguish each individual reward that has been given for any account

    tenderResultsEntity:
      type: array
      items:
        type: object
        properties:
          resourceType:
            type: string
            description: EES Resource Type
            nullable: false
            enum:
              - CAMPAIGN
          resourceId:
            type: string
            format: string
            description: EES AIR Resource ID (Campaign ID, Programme ID, Scheme ID)
            nullable: false
          playOrderPosition:
            type: integer
            format: int32
            nullable: true
            description: The exact position the offer was triggered during analysis
          success:
            type: boolean
            nullable: true
          type:
            type: string
            description: Operation Type
            nullable: false
            enum:
              - redeem
              - createRedeem
          value:
            type: integer
            format: int32
            nullable: false
            description: Operation Amount
          isUnredeemable:
            type: boolean
            nullable: false
            description: Boolean Flag indicating if this offer should be Unredeemable
          relatedAccountIds:
            type: array
            items:
              type: string
              format: string
              description: EES AIR Account ID
          targetedAccountId:
            type: string
            format: string
            description: EES AIR Account ID
          targetedWalletId:
            type: string
            format: string
            description: EES AIR Wallet ID. Nullable
            nullable: true
          multiItem:
            type: array
            items:
              type: string
              format: string
              description: Used for coupons that can span multiple SKU's in a basket, links basket items together based on SKU
          totalTenderAmount:
            type: integer
            format: int32
            description: The amount of tender value in the lowest unit of currency

    datesEntity:
      type: object
      properties:
        start:
          type: string
          format: date-time
        end:
          type: string
          format: date-time

    accountBalancesEntity:
      type: object
      description: >
        The object of balances. Some balances only apply to certain types of
        accounts. See notes below on balances.
      properties:
        available:
          type: integer
          description: >
            The available balance. This is applicable for all account types,
            except POINTS and CONTINUITY, which
            uses its own balance keys. For ECOUPON account type this property
            will be returned and will be equal to zero.
        refundable:
          type: integer
          description: >
            The refundable balance. This is applicable for all account types
            except POINTS and CONTINUITY,
            but is not used during account creation. For an Account Entity, the
            amount displayed here is the
            total refundable balance available. Please note for ECOUPON account
            type this property will be returned and equal to zero.
        totalSpend:
          type: integer
          description: >
            The total spend balance. Applicable only to accounts of type
            CONTINUITY.
        transactionCount:
          type: integer
          description: >
            The transaction counter. Applicable only to accounts of type
            CONTINUITY.
        current:
          type: integer
          description: >
            The current balance. Applicable only to accounts of type POINTS and
            STAMP. If current is not provided on
            creation, this will be set to 0.
        usable:
          type: integer
          description: >
            The usable balance. Applicable only to accounts of type POINTS. If
            usable is not provided on creation,
            this will be set to 0.
        locked:
          type: integer
          description: >
            The locked balance. Applicable only to accounts of type POINTS. If
            locked is not provided on creation,
            this will be set to 0.
        lifetime:
          type: integer
          description: >-
            The lifetime balance. Applicable only to accounts of type POINTS and
            STAMP. If lifetime is not provided on creation, this will be set to
            0.
        totalUnits:
          type: integer
          description: >
            The total units purchased balance. Applicable only to accounts of type
            CONTINUITY.

    locationEntity:
      type: object
      nullable: false
      required:
        - incomingIdentifier
      properties:
        incomingIdentifier:
          type: string
          format: string
          nullable: false
          description: >-
            Optional Outlet Incoming Identifier allowing to override location arisen from used API Key of where this transaction has happened
        parentIncomingIdentifier:
          type: string
          format: string
          nullable: false
          description: >-
            Outlet's Parent unit Incoming Identifier allowing to uniquely identify an Outlet override arisen from used API Key location where this transaction has happened. Please note this optional JSON attribute should be used in case incoming identifiers are not unique within a Client's Hierarchy

    standardPaymentEntity:
      type: array
      nullable: true
      items:
        type: object
        required:
          - tenderType
          - amount
        properties:
          tenderType:
            type: string
            format: string
            description: Tender type - predefined by Eagle Eye
          amount:
            type: integer
            format: int32
            description: Monetary amount of payment in lowest unit of currency
          bin:
            type: string
            format: string
            description: The bin for the tender
          identifier:
            type: string
            format: string
            description: >-
              An identifying value of what was scanned, could be a token, barcode, gift-card

    enrichedPaymentEntity:
      type: array
      nullable: true
      description: Similar to standardPaymentEntity, except that any _tender_ offers used during adjustment, have an entry injected here, stipulating the tender amount to take off basket
      items:
        type: object
        required:
          - tenderType
          - amount
        properties:
          tenderType:
            type: string
            format: string
            description: Tender type - predefined by Eagle Eye, including a further type of _tenderCoupon_
          amount:
            type: integer
            format: int32
            description: Monetary amount of payment/tender in lowest unit of currency
          bin:
            type: string
            format: string
            description: The bin for the tender
          identifier:
            type: string
            format: string
            description: >-
              An identifying value of what was scanned, could be a token, barcode, gift-card
          accountId:
            type: string
            format: string
            description: >-
              The EE AIR Account ID (only populated when tender is owned by EE)
    bounceBackResultsEntity:
      type: array
      items:
        type: object
        properties:
          resourceType:
            type: string
            description: EES Resource Type
            nullable: false
            enum:
              - CAMPAIGN
          resourceId:
            type: string
            format: string
            description: EES AIR Campaign Id
            nullable: false
          playOrderPosition:
            type: integer
            format: int32
            nullable: true
            description: The exact position the offer was triggered during analysis
          success:
            type: boolean
            nullable: true
          type:
            type: string
            enum:
              - redeem
          value:
            type: integer
            format: int32
            description: Value of transaction
          balances:
            $ref: '#/components/schemas/accountBalancesEntity'
          isRefundable:
            type: boolean
            nullable: false
            description: Boolean Flag indicating if this offer should be refundable
          isUnredeemable:
            type: boolean
            nullable: false
            description: Boolean Flag indicating if this offer should be Unredeemable
          relatedAccounts:
            type: array
            items:
              type: string
              format: string
              description: EES AIR Account ID
          targetAccountId:
            type: string
            format: string
            description: EES AIR Account ID

    standardBasketEntity:
      title: Standard Basket Entity
      type: object
      required:
        - type
        - items
      properties:
        type:
          type: string
          enum:
            - STANDARD
        summary:
          type: object
          required:
            - totalItems
            - totalBasketValue
          properties:
            totalItems:
              type: integer
              format: int32
              nullable: false
              description: Basket Items count
            totalBasketValue:
              type: integer
              format: int32
              nullable: false
              description: >-
                Total Basket monetary Value after discounts, denominated to a
                smallest currency unit (e.g. for `USD` this value should be
                provided in `cents`)
            totalDiscountAmount:
              type: object
              properties:
                promotions:
                  type: integer
                  format: int32
                  description: Promotions Discount Amount. If basket adjustment adds to discounts, this amount will be added to
                  nullable: true
                staff:
                  type: integer
                  format: int32
                  description: Staff Discount Amount
                  nullable: true
                general:
                  type: integer
                  format: int32
                  description: General Discount Amount
                  nullable: true
            totalQualifyingAmount:
              type: object
              nullable: true
              minProperties: 1
              maxProperties: 4
              properties:
                points:
                  type: integer
                  format: int32
                  nullable: false
                  description: Basket Monetary Value for Loyalty Points calculations
                baseEarn:
                  type: integer
                  format: int32
                  nullable: false
                  description: Basket Monetary Value used for calculating base earn, overriding totalBasketValue. Adheres to basket discounts
                promotions:
                  type: integer
                  format: int32
                  nullable: false
                  description: Basket Monetary Value for Promotion Offer selections
                discount:
                  type: integer
                  format: int32
                  nullable: false
                  description: Basket Monetary Value for Discount calculations
                staff:
                  type: integer
                  format: int32
                  nullable: false
                  description: Basket Monetary Value for Staff Discount or Promotions
            totalTaxAmount:
              type: integer
              format: int32
              description: >-
                Total Tax Amount denominated to a smallest currency unit (e.g.
                for `USD` this value should be provided in `cents`)
            adjustmentRules:
              $ref: '#/components/schemas/adjustmentRulesEntity'
            redemptionChannel:
              description: The redemption channel used for this request
              type: string
              format: string
              nullable: false
            fulfilledBaseEarn:
              $ref: '#/components/schemas/fulfilledBaseEarnEntity'
        contents:
          $ref: '#/components/schemas/standardBasketContentsCollectionEntity'
        payment:
          $ref: '#/components/schemas/standardPaymentEntity'

    standardBasketContentsCollectionEntity:
      type: array
      nullable: true
      items:
        type: object
        properties:
          sku:
            type: string
            format: string
            nullable: false
            description: Item SKU
          upc:
            type: string
            format: string
            nullable: false
            description: Item SKU
          salesKey:
            type: string
            enum:
              - SALE
              - REFUND
              - FULFIL
            default: SALE
            description: '`SALE`/`REFUND`/`FULFIL` Flag'
          description:
            type: string
            format: string
            nullable: false
            description: Product Name
          itemUnitCost:
            type: integer
            format: int32
            nullable: false
            description: 'Item Price per unit, denominated to a smaller currency unit'
          itemUnitMetric:
            type: string
            description: 'The metric in which the item is measure (nullable)'
            enum:
              - LITRES
              - GRAMS
              - MILLILITERS
              - KILOGRAMS
              - POUNDS
              - OUNCES
              - PIECE
              - EACH
          itemUnitCount:
            type: number
            format: int32
            nullable: false
            description: Item Quantity
          itemUnitDiscount:
            type: integer
            format: int32
            nullable: false
            description: Discount per Item
          totalUnitCost:
            type: integer
            format: int32
            nullable: false
            description: Total cost for this item
          totalUnitCostAfterDiscount:
            type: integer
            format: int32
            nullable: false
            description: >-
              Total cost for this item after discount (please note this does
              not take into account whole basket discounts)
          taxRate:
            type: number
            format: float
            nullable: false
            description: Tax Rate (Percentage)
          taxAmount:
            type: integer
            format: int32
            nullable: false
            description: >-
              Tax Amount for that item, denominated to a smallest currency
              unit
          qualifies:
            type: object
            nullable: true
            required:
              - discount
              - points
            properties:
              discount:
                type: boolean
                description: >
                  Determines if the item is eligible for basket level discounting. If false this item will not
                  qualify for basket level discounts but still qualify for product level discounts.
              points:
                type: boolean
                description: >
                  Determines if the item is eligible for Base Earn points. If false this item will not qualify for
                  Base Earn points but still qualify for basket and product level discounts.
          meta:
            $ref: '#/components/schemas/metaEntity'
          adjustmentRules:
            $ref: '#/components/schemas/adjustmentRulesEntity'
          relatedContents:
            description: Recursive list of contents related to the parent item with the same schema as this object.
            type: array
            items:
              type: object
              properties:
                sku:
                  type: string
                  format: string
                  nullable: false
                  description: Item SKU
                upc:
                  type: string
                  format: string
                  nullable: false
                  description: Item SKU
                salesKey:
                  type: string
                  enum:
                    - SALE
                    - REFUND
                    - FULFIL
                  default: SALE
                  description: '`SALE`/`REFUND`/`FULFIL` Flag'
                description:
                  type: string
                  format: string
                  nullable: false
                  description: Product Name
                itemUnitCost:
                  type: integer
                  format: int32
                  nullable: false
                  description: 'Item Price per unit, denominated to a smaller currency unit'
                itemUnitMetric:
                  type: string
                  description: 'The metric in which the item is measure (nullable)'
                  enum:
                    - LITRES
                    - GRAMS
                    - MILLILITERS
                    - KILOGRAMS
                    - POUNDS
                    - OUNCES
                    - PIECE
                itemUnitCount:
                  type: number
                  format: int32
                  nullable: false
                  description: Item Quantity
                itemUnitDiscount:
                  type: integer
                  format: int32
                  nullable: false
                  description: Discount per Item
                totalUnitCost:
                  type: integer
                  format: int32
                  nullable: false
                  description: Total cost for this item
                totalUnitCostAfterDiscount:
                  type: integer
                  format: int32
                  nullable: false
                  description: >-
                    Total cost for this item after discount (please note this does
                    not take into account whole basket discounts)
                taxRate:
                  type: number
                  format: float
                  nullable: false
                  description: Tax Rate (Percentage)
                taxAmount:
                  type: integer
                  format: int32
                  nullable: false
                  description: >-
                    Tax Amount for that item, denominated to a smallest currency
                    unit
                qualifies:
                  type: object
                  nullable: true
                  required:
                    - discount
                    - points
                  properties:
                    discount:
                      type: boolean
                      description: >
                        Determines if the item is eligible for basket level discounting. If false this item will not
                        qualify for basket level discounts but still qualify for product level discounts.
                    points:
                      type: boolean
                      description: >
                        Determines if the item is eligible for Base Earn points. If false this item will not qualify for
                        Base Earn points but still qualify for basket and product level discounts.
                meta:
                  $ref: '#/components/schemas/metaEntity'
                adjustmentRules:
                  $ref: '#/components/schemas/adjustmentRulesEntity'
                relatedContents:
                  description: Recursive list of contents related to the parent item with the same schema as this object.

    enrichedBasketContentsCollectionEntity:
      type: array
      nullable: true
      items:
        type: object
        properties:
          sku:
            type: string
            format: string
            nullable: false
            description: Item SKU
          upc:
            type: string
            format: string
            nullable: false
            description: Item SKU
          salesKey:
            type: string
            enum:
              - SALE
              - REFUND
              - FULFIL
            default: SALE
            description: '`SALE`/`REFUND`/`FULFIL` Flag'
          description:
            type: string
            format: string
            nullable: false
            description: Product Name
          itemUnitCost:
            type: integer
            format: int32
            nullable: false
            description: 'Item Price per unit, denominated to a smaller currency unit'
          itemUnitMetric:
            type: string
            description: 'The metric in which the item is measure (nullable)'
            enum:
              - LITRES
              - GRAMS
              - MILLILITERS
              - KILOGRAMS
              - POUNDS
              - OUNCES
              - PIECE
              - EACH
          itemUnitCount:
            type: number
            format: int32
            nullable: false
            description: Item Quantity
          itemFulfilmentCount:
            type: number
            format: int32
            nullable: true
            description: Number Of Items Fulfilled
          itemUnitDiscount:
            type: integer
            format: int32
            nullable: false
            description: Discount per Item
          totalUnitCost:
            type: integer
            format: int32
            nullable: false
            description: Total cost for this item
          totalUnitCostAfterDiscount:
            type: integer
            format: int32
            nullable: false
            description: >-
              Total cost for this item after discount (please note this does
              not take into account whole basket discounts)
          taxRate:
            type: number
            format: float
            nullable: false
            description: The rate of tax being applied to this item (percentage)
          taxAmount:
            type: integer
            format: int32
            nullable: false
            description: >-
              Tax Amount for that item, denominated to a smallest currency
              unit
          qualifies:
            type: object
            nullable: true
            required:
              - discount
              - points
            properties:
              discount:
                type: boolean
                description: Determines if the item is eligible for discounting
              points:
                type: boolean
                description: Determines if the item is eligible for points
          meta:
            $ref: '#/components/schemas/metaEntity'
          adjustmentRules:
            $ref: '#/components/schemas/adjustmentRulesEntity'
          adjustmentResults:
            $ref: '#/components/schemas/adjustmentResultsEntity'
          tenderResults:
            $ref: '#/components/schemas/tenderResultsEntity'
          bounceBackResults:
            $ref: '#/components/schemas/bounceBackResultsEntity'
          qualifiesResults:
            $ref: '#/components/schemas/qualifiesResultsEntity'
          contributionResults:
            $ref: '#/components/schemas/contributionResultsEntity'
          adjudicationResults:
            type: array
            items:
              type: object
              properties:
                resourceType:
                  type: string
                  description: EES Resource Type
                  nullable: false
                  enum:
                    - CAMPAIGN
                    - PROGRAMME
                    - SCHEME
                resourceId:
                  type: string
                  format: string
                  description: EES AIR Resource ID (Campaign ID, Programme ID, Scheme ID)
                  nullable: false
                playOrderPosition:
                  type: integer
                  format: int32
                  nullable: true
                  description: The exact position the offer was triggered during analysis
                success:
                  type: boolean
                  nullable: true
                type:
                  type: string
                  description: Operation Type
                  nullable: false
                  enum:
                    - redeem
                    - credit
                    - debit
                    - earn
                    - spend
                value:
                  type: integer
                  format: int32
                  nullable: false
                  description: Operation Amount (please note&#58; value and balances attributes are mutually exclusive)
                balances:
                  $ref: '#/components/schemas/accountBalancesEntity'
                isRefundable:
                  type: boolean
                  nullable: false
                  description: Boolean Flag indicating if this offer should be refundable
                isUnredeemable:
                  type: boolean
                  nullable: false
                  description: Boolean Flag indicating if this offer should be Unredeemable
                relatedAccounts:
                  type: array
                  items:
                    type: string
                    format: string
                    description: EES AIR Account ID
                targetAccountId:
                  type: string
                  format: string
                  description: EES AIR Account ID
                totalMatchingUnits:
                  type: integer
                  nullable: true
                  format: int32
                  description: The minimum number of products required to trigger offer
          relatedContents:
            type: array
            description: Recursive list of contents related to the parent item with the same schema as this object.
            items:
              type: object
              properties:
                sku:
                  type: string
                  format: string
                  nullable: false
                  description: Item SKU
                upc:
                  type: string
                  format: string
                  nullable: false
                  description: Item SKU
                salesKey:
                  type: string
                  enum:
                    - SALE
                    - REFUND
                    - FULFIL
                  default: SALE
                  description: '`SALE`/`REFUND`/`FULFIL` Flag'
                description:
                  type: string
                  format: string
                  nullable: false
                  description: Product Name
                itemUnitCost:
                  type: integer
                  format: int32
                  nullable: false
                  description: 'Item Price per unit, denominated to a smaller currency unit'
                itemUnitMetric:
                  type: string
                  description: 'The metric in which the item is measure (nullable)'
                  enum:
                    - LITRES
                    - GRAMS
                    - MILLILITERS
                    - KILOGRAMS
                    - POUNDS
                    - OUNCES
                    - PIECE
                itemUnitCount:
                  type: number
                  format: int32
                  nullable: false
                  description: Item Quantity
                itemFulfilmentCount:
                  type: number
                  format: int32
                  nullable: true
                  description: Number Of Items Fulfilled
                itemUnitDiscount:
                  type: integer
                  format: int32
                  nullable: false
                  description: Discount per Item
                totalUnitCost:
                  type: integer
                  format: int32
                  nullable: false
                  description: Total cost for this item
                totalUnitCostAfterDiscount:
                  type: integer
                  format: int32
                  nullable: false
                  description: >-
                    Total cost for this item after discount (please note this does
                    not take into account whole basket discounts)
                taxRate:
                  type: number
                  format: float
                  nullable: false
                  description: The rate of tax being applied to this item (percentage)
                taxAmount:
                  type: integer
                  format: int32
                  nullable: false
                  description: >-
                    Tax Amount for that item, denominated to a smallest currency
                    unit
                qualifies:
                  type: object
                  nullable: true
                  required:
                    - discount
                    - points
                  properties:
                    discount:
                      type: boolean
                      description: Determines if the item is eligible for discounting
                    points:
                      type: boolean
                      description: Determines if the item is eligible for points
                meta:
                  $ref: '#/components/schemas/metaEntity'
                adjustmentRules:
                  $ref: '#/components/schemas/adjustmentRulesEntity'
                adjustmentResults:
                  $ref: '#/components/schemas/adjustmentResultsEntity'
                tenderResults:
                  $ref: '#/components/schemas/tenderResultsEntity'
                bounceBackResults:
                  $ref: '#/components/schemas/bounceBackResultsEntity'
                qualifiesResults:
                  $ref: '#/components/schemas/qualifiesResultsEntity'
                adjudicationResults:
                  type: array
                  items:
                    type: object
                    properties:
                      resourceType:
                        type: string
                        description: EES Resource Type
                        nullable: false
                        enum:
                          - CAMPAIGN
                          - PROGRAMME
                          - SCHEME
                      resourceId:
                        type: string
                        format: string
                        description: EES AIR Resource ID (Campaign ID, Programme ID, Scheme ID)
                        nullable: false
                      playOrderPosition:
                        type: integer
                        format: int32
                        nullable: true
                        description: The exact position the offer was triggered during analysis
                      success:
                        type: boolean
                        nullable: true
                      type:
                        type: string
                        description: Operation Type
                        nullable: false
                        enum:
                          - redeem
                          - credit
                          - debit
                          - earn
                          - spend
                      value:
                        type: integer
                        format: int32
                        nullable: false
                        description: Operation Amount (please note&#58; value and balances attributes are mutually exclusive)
                      balances:
                        $ref: '#/components/schemas/accountBalancesEntity'
                      isRefundable:
                        type: boolean
                        nullable: false
                        description: Boolean Flag indicating if this offer should be refundable
                      isUnredeemable:
                        type: boolean
                        nullable: false
                        description: Boolean Flag indicating if this offer should be Unredeemable
                      relatedAccounts:
                        type: array
                        items:
                          type: string
                          format: string
                          description: EES AIR Account ID
                      targetAccountId:
                        type: string
                        format: string
                        description: EES AIR Account ID
                      totalMatchingUnits:
                        type: integer
                        nullable: true
                        format: int32
                        description: The minimum number of products required to trigger offer
                relatedContents:
                  description: Recursive list of contents related to the parent item with the same schema as this object.

    enrichedBasketSummaryResultsEntity:
      title: Transaction Summary Results Entity
      type: object
      properties:
        points:
          type: object
          properties:
            spend:
              description: Total value of points spent during transaction
              type: integer
              format: int32
              nullable: false
            debit:
              description: Total value of points debited during transaction
              type: integer
              format: int32
              nullable: false
            refund:
              description: Total value of points clawed-back during refund transaction
              type: integer
              format: int32
              nullable: false
            totalPointsTaken:
              description: Sum of all negative balance actions (spend + debit + refund)
              type: integer
              format: int32
              nullable: false
            earn:
              description: Total value of points earned during transaction
              type: integer
              format: int32
              nullable: false
            credit:
              description: Total value of points credited during transaction
              type: integer
              format: int32
              nullable: false
            totalPointsGiven:
              description: Sum of all positive balance actions (earn + credit)
              type: integer
              format: int32
              nullable: false
            totalMonetaryValue:
              description: Monetary value of points using Scheme rules
              type: integer
              format: int32
              nullable: false
            redemptionChannel:
              description: The redemption channel used for this request
              type: string
              format: string
              nullable: false

    enrichedBasketEntity:
      title: Enriched Basket Entity
      type: object
      required:
        - type
        - items
        - summary
      properties:
        type:
          type: string
          enum:
            - ENRICHED
        summary:
          type: object
          required:
            - totalItems
            - totalBasketValue
          properties:
            totalItems:
              type: integer
              format: int32
              nullable: false
              description: Basket Items count
            totalBasketValue:
              type: integer
              format: int32
              nullable: false
              description: >-
                Total Basket monetary Value after discounts, denominated to a
                smallest currency unit (e.g. for `USD` this value should be
                provided in `cents`)
            totalQualifyingAmount:
              type: object
              nullable: true
              minProperties: 1
              maxProperties: 4
              properties:
                points:
                  type: integer
                  format: int32
                  nullable: true
                  description: Basket Monetary Value for Loyalty Points calculations
                baseEarn:
                  type: integer
                  format: int32
                  nullable: false
                  description: Basket Monetary Value used for calculating base earn, overriding totalBasketValue. Adheres to basket discounts
                promotions:
                  type: integer
                  format: int32
                  nullable: true
                  description: Basket Monetary Value for Promotion Offer selections
                discount:
                  type: integer
                  format: int32
                  nullable: true
                  description: Basket Monetary Value for Discount calculations
                staff:
                  type: integer
                  format: int32
                  nullable: true
                  description: Basket Monetary Value for Staff Discount or Promotions
            totalTaxAmount:
              type: integer
              format: int32
              nullable: true
              description: >-
                Total Tax Amount denominated to a smallest currency unit (e.g.
                for `USD` this value should be provided in `cents`)
            totalDiscountAmount:
              type: object
              properties:
                promotions:
                  type: integer
                  format: int32
                  description: Promotions Discount Amount. If basket adjustment adds to discounts, this amount will be added to
                  nullable: true
                staff:
                  type: integer
                  format: int32
                  description: Staff Discount Amount
                  nullable: true
                general:
                  type: integer
                  format: int32
                  description: General Discount Amount
                  nullable: true
            fulfilledBaseEarn:
              $ref: '#/components/schemas/fulfilledBaseEarnEntity'
            adjustmentRules:
              $ref: '#/components/schemas/adjustmentRulesEntity'
            tenderResults:
              $ref: '#/components/schemas/tenderResultsEntity'
            adjustmentResults:
              $ref: '#/components/schemas/adjustmentResultsEntity'
            bounceBackResults:
              $ref: '#/components/schemas/bounceBackResultsEntity'
            qualifiesResults:
              $ref: '#/components/schemas/qualifiesResultsEntity'
            adjudicationResults:
              type: array
              items:
                type: object
                properties:
                  resourceType:
                    type: string
                    description: EES Resource Type
                    nullable: false
                    enum:
                      - CAMPAIGN
                      - PROGRAMME
                      - SCHEME
                  resourceId:
                    type: string
                    format: string
                    description: EES AIR Resource ID (Campaign ID, Programme ID, Scheme ID)
                    nullable: false
                  playOrderPosition:
                    type: integer
                    format: int32
                    nullable: true
                    description: The exact position the offer was triggered during analysis
                  success:
                    type: boolean
                    nullable: true
                  type:
                    type: string
                    description: Operation Type
                    nullable: false
                    enum:
                      - redeem
                      - credit
                      - debit
                      - earn
                      - spend
                  value:
                    type: integer
                    format: int32
                    nullable: false
                    description: Operation Amount (please note&#58; value and balances attributes are mutually exclusive)
                  balances:
                    $ref: '#/components/schemas/accountBalancesEntity'
                  isRefundable:
                    type: boolean
                    nullable: false
                    description: Boolean Flag indicating if this offer should be refundable
                  isUnredeemable:
                    type: boolean
                    nullable: false
                    description: Boolean Flag indicating if this offer should be Unredeemable
                  relatedAccounts:
                    type: array
                    items:
                      type: string
                      format: string
                      description: EES AIR Account ID
                  targetedAccountId:
                    type: string
                    format: string
                    description: EES AIR Account ID
                  totalMatchingUnits:
                    type: integer
                    nullable: true
                    format: int32
                    description: The minimum number of products required to trigger offer
            results:
              $ref: '#/components/schemas/enrichedBasketSummaryResultsEntity'
            redemptionChannel:
              description: The redemption channel used for this request
              type: string
              format: string
              nullable: false

        contents:
          $ref: '#/components/schemas/enrichedBasketContentsCollectionEntity'

        payment:
          $ref: '#/components/schemas/enrichedPaymentEntity'

        analysedDateTime:
          type: string
          format: ees-date-time
          description: Basket Analysis Date-Time in ATOM format
          nullable: false

    defaultErrorEntity:
      type: object
      properties:
        errorCode:
          type: string
          description: EES AIR Error Code
          example: MPA
          enum:
            - NF
            # Not Found
            - IR
            # Invalid Request
            - U
            # Unknown Error
            - AF
            # Authorisation Failed
            - AT
            # Account Type
            - IFU
            # Insufficient Funds
            - CE
            # Configuration Error
            - IPR
            # IP Address Rejected
            - MNA
            # Method Not Allowed
            - MPA
            # Missing Parameter
            - P
            # Privileges
            - ALR
            # Account Limit Reached
            - CX
            # Campaign Expired
            - CI
            # Campaign Inactive
            - CP
            # Campaign Pending
            - CR
            # Campaign Removed
            - CU
            # Campaign Unknown
            - CORQ
            # Consumer Required
            - CTNR
            # Consumer Type Not Recognized
            - DSN
            # Duplicated Serial Number
            - IW
            # Voucher Can Not Be Created
            - RW
            # Voucher Can Not Be Redeemed
            - VURC
            # No Voucher Available to Redeem for Campaign
            - VURI
            # No Voucher Available to Redeem for this Identity
            - FES
            # Scheduling Format Incorrect
            - IOC
            # Improper Offer Configuration
            - AA
            # Invalid Access to API Method
            - ILA
            # Invalid Load Amount
            - IP
            # Invalid Parameter
            - LIR
            # Outlet Identifier Required
            - LNA
            # Outlet Not Allowed
            - LPR
            # Outlet Prohibited by Campaign Settings
            - MAC
            # Maximum Number of Code Variations
            - MTLE
            # Max Active Tokens Limit Exceeded
            - MLV
            # Maximum Voucher Value Exceeded
            - MAR
            # Minimum Amount Required
            - OC
            # Campaign has no Offer
            - RWI
            # Token can not be Redeemed at this time. Blocked by redemption windows.
            - TEXP
            # Token Expired
            - TULR
            # Token Usage Limit Reached
            - UAS
            # Transaction Not Allowed by current account status
            - UV
            # Voucher Unknown
            - VA
            # Voucher already been sent
            - VC
            # Voucher Cancelled
            - VXP
            # Voucher Expired
            - VI
            # Voucher Invalid
            - VL
            # Voucher Locked
            - VNL
            # Voucher Not Locked
            - VPUF
            # You don't have privileges to unlock this token
            - VSM
            # Voucher Serial Mismatch
            - VUA
            # No vouchers available for this campaign
            - VU
            # Voucher already redeemed
            - ITID
            # Invalid Transaction ID
            - WTF
            # Wallet Transaction Failure
            - IH
            # Invalid Header set
            - RFL
            # Max redemption limit ... per period ... has been exceeded
        errorMessage:
          type: string
          format: string
          description: Human Friendly Error Message
          example: 'Missing Mandatory Request Parameter: `parameterName`'
      x-enum:
        - { errorCode: NF, errorMessage: Not Found }
        - { errorCode: IR, errorMessage: Invalid Request }
        - { errorCode: U, errorMessage: Unknown Error }
        - { errorCode: AF, errorMessage: Authorisation Failed }
        - { errorCode: AT, errorMessage: Account Type }
        - { errorCode: IFU, errorMessage: Insufficient Funds }
        - { errorCode: CE, errorMessage: Configuration Error }
        - { errorCode: IPR, errorMessage: IP Address Rejected }
        - { errorCode: MNA, errorMessage: Method Not Allowed }
        - { errorCode: MPA, errorMessage: Missing Parameter }
        - { errorCode: P, errorMessage: Privileges }
        - { errorCode: ALR, errorMessage: Account Limit Reached }
        - { errorCode: CX, errorMessage: Campaign Expired }
        - { errorCode: CI, errorMessage: Campaign Inactive }
        - { errorCode: CP, errorMessage: Campaign Pending }
        - { errorCode: CR, errorMessage: Campaign Removed }
        - { errorCode: CU, errorMessage: Campaign Unknown }
        - { errorCode: CORQ, errorMessage: Consumer Required }
        - { errorCode: CTNR, errorMessage: Consumer Type Not Recognized }
        - { errorCode: DSN, errorMessage: Duplicated Serial Number }
        - { errorCode: IW, errorMessage: Voucher Can Not Be Created }
        - { errorCode: RW, errorMessage: Voucher Can Not Be Redeemed }
        - { errorCode: VURC, errorMessage: No Voucher Available to Redeem for Campaign }
        - { errorCode: VURI, errorMessage: No Voucher Available to Redeem for this Identity }
        - { errorCode: FES, errorMessage: Scheduling Format Incorrect }
        - { errorCode: IOC, errorMessage: Improper Offer Configuration }
        - { errorCode: AA, errorMessage: Invalid Access to API Method }
        - { errorCode: ILA, errorMessage: Invalid Load Amount }
        - { errorCode: IP, errorMessage: Invalid Parameter }
        - { errorCode: LIR, errorMessage: Outlet Identifier Required }
        - { errorCode: LNA, errorMessage: Outlet Not Allowed }
        - { errorCode: LPR, errorMessage: Outlet Prohibited by Campaign Settings }
        - { errorCode: MAC, errorMessage: Maximum Number of Code Variations }
        - { errorCode: MTLE, errorMessage: Max Active Tokens Limit Exceeded }
        - { errorCode: MLV, errorMessage: Maximum Voucher Value Exceeded }
        - { errorCode: MAR, errorMessage: Minimum Amount Required }
        - { errorCode: OC, errorMessage: Campaign has no Offer }
        - { errorCode: RWI, errorMessage: Token can not be Redeemed at this time. Blocked by redemption windows. }
        - { errorCode: TEXP, errorMessage: Token Expired }
        - { errorCode: TULR, errorMessage: Token Usage Limit Reached }
        - { errorCode: UAS, errorMessage: Transaction Not Allowed by current account status }
        - { errorCode: UV, errorMessage: Voucher Unknown }
        - { errorCode: VA, errorMessage: Voucher already been sent }
        - { errorCode: VC, errorMessage: Voucher Cancelled }
        - { errorCode: VXP, errorMessage: Voucher Expired }
        - { errorCode: VI, errorMessage: Voucher Invalid }
        - { errorCode: VL, errorMessage: Voucher Locked }
        - { errorCode: VNL, errorMessage: Voucher Not Locked }
        - { errorCode: VPUF, errorMessage: Voucher You don't have privileges to unlock this token }
        - { errorCode: VSM, errorMessage: Voucher Serial Mismatch }
        - { errorCode: VUA, errorMessage: No vouchers available for this campaign }
        - { errorCode: VU, errorMessage: Voucher already redeemed }
        - { errorCode: ITID, errorMessage: Invalid Transaction ID }
        - { errorCode: WTF, errorMessage: Wallet Transaction Failure }
        - { errorCode: IH, errorMessage: Invalid Header set }
        - { "errorCode": "RFL", "errorMessage": "Redemption failed: Max redemption limit ... per period ... has been exceeded" }

    messagesResponse:
      type: object
      required:
        - reference
      properties:
        reference:
          type: string
          format: string
          description: Unique Merchant's reference (unique for each operation request)
        print:
          type: object
          properties:
            items:
              type: array
              items:
                type: object
                required:
                  - type
                  - position
                properties:
                  type:
                    type: string
                    format: string
                    description: The type of Message.
                  position:
                    type: integer
                    format: int32
                    description: The position indicating where this Message should be placed.
                  messageId:
                    type: string
                    format: string
                    description: The Message Id (reference).
                  accountId:
                    type: string
                    format: string
                    description: The Account Id (reference).
        accounts:
          type: array
          items:
            type: object
            allOf:
              - $ref: '#/components/schemas/walletAccountEntity'
              - type: object
                properties:
                  enriched:
                    $ref: '#/components/schemas/accountEnrichmentEntity'
        messages:
          type: array
          items:
            type: object
            description: details TBC

    messageReportResponse:
      type: array
      items:
        anyOf:
          - $ref: '#/components/schemas/walletAccountEntity'
          - $ref: '#/components/schemas/standardMessageObject'

    messageReport207Response:
      type: object
      properties:
        results:
          type: array
          items:
            anyOf:
              - $ref: '#/components/schemas/walletAccountEntity'
              - $ref: '#/components/schemas/standardMessageObject'
        successful:
          type: array
          items:
            anyOf:
              - $ref: '#/components/schemas/walletAccountEntity'
              - $ref: '#/components/schemas/standardMessageObject'
        failed:
          type: array
          items:
            anyOf:
              - $ref: '#/components/schemas/walletAccountEntity'
              - $ref: '#/components/schemas/standardMessageObject'

    standardMessageObject:
      type: object
      properties:
        messageId:
          type: string
          format: string
          description: Identifier of the message

    reportEntity:
      type: object
      required:
        - type
        - identifier
        - printSuccess
      properties:
        type:
          type: string
          format: string
          enum:
            - account
            - message
        identifier:
          type: string
          format: string
          description: Identifier for the object type (AccountId or MessageId).
        printSuccess:
          type: boolean
          description: Boolean flag indicating whether a message printed successfully or not.
        reference:
          type: string
          description: Unique Merchant's reference (unique for each operation request).
        location:
          $ref: '#/components/schemas/locationEntity'
        errorCode:
          type: string
          description: The error code from the calling application detailing the reason for not printing.
        errorDescription:
          type: string
          description: A descriptive message outlining the reason for failing to print.

  requestBodies:
    messagesPayload:
      description: JSON Payload
      required: true
      content:
        application/json:
          schema:
            type: object
            required:
              - reference
            properties:
              walletId:
                type: string
                format: string
                nullable: false
                description: EES Wallet ID. Issued coupons will be added to the wallet associated to this walletId. Optional
              identity:
                type: object
                description: The Identity that this message relates to.
                minProperties: 1
                maxProperties: 1
                nullable: false
                properties:
                  identityValue:
                    type: string
                    format: string
                    description: Identity Value
                    example: john.roe@domain.org
                example:
                  identityValue: john.roe@domain.org
              reference:
                type: string
                format: string
                nullable: false
                description: Merchant Reference for a Consumer Transaction
                example: '0c215d3e-5e53-45e0-9233-13d97378a8eb'
              location:
                $ref: '#/components/schemas/locationEntity'
              basket:
                oneOf:
                  - $ref: '#/components/schemas/standardBasketEntity'
                  - $ref: '#/components/schemas/enrichedBasketEntity'
                discriminator:
                  propertyName: basketType

          examples:
            'Basic Example':
              value:
                reference: '1f8ae804-aa21-4899-9588-03a91d4294ac'

            'Personalised Example (with an identity and a transaction Basket)':
              value:
                reference: 'e3fb630c-264a-4ef0-8e5e-391e46cc85bc'
                identity:
                  identityValue: john.roe@domain.org
                basket:
                  type: STANDARD
                  summary:
                    totalItems: 20
                    totalQualifyingAmount:
                      points: 100
                      promotions: null
                    totalDiscountAmount:
                      promotions: null
                      staff: null
                      general: null
                  contents:
                    - sku: "1234567890"
                      salesKey: SALE
                      itemUnitCost: 5
                      itemUnitCount: 20
                      itemUnitDiscount: 0
                      totalUnitCost: 100
                      totalUnitCostAfterDiscount: 100
                      taxRate: 20
                      taxAmount: 20
                      qualifies:
                        points: true
                        discount: true

            'Full Example (with an identity, a transaction Basket and a location)':
              value:
                reference: 'e3fb630c-264a-4ef0-8e5e-391e46cc85bc'
                identity:
                  identityValue: john.roe@domain.org
                basket:
                  type: STANDARD
                  summary:
                    totalItems: 20
                    totalQualifyingAmount:
                      points: 100
                      promotions: null
                    totalDiscountAmount:
                      promotions: null
                      staff: null
                      general: null
                  contents:
                    - sku: "1234567890"
                      salesKey: SALE
                      itemUnitCost: 5
                      itemUnitCount: 20
                      itemUnitDiscount: 0
                      totalUnitCost: 100
                      totalUnitCostAfterDiscount: 100
                      taxRate: 20
                      taxAmount: 20
                      qualifies:
                        discount: true
                        points: true
                location:
                  incomingIdentifier: GuildfordHighStreetOutlet
                  parentIncomingIdentifier: SurreyAndMiddlesexRegion

    messageReportPayload:
      description: JSON Payload
      required: true
      content:
        application/json:
          schema:
            type: array
            items:
              $ref: '#/components/schemas/reportEntity'

  parameters:
    httpContentTypeRequest:
      name: Content-Type
      in: header
      required: false
      description: >-
        Standard HTTP header to inform EES API what type of content was passed
        in request payload
      schema:
        type: string
        format: string
        default: application/json
      allowEmptyValue: false

    httpAcceptEncodingRequest:
      name: Accept-Encoding
      in: header
      required: false
      description: >-
        This request HTTP header advertises which content encoding (usually a
        compression algorithm) the calling application is able to understand.
        The server selects one of the proposals, use it and informs the client
        of its choice with the `Content-Encoding` Response header. Currently
        supported `gzip` and `deflate`. Please note if this request header is
        not present, no compression will be used.
      schema:
        type: string
        default: ''''''
        enum:
          - ''''''
          - '''gzip'''
          - '''deflate'''
          - '''gzip,deflate'''
          - '''deflate,gzip'''
      allowEmptyValue: true

    httpConnectionRequest:
      name: Connection
      in: header
      required: false
      description: >-
        This general HTTP header controls (or rather influences) whether the
        network connection stays open after the current request finishes. If the
        sent value is `keep-alive`, the connection should stay in a special
        state, allowing to be reused for subsequent requests to the same server.
        Please note these connections will be closed after reaching timeout
        threshold controlled by EES server (usually after 5 seconds).
      schema:
        type: string
        enum:
          - keep-alive
          - close
        default: close

    eesAuthenticationClientId:
      name: X-EES-AUTH-CLIENT-ID
      in: header
      description: >-
        Client ID, provided by EES during on-boarding. Please note&#58; the authentication mechanic requires the receipt of the full payload so any headers that would chunk the request up, such as `transfer-encoding: chunked` could potentially cause authentication failures.
      required: true
      schema:
        type: string
        format: string
    eesAuthenticationRequestHash:
      name: X-EES-AUTH-HASH
      in: header
      description: >-
        Request Authentication Hash, calculated by concatenating Request URI
        Path with API prefix, Request Query String(s) if applicable, Request
        Payload if applicable and Client Secret. Please note&#58; the authentication mechanic requires the receipt of the full payload so any headers that would chunk the request up, such as `transfer-encoding: chunked` could potentially cause authentication failures.
      required: true
      schema:
        type: string
        format: string
    eesMessageId:
      name: X-EES-TRANSACTION-ID
      in: header
      description: >-
        Optional Unique Reference for the API Request (Transaction) within the
        calling company
      required: false
      schema:
        type: string
        format: string
    customSubsystemId:
      name: X-CUSTOM-SUBSYSTEM-ID
      in: header
      description: >-
        Optional header provided by the calling application for EES AIR to
        identify what was the external Subsystem ID / Name. Please note this
        header is not essential for AIR to process a Request, this header and
        its value will be intercepted by AIR and will show up in Wallet Event
        Notifications, if applicable.
      required: false
      schema:
        type: string
        format: string
    customWildCard:
      name: X-CUSTOM-KEY
      in: header
      description: >
        Optional header(s) provided by the calling application to EES AIR.
        Please note a) this header name has to follow pattern X-CUSTOM-* (i.e.
        X-CUSTOM-EMAIL) b) this header is not essential for AIR to process a
        Request, this header and its value will be intercepted by AIR and will
        show up in Wallet Event Notifications, if applicable.
      required: false
      schema:
        type: string
        format: string

  responses:
    messagesResponsePayload:
      description: EES AIR has successfully processed a Request
      headers:
        X-EES-TRANSACTION-ID-RESULT:
          $ref: '#/components/headers/uniquenessCheckResult'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/messagesResponse'

    messageReportResponsePayload:
      description: EES AIR has successfully processed a Request
      headers:
        X-EES-TRANSACTION-ID-RESULT:
          $ref: '#/components/headers/uniquenessCheckResult'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/messageReportResponse'

    message207Response:
      description: Response when the issue was partially successful
      headers:
        X-EES-TRANSACTION-ID-RESULT:
          $ref: '#/components/headers/uniquenessCheckResult'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/messageReport207Response'

    error400Response:
      description: >-
        EES AIR Refuse to process that particular Request as there is something
        wrong with the Request (e.g. missing Mandatory Request parameter or
        Mandatory Request Payload attribute is missing, Request payload is
        unprocessable, etc)
      headers:
        X-EES-TRANSACTION-ID-RESULT:
          $ref: '#/components/headers/uniquenessCheckResult'
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/defaultErrorEntity'
            example:
              errorCode: MPA
              errorMessage: 'Missing Mandatory Request Parameter: `parameterName`'

    error401Response:
      description: >-
        EES AIR Refuse to process that particular Request due to Authentication
        error. This could be caused by missing mandatory AUTH header(s), invalid
        Hash calculation, invalid or inactive API Key used, etc.
      headers:
        X-EES-TRANSACTION-ID-RESULT:
          $ref: '#/components/headers/uniquenessCheckResult'
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/defaultErrorEntity'
            example:
              errorCode: AF
              errorMessage: >-
                Authentication Failure, Please check if required AUTH headers
                are present in your Request and if AUTH Hash is calculated
                correctly
    error403Response:
      description: >-
        EES AIR Refuse to process that particular Request due to Request
        Authorization error(s). This indicates that used API Key has not got
        required permissions to perform this operation.
      headers:
        X-EES-TRANSACTION-ID-RESULT:
          $ref: '#/components/headers/uniquenessCheckResult'
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/defaultErrorEntity'
            example:
              errorCode: P
              errorMessage: You don't have appropriate Privileges to perform this operation

    error404Response:
      description: >-
        EES AIR Refuse to process that particular Request as
        requested/referenced resource could not be found.
      headers:
        X-EES-TRANSACTION-ID-RESULT:
          $ref: '#/components/headers/uniquenessCheckResult'
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/defaultErrorEntity'
            example:
              errorCode: NF
              errorMessage: Requested Resource (Wallet Identity Value) not found

    error409Response:
      description: >-
        EES AIR understands this request, but refuses to process it, due to
        present Conflict with the current state of the target resource or
        because performing this operation would lead to a Conflict within AIR.
      headers:
        X-EES-TRANSACTION-ID-RESULT:
          $ref: '#/components/headers/uniquenessCheckResult'
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/defaultErrorEntity'
            example:
              errorCode: CI
              errorMessage: Campaign Inactive

    error415Response:
      description: >-
        EES AIR is not able to understand that request due to not supported
        `Content-Type` value.
      headers:
        X-EES-TRANSACTION-ID-RESULT:
          $ref: '#/components/headers/uniquenessCheckResult'
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/defaultErrorEntity'
            example:
              errorCode: ...
              errorMessage: ...

    error429Response:
      description: >-
        EES AIR refuses to process that particular Request as Client's API
        Requests Limit was exceeded.
      headers:
        X-EES-TRANSACTION-ID-RESULT:
          $ref: '#/components/headers/uniquenessCheckResult'
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/defaultErrorEntity'
            example:
              errorCode: ...
              errorMessage: ...

    error500Response:
      description: >-
        EES AIR refuses to process that particular Request due to Unexpected
        Server Error.
      headers:
        X-EES-TRANSACTION-ID-RESULT:
          $ref: '#/components/headers/uniquenessCheckResult'
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/defaultErrorEntity'
            example:
              errorCode: U
              errorMessage: Unknown Server Error

    error503Response:
      description: >-
        EES AIR refuses to process that particular Request due to Service(s)
        being Unavailable (i.e. Scheduled Maintenance)
      headers:
        X-EES-TRANSACTION-ID-RESULT:
          $ref: '#/components/headers/uniquenessCheckResult'
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/defaultErrorEntity'
            example:
              errorCode: ...
              errorMessage: ...

    error504Response:
      description: >-
        EES AIR refuses to process that particular Request due to Networking
        Issues
      headers:
        X-EES-TRANSACTION-ID-RESULT:
          $ref: '#/components/headers/uniquenessCheckResult'
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/defaultErrorEntity'
            example:
              errorCode: ...
              errorMessage: ...

            description: Human Friendly Error Message

  headers:
    httpKeepAliveResponse:
      required: false
      description: >-
        This general HTTP header will be present in a Response, if EES Server
        decides to enable Keep-Alive mechanism, so the calling application could
        reuse current connection for next request(s). HTTP/1.1 defines semantics
        for the optional "timeout" and "max" parameters on responses. The
        `timeout` parameter allows the server to indicate the amount of time in
        seconds it is currently allowing between when the response was generated
        and when the next request is received from the client (i.e. the request
        timeout limit). Similarly, the "max" parameter allows the server to
        indicate the maximum additional requests that it will allow on the
        current persistent connection. Please note these values are provided for
        diagnostic purposes only
      schema:
        type: string
        enum:
          - keep-alive
          - close
        default: close
        example: 'timeout=5, max=1000'

    uniquenessCheckResult:
      required: false
      description: >-
        If Request Uniqueness checking is enabled for a Client, this Header will contain details regarding Request uniqueness check performed within EES AIR. `PASSED` means it was checked and a Request is unique, `FAILED` means check was performed and it fails, `UNABLE TO CHECK` means EES AIR was not able to perform uniqueness check.
      schema:
        type: string
        nullable: false
        enum:
          - PASSED
          - FAILED
          - UNABLE TO CHECK

  securitySchemes:
    eesAuthClientId:
      type: apiKey
      in: header
      description: >-
        Client ID, provided during onboarding to each EES AIR Client. Please
        note&#58; API Key consist of `Client ID` and `Client Secret` required
        for calculating Authentication Hash (`X-EES-AUTH-HASH`). Each Unit from
        the Client Hierarchy can have one or more API Key(s).
      name: X-EES-AUTH-CLIENT-ID
    eesAuthHash:
      type: apiKey
      in: header
      description: >-
        Request Authentication Hash, obtained by concatenating Full Request URI
        Path (with API prefix), Request Query String(s) (if applicable), Request
        Payload (if applicable), Client Secret and then calculating SHA256 from
        this concatenated string.
      name: X-EES-AUTH-HASH

security:
  - eesAuthClientId: []
    eesAuthHash: []
