> ## Documentation Index
> Fetch the complete documentation index at: https://docs.craveup.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Persist session preferences and recalculate cart food advice



## OpenAPI

````yaml /generated/storefront.openapi.json put /locations/{locationId}/carts/{cartId}/dietary-preferences
openapi: 3.0.3
info:
  title: Crave Storefront API
  version: 2.0.0
  description: >-
    Direct public Storefront API. Anonymous catalog reads require no API key.
    Protected resources use purpose-limited cart, checkout, receipt, or customer
    credentials.
  contact:
    name: Crave Support
    email: hello@craveup.com
servers:
  - url: https://api.craveup.com/api/v1/storefront
    description: Production Storefront API
  - url: https://sandbox-api.craveup.com/api/v1/storefront
    description: Sandbox Storefront API
security: []
tags:
  - name: Customer Auth
  - name: Catering
  - name: Loyalty
  - name: Merchants
  - name: Locations
  - name: Ordering Sessions
  - name: Menus
  - name: Products
  - name: Carts
  - name: Analytics
  - name: Checkout
  - name: Cart Items
  - name: Discounts
  - name: Customers
  - name: Orders
paths:
  /locations/{locationId}/carts/{cartId}/dietary-preferences:
    put:
      tags:
        - Carts
      summary: Persist session preferences and recalculate cart food advice
      operationId: storefrontUpdateCartDietaryPreferences
      parameters:
        - name: locationId
          in: path
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 128
        - name: cartId
          in: path
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 128
        - name: Idempotency-Key
          in: header
          required: true
          description: Caller-stable key reused only for retries of this exact request.
          schema:
            type: string
            minLength: 16
            maxLength: 128
            pattern: ^[A-Za-z0-9._:-]{16,128}$
        - name: If-Match
          in: header
          required: true
          description: Current cart ETag returned by the API.
          schema:
            type: string
            pattern: ^(?:W/)?"cart-(?:0|[1-9][0-9]*)"$
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DietaryPreferenceContext'
      responses:
        '200':
          description: Cart with recomputed food advice and preserved monetary authority.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StorefrontCart'
          headers:
            ETag:
              description: >-
                Current resource revision tag. Send it in If-Match before
                mutation.
              schema:
                type: string
            Cache-Control:
              schema:
                type: string
                example: private, no-store
        '400':
          description: The request is invalid.
          headers:
            X-Request-Id:
              description: Opaque request identifier for support and telemetry correlation.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CommerceErrorEnvelope'
        '401':
          description: Authentication or capability authorization is required.
          headers:
            X-Request-Id:
              description: Opaque request identifier for support and telemetry correlation.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CommerceErrorEnvelope'
        '403':
          description: The authenticated principal does not own this resource.
          headers:
            X-Request-Id:
              description: Opaque request identifier for support and telemetry correlation.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CommerceErrorEnvelope'
        '404':
          description: The requested resource was not found.
          headers:
            X-Request-Id:
              description: Opaque request identifier for support and telemetry correlation.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CommerceErrorEnvelope'
        '409':
          description: The idempotency key or resource revision conflicts.
          headers:
            X-Request-Id:
              description: Opaque request identifier for support and telemetry correlation.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StorefrontCartMutationErrorEnvelope'
        '428':
          description: A current If-Match resource revision is required.
          headers:
            X-Request-Id:
              description: Opaque request identifier for support and telemetry correlation.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CommerceErrorEnvelope'
        '429':
          description: The request was rate limited.
          headers:
            X-Request-Id:
              description: Opaque request identifier for support and telemetry correlation.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CommerceErrorEnvelope'
        '500':
          description: An unexpected error occurred.
          headers:
            X-Request-Id:
              description: Opaque request identifier for support and telemetry correlation.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CommerceErrorEnvelope'
        '503':
          description: A required dependency is temporarily unavailable.
          headers:
            X-Request-Id:
              description: Opaque request identifier for support and telemetry correlation.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CommerceErrorEnvelope'
      security:
        - StorefrontCartCapability: []
        - StorefrontCustomerAuth: []
components:
  schemas:
    DietaryPreferenceContext:
      type: object
      properties:
        preferences:
          maxItems: 2
          type: array
          items:
            type: string
            enum:
              - vegetarian
              - vegan
        avoidAllergenIds:
          maxItems: 14
          type: array
          items:
            type: string
            enum:
              - milk
              - egg
              - fish
              - crustacean_shellfish
              - tree_nuts
              - peanut
              - wheat
              - soy
              - sesame
              - celery
              - mustard
              - lupin
              - molluscs
              - sulphites
      required:
        - preferences
        - avoidAllergenIds
      additionalProperties: false
    StorefrontCart:
      type: object
      properties:
        dietaryPreferences:
          $ref: '#/components/schemas/UpdateCartDietaryPreferencesRequest'
        foodSummary:
          $ref: '#/components/schemas/CartFoodSummary'
        catering:
          default: null
          nullable: true
          type: object
          properties:
            eventId:
              type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            locationId:
              type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            returnPath:
              type: string
              pattern: ^\/c\/[0-9a-f-]{36}\/[0-9a-f-]{36}$
            presentation:
              $ref: '#/components/schemas/CateringPaymentPresentation'
            contact:
              nullable: true
              type: object
              properties:
                name:
                  type: string
                email:
                  nullable: true
                  type: string
                phone:
                  nullable: true
                  type: string
              required:
                - name
                - email
                - phone
              additionalProperties: false
          required:
            - eventId
            - locationId
            - returnPath
            - presentation
          additionalProperties: false
        id:
          type: string
          minLength: 1
          maxLength: 128
        locationId:
          type: string
          minLength: 1
          maxLength: 128
        merchantId:
          type: string
          minLength: 1
          maxLength: 128
        status:
          type: string
          enum:
            - OPEN
            - LOCKED
            - COMPLETED
            - EXPIRED
        lockedAt:
          nullable: true
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
        revision:
          type: integer
          minimum: 0
          maximum: 9007199254740991
        updatedAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
        expiresAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
        authorityContext:
          nullable: true
          type: object
          properties:
            version:
              type: number
              enum:
                - 2
            organizationId:
              type: string
              minLength: 1
              maxLength: 128
            locationId:
              type: string
              minLength: 1
              maxLength: 128
            profile:
              type: string
              enum:
                - crave_commerce
                - pos_routed
            cartId:
              type: string
              minLength: 1
              maxLength: 128
            cartRevision:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            menuReleases:
              maxItems: 1000
              type: array
              items:
                type: object
                properties:
                  menuId:
                    type: string
                    format: uuid
                    pattern: >-
                      ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                  locationId:
                    type: string
                    format: uuid
                    pattern: >-
                      ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                  channel:
                    type: string
                    enum:
                      - online
                      - catering
                  menuReleaseId:
                    type: string
                    format: uuid
                    pattern: >-
                      ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                  targetRevision:
                    type: integer
                    minimum: 0
                    exclusiveMinimum: true
                    maximum: 9007199254740991
                  contentHash:
                    type: string
                    pattern: ^[a-f0-9]{64}$
                required:
                  - menuId
                  - locationId
                  - channel
                  - menuReleaseId
                  - targetRevision
                  - contentHash
                additionalProperties: false
            commercePolicyRevision:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            providerBindingRevision:
              nullable: true
              type: integer
              minimum: 0
              exclusiveMinimum: true
              maximum: 9007199254740991
            authority:
              type: object
              properties:
                operationalCatalog:
                  type: string
                  enum:
                    - crave
                    - provider
                quote:
                  type: string
                  enum:
                    - crave
                    - provider
                benefits:
                  type: string
                  enum:
                    - crave_lip
                    - provider
                    - none
                orderRouting:
                  type: string
                  enum:
                    - crave
                    - provider
                fulfillment:
                  type: string
                  enum:
                    - crave
                    - provider
              required:
                - operationalCatalog
                - quote
                - benefits
                - orderRouting
                - fulfillment
              additionalProperties: false
          required:
            - version
            - organizationId
            - locationId
            - profile
            - cartId
            - cartRevision
            - menuReleases
            - commercePolicyRevision
            - providerBindingRevision
            - authority
          additionalProperties: false
        quoteFingerprint:
          nullable: true
          type: string
          pattern: ^[a-f0-9]{64}$
        quoteExpiresAt:
          nullable: true
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
        catalogRevalidation:
          nullable: true
          type: object
          properties:
            required:
              type: boolean
            outcome:
              type: string
              enum:
                - ready
                - reprice_required
                - unavailable
                - confirmation_required
            reasonCodes:
              type: array
              items:
                type: string
                enum:
                  - ITEM_SOLD_OUT
                  - ITEM_UNAVAILABLE
                  - PRICE_CHANGED
                  - MODIFIER_UNAVAILABLE
                  - MODIFIER_RULE_CHANGED
                  - QUANTITY_REDUCED
                  - SCHEDULE_CLOSED
                  - FULFILLMENT_UNAVAILABLE
                  - MAPPING_MISSING
                  - MENU_RELEASE_CHANGED
                  - POLICY_CHANGED
                  - QUOTE_EXPIRED
            changeSet:
              nullable: true
              type: object
              properties:
                version:
                  type: number
                  enum:
                    - 2
                previous:
                  type: object
                  properties:
                    cartRevision:
                      type: integer
                      minimum: 0
                      maximum: 9007199254740991
                    menuReleases:
                      maxItems: 1000
                      type: array
                      items:
                        type: object
                        properties:
                          menuId:
                            type: string
                            format: uuid
                            pattern: >-
                              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                          locationId:
                            type: string
                            format: uuid
                            pattern: >-
                              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                          channel:
                            type: string
                            enum:
                              - online
                              - catering
                          menuReleaseId:
                            type: string
                            format: uuid
                            pattern: >-
                              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                          targetRevision:
                            type: integer
                            minimum: 0
                            exclusiveMinimum: true
                            maximum: 9007199254740991
                          contentHash:
                            type: string
                            pattern: ^[a-f0-9]{64}$
                        required:
                          - menuId
                          - locationId
                          - channel
                          - menuReleaseId
                          - targetRevision
                          - contentHash
                        additionalProperties: false
                    commercePolicyRevision:
                      type: integer
                      minimum: 0
                      maximum: 9007199254740991
                    providerBindingRevision:
                      nullable: true
                      type: integer
                      minimum: 0
                      exclusiveMinimum: true
                      maximum: 9007199254740991
                  required:
                    - cartRevision
                    - menuReleases
                    - commercePolicyRevision
                    - providerBindingRevision
                  additionalProperties: false
                current:
                  type: object
                  properties:
                    cartRevision:
                      type: integer
                      minimum: 0
                      maximum: 9007199254740991
                    menuReleases:
                      maxItems: 1000
                      type: array
                      items:
                        type: object
                        properties:
                          menuId:
                            type: string
                            format: uuid
                            pattern: >-
                              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                          locationId:
                            type: string
                            format: uuid
                            pattern: >-
                              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                          channel:
                            type: string
                            enum:
                              - online
                              - catering
                          menuReleaseId:
                            type: string
                            format: uuid
                            pattern: >-
                              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                          targetRevision:
                            type: integer
                            minimum: 0
                            exclusiveMinimum: true
                            maximum: 9007199254740991
                          contentHash:
                            type: string
                            pattern: ^[a-f0-9]{64}$
                        required:
                          - menuId
                          - locationId
                          - channel
                          - menuReleaseId
                          - targetRevision
                          - contentHash
                        additionalProperties: false
                    commercePolicyRevision:
                      type: integer
                      minimum: 0
                      maximum: 9007199254740991
                    providerBindingRevision:
                      nullable: true
                      type: integer
                      minimum: 0
                      exclusiveMinimum: true
                      maximum: 9007199254740991
                  required:
                    - cartRevision
                    - menuReleases
                    - commercePolicyRevision
                    - providerBindingRevision
                  additionalProperties: false
                reasonCodes:
                  type: array
                  items:
                    type: string
                    enum:
                      - ITEM_SOLD_OUT
                      - ITEM_UNAVAILABLE
                      - PRICE_CHANGED
                      - MODIFIER_UNAVAILABLE
                      - MODIFIER_RULE_CHANGED
                      - QUANTITY_REDUCED
                      - SCHEDULE_CLOSED
                      - FULFILLMENT_UNAVAILABLE
                      - MAPPING_MISSING
                      - MENU_RELEASE_CHANGED
                      - POLICY_CHANGED
                      - QUOTE_EXPIRED
                changes:
                  type: array
                  items:
                    type: object
                    properties:
                      reason:
                        type: string
                        enum:
                          - ITEM_SOLD_OUT
                          - ITEM_UNAVAILABLE
                          - PRICE_CHANGED
                          - MODIFIER_UNAVAILABLE
                          - MODIFIER_RULE_CHANGED
                          - QUANTITY_REDUCED
                          - SCHEDULE_CLOSED
                          - FULFILLMENT_UNAVAILABLE
                          - MAPPING_MISSING
                          - MENU_RELEASE_CHANGED
                          - POLICY_CHANGED
                          - QUOTE_EXPIRED
                      cartItemId:
                        nullable: true
                        type: string
                        minLength: 1
                        maxLength: 128
                      canonicalEntityId:
                        nullable: true
                        type: string
                        minLength: 1
                        maxLength: 128
                      path:
                        type: string
                        minLength: 1
                      before:
                        nullable: true
                        anyOf:
                          - type: string
                          - type: number
                          - type: boolean
                      after:
                        nullable: true
                        anyOf:
                          - type: string
                          - type: number
                          - type: boolean
                      permittedActions:
                        type: array
                        items:
                          type: string
                          enum:
                            - ACCEPT_CHANGES
                            - EDIT_ITEM
                            - REMOVE_ITEM
                            - RESELECT_MODIFIERS
                            - CHANGE_FULFILLMENT
                            - START_NEW_CART
                    required:
                      - reason
                      - cartItemId
                      - canonicalEntityId
                      - path
                      - before
                      - after
                      - permittedActions
                    additionalProperties: false
                blocking:
                  type: boolean
                reconfirmationRequired:
                  type: boolean
                invalidatedEvidence:
                  type: object
                  properties:
                    quote:
                      type: boolean
                    benefits:
                      type: boolean
                    paymentAuthorization:
                      type: boolean
                  required:
                    - quote
                    - benefits
                    - paymentAuthorization
                  additionalProperties: false
              required:
                - version
                - previous
                - current
                - reasonCodes
                - changes
                - blocking
                - reconfirmationRequired
                - invalidatedEvidence
              additionalProperties: false
            releaseEvidence:
              nullable: true
              type: object
              properties:
                fingerprint:
                  type: string
                  pattern: ^[a-f0-9]{64}$
                menuReleases:
                  maxItems: 1000
                  type: array
                  items:
                    type: object
                    properties:
                      menuId:
                        type: string
                        format: uuid
                        pattern: >-
                          ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                      locationId:
                        type: string
                        format: uuid
                        pattern: >-
                          ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                      channel:
                        type: string
                        enum:
                          - online
                          - catering
                      menuReleaseId:
                        type: string
                        format: uuid
                        pattern: >-
                          ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                      targetRevision:
                        type: integer
                        minimum: 0
                        exclusiveMinimum: true
                        maximum: 9007199254740991
                      contentHash:
                        type: string
                        pattern: ^[a-f0-9]{64}$
                    required:
                      - menuId
                      - locationId
                      - channel
                      - menuReleaseId
                      - targetRevision
                      - contentHash
                    additionalProperties: false
                evaluatedAt:
                  type: string
                  format: date-time
                  pattern: >-
                    ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
                freshUntil:
                  nullable: true
                  type: string
                  format: date-time
                  pattern: >-
                    ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
              required:
                - fingerprint
                - menuReleases
                - evaluatedAt
                - freshUntil
              additionalProperties: false
            checkedAt:
              nullable: true
              type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
            acknowledgedAt:
              nullable: true
              type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
          required:
            - required
            - outcome
            - reasonCodes
            - changeSet
            - releaseEvidence
            - checkedAt
            - acknowledgedAt
          additionalProperties: false
        adjustmentEvidence:
          nullable: true
          oneOf:
            - type: object
              properties:
                source:
                  type: string
                  enum:
                    - public_promo
                referenceId:
                  type: string
                  minLength: 1
                  maxLength: 128
                sourceRevision:
                  type: integer
                  minimum: 0
                  exclusiveMinimum: true
                  maximum: 9007199254740991
                reservationRevision:
                  nullable: true
                  type: integer
                  minimum: 0
                  exclusiveMinimum: true
                  maximum: 9007199254740991
              required:
                - source
                - referenceId
                - sourceRevision
                - reservationRevision
              additionalProperties: false
            - type: object
              properties:
                source:
                  type: string
                  enum:
                    - loyalty_reward
                referenceId:
                  type: string
                  minLength: 1
                  maxLength: 128
                quotedCartRevision:
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                appliedCartRevision:
                  type: integer
                  minimum: 0
                  exclusiveMinimum: true
                  maximum: 9007199254740991
              required:
                - source
                - referenceId
                - quotedCartRevision
                - appliedCartRevision
              additionalProperties: false
        loyaltyAdjustment:
          nullable: true
          type: object
          properties:
            allocations:
              type: array
              items:
                type: object
                properties:
                  lineId:
                    type: string
                    minLength: 1
                    maxLength: 128
                  amountMinor:
                    type: integer
                    minimum: 0
                    exclusiveMinimum: true
                    maximum: 9007199254740991
                  quantity:
                    type: integer
                    minimum: 0
                    exclusiveMinimum: true
                    maximum: 9007199254740991
                required:
                  - lineId
                  - amountMinor
                additionalProperties: false
            appliedCartRevision:
              type: integer
              minimum: 0
              exclusiveMinimum: true
              maximum: 9007199254740991
            amountMinor:
              type: integer
              minimum: 0
              exclusiveMinimum: true
              maximum: 9007199254740991
            currency:
              type: string
              enum:
                - usd
                - gbp
                - aed
                - aud
            effectType:
              type: string
              enum:
                - order_discount
                - line_discount
                - free_item
            quotedCartRevision:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            rewardId:
              type: string
              minLength: 1
              maxLength: 128
            source:
              type: string
              enum:
                - loyalty_reward
          required:
            - allocations
            - appliedCartRevision
            - amountMinor
            - currency
            - effectType
            - quotedCartRevision
            - rewardId
            - source
          additionalProperties: false
        restaurantDisplayName:
          type: string
        fulfilmentMethod:
          type: string
          enum:
            - takeout
            - table_side
            - room_service
            - delivery
        fulfillmentIdentifier:
          type: string
        metadata:
          type: object
          additionalProperties: {}
        pickupType:
          type: string
          enum:
            - ASAP
            - LATER
        orderDate:
          type: string
        orderTime:
          type: string
        currency:
          type: string
          enum:
            - usd
            - gbp
            - aed
            - aud
        subTotal:
          type: string
          pattern: ^-?\d+(?:\.\d+)?$
        subTotalFormatted:
          type: string
        discountTotal:
          type: string
          pattern: ^-?\d+(?:\.\d+)?$
        discountTotalFormatted:
          type: string
        waiterTipTotal:
          type: string
          pattern: ^-?\d+(?:\.\d+)?$
        waiterTipTotalFormatted:
          type: string
        courierTipTotal:
          type: string
          pattern: ^-?\d+(?:\.\d+)?$
        courierTipTotalFormatted:
          type: string
        taxTotal:
          type: string
          pattern: ^-?\d+(?:\.\d+)?$
        taxTotalFormatted:
          type: string
        taxAndFeeTotal:
          type: string
          pattern: ^-?\d+(?:\.\d+)?$
        taxAndFeeTotalFormatted:
          type: string
        serviceFeeTotal:
          type: string
          pattern: ^-?\d+(?:\.\d+)?$
        serviceFeeTotalFormatted:
          type: string
        fulfillmentMethodFeeTotal:
          type: string
          pattern: ^-?\d+(?:\.\d+)?$
        fulfillmentMethodFeeTotalFormatted:
          type: string
        orderTotal:
          type: string
          pattern: ^-?\d+(?:\.\d+)?$
        orderTotalFormatted:
          type: string
        orderTotalWithServiceFee:
          type: string
          pattern: ^-?\d+(?:\.\d+)?$
        orderTotalWithServiceFeeFormatted:
          type: string
        orderTotalWithServiceFeeAmount:
          type: integer
          minimum: 0
          maximum: 9007199254740991
        enterpriseFeeTotal:
          type: string
          pattern: ^-?\d+(?:\.\d+)?$
        enterpriseFeeTotalFormatted:
          type: string
        subTotalWithoutDiscount:
          type: string
          pattern: ^-?\d+(?:\.\d+)?$
        subTotalWithoutDiscountFormatted:
          type: string
        discountCode:
          type: string
        statementDescriptor:
          type: string
        totalQuantity:
          type: integer
          minimum: 0
          maximum: 9007199254740991
        items:
          type: array
          items:
            $ref: '#/components/schemas/CartItem'
        fees:
          type: object
          properties:
            enterpriseFeeRate:
              type: string
              pattern: ^-?\d+(?:\.\d+)?$
            enterpriseFeeFix:
              type: string
              pattern: ^-?\d+(?:\.\d+)?$
            serviceFeeRate:
              type: string
              pattern: ^-?\d+(?:\.\d+)?$
            serviceFeeFix:
              type: string
              pattern: ^-?\d+(?:\.\d+)?$
            taxRate:
              type: string
              pattern: ^-?\d+(?:\.\d+)?$
            tipRate:
              type: string
              pattern: ^-?\d+(?:\.\d+)?$
            fulfillmentMethodFeeFix:
              type: string
              pattern: ^-?\d+(?:\.\d+)?$
            fulfillmentMethodFeeRate:
              type: string
              pattern: ^-?\d+(?:\.\d+)?$
          required:
            - enterpriseFeeRate
            - enterpriseFeeFix
            - serviceFeeRate
            - serviceFeeFix
            - taxRate
            - tipRate
            - fulfillmentMethodFeeFix
            - fulfillmentMethodFeeRate
          additionalProperties: false
        deliveryInfo:
          nullable: true
          type: object
          properties:
            addressString:
              type: string
            addressData:
              $ref: '#/components/schemas/DeliveryAddress'
          required:
            - addressString
            - addressData
          additionalProperties: {}
        deliveryQuote:
          nullable: true
          type: object
          properties:
            provider:
              type: string
              enum:
                - DOORDASH_DRIVE
            externalDeliveryId:
              type: string
            quoteFingerprint:
              type: string
              pattern: ^[a-f0-9]{64}$
            feeMinor:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            taxMinor:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            courierTipMinor:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            currency:
              type: string
            quotedAt:
              type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
            expiresAt:
              type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
            pickupEstimatedAt:
              type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
            dropoffEstimatedAt:
              type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
            status:
              type: string
            trackingUrl:
              type: string
              format: uri
            supportReference:
              type: string
          required:
            - provider
            - externalDeliveryId
            - quoteFingerprint
            - feeMinor
            - taxMinor
            - courierTipMinor
            - currency
            - quotedAt
            - expiresAt
          additionalProperties: false
        tableServiceInfo:
          nullable: true
          type: object
          properties:
            tableNumber:
              type: string
          additionalProperties: {}
        roomServiceInfo:
          nullable: true
          type: object
          properties:
            lastName:
              type: string
            roomNumber:
              type: string
          additionalProperties: {}
      required:
        - dietaryPreferences
        - foodSummary
        - id
        - locationId
        - merchantId
        - status
        - revision
        - updatedAt
        - expiresAt
        - authorityContext
        - quoteFingerprint
        - quoteExpiresAt
        - catalogRevalidation
        - adjustmentEvidence
        - loyaltyAdjustment
        - restaurantDisplayName
        - fulfilmentMethod
        - fulfillmentIdentifier
        - pickupType
        - orderDate
        - orderTime
        - currency
        - subTotal
        - subTotalFormatted
        - discountTotal
        - discountTotalFormatted
        - waiterTipTotal
        - waiterTipTotalFormatted
        - taxTotal
        - taxTotalFormatted
        - taxAndFeeTotal
        - taxAndFeeTotalFormatted
        - serviceFeeTotal
        - serviceFeeTotalFormatted
        - fulfillmentMethodFeeTotal
        - fulfillmentMethodFeeTotalFormatted
        - orderTotal
        - orderTotalFormatted
        - orderTotalWithServiceFee
        - orderTotalWithServiceFeeFormatted
        - orderTotalWithServiceFeeAmount
        - enterpriseFeeTotal
        - enterpriseFeeTotalFormatted
        - subTotalWithoutDiscount
        - subTotalWithoutDiscountFormatted
        - statementDescriptor
        - totalQuantity
        - items
        - fees
      additionalProperties: false
    CommerceErrorEnvelope:
      type: object
      properties:
        code:
          anyOf:
            - type: string
              enum:
                - VALIDATION_ERROR
                - UNAUTHORIZED
                - CUSTOMER_AUTH_CODE_REJECTED
                - FORBIDDEN
                - NOT_FOUND
                - RATE_LIMITED
                - CART_CONFLICT
                - REQUOTE_REQUIRED
                - RESOURCE_CONFLICT
                - CART_IMMUTABLE
                - IDEMPOTENCY_KEY_REQUIRED
                - IDEMPOTENCY_KEY_REUSED
                - IDEMPOTENCY_IN_PROGRESS
                - DEPENDENCY_UNAVAILABLE
                - INTERNAL_ERROR
            - type: string
              minLength: 1
        message:
          type: string
          minLength: 1
        requestId:
          type: string
          minLength: 8
        details:
          type: object
          additionalProperties: {}
      required:
        - code
        - message
        - requestId
      additionalProperties: false
    StorefrontCartMutationErrorEnvelope:
      oneOf:
        - $ref: '#/components/schemas/StorefrontCartConflictEnvelope'
        - $ref: >-
            #/components/schemas/StorefrontCartMutationNonRevisionConflictEnvelope
    UpdateCartDietaryPreferencesRequest:
      type: object
      properties:
        preferences:
          maxItems: 2
          type: array
          items:
            type: string
            enum:
              - vegetarian
              - vegan
        avoidAllergenIds:
          maxItems: 14
          type: array
          items:
            type: string
            enum:
              - milk
              - egg
              - fish
              - crustacean_shellfish
              - tree_nuts
              - peanut
              - wheat
              - soy
              - sesame
              - celery
              - mustard
              - lupin
              - molluscs
              - sulphites
      required:
        - preferences
        - avoidAllergenIds
      additionalProperties: false
    CartFoodSummary:
      type: object
      properties:
        unavailableLineIds:
          maxItems: 10000
          type: array
          items:
            type: string
            minLength: 1
            maxLength: 128
        totals:
          type: object
          properties:
            caloriesKcal:
              nullable: true
              type: number
              minimum: 0
            proteinGrams:
              nullable: true
              type: number
              minimum: 0
            carbohydrateGrams:
              nullable: true
              type: number
              minimum: 0
            fatGrams:
              nullable: true
              type: number
              minimum: 0
            fiberGrams:
              nullable: true
              type: number
              minimum: 0
            sugarGrams:
              nullable: true
              type: number
              minimum: 0
            saturatedFatGrams:
              nullable: true
              type: number
              minimum: 0
            sodiumMilligrams:
              nullable: true
              type: number
              minimum: 0
          required:
            - caloriesKcal
            - proteinGrams
            - carbohydrateGrams
            - fatGrams
            - fiberGrams
            - sugarGrams
            - saturatedFatGrams
            - sodiumMilligrams
          additionalProperties: false
        completeness:
          type: string
          enum:
            - complete
            - partial
            - unknown
        missing:
          maxItems: 10000
          type: array
          items:
            type: object
            properties:
              entityId:
                type: string
                format: uuid
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              nutrient:
                type: string
                enum:
                  - caloriesKcal
                  - proteinGrams
                  - carbohydrateGrams
                  - fatGrams
                  - fiberGrams
                  - sugarGrams
                  - saturatedFatGrams
                  - sodiumMilligrams
              cartItemId:
                type: string
                minLength: 1
                maxLength: 128
            required:
              - entityId
              - nutrient
              - cartItemId
            additionalProperties: false
        warnings:
          maxItems: 10000
          type: array
          items:
            type: object
            properties:
              code:
                type: string
                enum:
                  - DIETARY_CONFLICT
                  - ALLERGEN_PRESENT
                  - ALLERGEN_POSSIBLE
                  - DIETARY_INFORMATION_UNKNOWN
              entityId:
                type: string
                format: uuid
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              preferenceId:
                anyOf:
                  - type: string
                    enum:
                      - vegetarian
                      - vegan
                  - type: string
                    enum:
                      - milk
                      - egg
                      - fish
                      - crustacean_shellfish
                      - tree_nuts
                      - peanut
                      - wheat
                      - soy
                      - sesame
                      - celery
                      - mustard
                      - lupin
                      - molluscs
                      - sulphites
              selectionPath:
                maxItems: 80
                type: array
                items:
                  type: string
                  format: uuid
                  pattern: >-
                    ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              cartItemId:
                type: string
                minLength: 1
                maxLength: 128
            required:
              - code
              - entityId
              - preferenceId
              - selectionPath
              - cartItemId
            additionalProperties: false
      required:
        - unavailableLineIds
        - totals
        - completeness
        - missing
        - warnings
      additionalProperties: false
    CateringPaymentPresentation:
      oneOf:
        - type: object
          properties:
            state:
              type: string
              enum:
                - ready
            reference:
              type: string
            restaurantName:
              type: string
            publicContact:
              type: object
              properties:
                phone:
                  nullable: true
                  type: string
                email:
                  nullable: true
                  type: string
              required:
                - phone
                - email
              additionalProperties: false
            quoteId:
              type: string
              format: uuid
              pattern: >-
                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            quoteVersion:
              type: integer
              minimum: 0
              exclusiveMinimum: true
              maximum: 9007199254740991
            amendmentVersion:
              nullable: true
              type: integer
              minimum: 0
              exclusiveMinimum: true
              maximum: 9007199254740991
            eventSnapshot:
              type: object
              properties:
                eventDate:
                  type: string
                serviceTime:
                  type: string
                headcount:
                  type: object
                  properties:
                    guests:
                      type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    approximate:
                      type: boolean
                  required:
                    - guests
                    - approximate
                  additionalProperties: false
                serviceStyle:
                  type: string
                  enum:
                    - pickup
                    - drop_off
                    - drop_off_with_setup
                serviceAddress:
                  nullable: true
                  type: string
                eventStartsAt:
                  nullable: true
                  type: string
                  format: date-time
                  pattern: >-
                    ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
                timeZone:
                  nullable: true
                  type: string
                  minLength: 1
                  maxLength: 100
              required:
                - eventDate
                - serviceTime
                - headcount
                - serviceStyle
                - serviceAddress
                - eventStartsAt
                - timeZone
              additionalProperties: false
            timezone:
              type: string
              minLength: 1
            currency:
              type: string
              pattern: ^[A-Z]{3}$
            lines:
              minItems: 1
              maxItems: 500
              type: array
              items:
                type: object
                properties:
                  lineId:
                    type: string
                    minLength: 1
                    maxLength: 255
                  kind:
                    type: string
                    enum:
                      - menu
                      - one_off
                  name:
                    type: string
                  quantity:
                    type: string
                    pattern: ^(?:0|[1-9]\d{0,4})(?:\.\d{1,6})?$
                  unit:
                    type: string
                    enum:
                      - person
                      - item
                      - dozen
                      - tray
                      - pack
                      - lb
                      - oz
                      - kg
                      - g
                      - gallon
                      - quart
                      - liter
                      - ml
                      - fl_oz
                  unitPrice:
                    type: string
                    pattern: ^-?\d+(?:\.\d+)?$
                  lineTotal:
                    type: string
                    pattern: ^-?\d+(?:\.\d+)?$
                  note:
                    nullable: true
                    type: string
                  choices:
                    maxItems: 50
                    type: array
                    items:
                      $ref: '#/components/schemas/CateringPresentationChoiceGroup'
                required:
                  - lineId
                  - kind
                  - name
                  - quantity
                  - unit
                  - unitPrice
                  - lineTotal
                  - note
                  - choices
                additionalProperties: false
            totals:
              type: object
              properties:
                subtotal:
                  type: string
                  pattern: ^-?\d+(?:\.\d+)?$
                discount:
                  type: string
                  pattern: ^-?\d+(?:\.\d+)?$
                taxTotal:
                  type: string
                  pattern: ^-?\d+(?:\.\d+)?$
                serviceFeeTotal:
                  type: string
                  pattern: ^-?\d+(?:\.\d+)?$
                total:
                  type: string
                  pattern: ^-?\d+(?:\.\d+)?$
              required:
                - subtotal
                - discount
                - taxTotal
                - serviceFeeTotal
                - total
              additionalProperties: false
            payment:
              type: object
              properties:
                paymentId:
                  type: string
                  format: uuid
                  pattern: >-
                    ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                kind:
                  type: string
                  enum:
                    - deposit
                    - balance
                    - full
                    - none
                amount:
                  type: string
                  pattern: ^-?\d+(?:\.\d+)?$
                tax:
                  type: string
                  pattern: ^-?\d+(?:\.\d+)?$
                serviceFee:
                  type: string
                  pattern: ^-?\d+(?:\.\d+)?$
                total:
                  type: string
                  pattern: ^-?\d+(?:\.\d+)?$
                balanceAfterPaymentTotal:
                  type: string
                  pattern: ^-?\d+(?:\.\d+)?$
              required:
                - paymentId
                - kind
                - amount
                - tax
                - serviceFee
                - total
                - balanceAfterPaymentTotal
              additionalProperties: false
            financialSummary:
              oneOf:
                - type: object
                  properties:
                    state:
                      type: string
                      enum:
                        - unavailable
                    reason:
                      type: string
                      enum:
                        - not_accepted
                        - settled_without_acceptance
                        - acceptance_unreadable
                        - due_date_unresolvable
                        - evidence_unavailable
                  required:
                    - state
                    - reason
                  additionalProperties: false
                - type: object
                  properties:
                    state:
                      type: string
                      enum:
                        - known
                    currency:
                      type: string
                      pattern: ^[A-Z]{3}$
                    acceptedQuoteId:
                      type: string
                      format: uuid
                      pattern: >-
                        ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                    total:
                      type: string
                      pattern: ^\d+\.\d{2}$
                    paidTotal:
                      type: string
                      pattern: ^\d+\.\d{2}$
                    refundedTotal:
                      type: string
                      pattern: ^\d+\.\d{2}$
                    outstandingTotal:
                      type: string
                      pattern: ^\d+\.\d{2}$
                    balanceDueAt:
                      nullable: true
                      type: string
                      format: date-time
                      pattern: >-
                        ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
                    paymentState:
                      type: string
                      enum:
                        - unpaid
                        - partially_paid
                        - paid
                        - processing
                        - review_required
                  required:
                    - state
                    - currency
                    - acceptedQuoteId
                    - total
                    - paidTotal
                    - refundedTotal
                    - outstandingTotal
                    - balanceDueAt
                    - paymentState
                  additionalProperties: false
            currentBooking:
              type: object
              properties:
                status:
                  type: string
                  enum:
                    - enquiry
                    - quoted
                    - confirmed
                    - locked
                    - completed
                    - cancelled
                    - declined
                    - expired
                revision:
                  type: integer
                  minimum: 0
                  maximum: 9007199254740991
                change:
                  type: string
                  enum:
                    - none
                    - changed
                    - cancelled
                    - unavailable
              required:
                - status
                - revision
                - change
              additionalProperties: false
          required:
            - state
            - reference
            - restaurantName
            - publicContact
            - quoteId
            - quoteVersion
            - amendmentVersion
            - eventSnapshot
            - timezone
            - currency
            - lines
            - totals
            - payment
            - financialSummary
            - currentBooking
          additionalProperties: false
        - type: object
          properties:
            state:
              type: string
              enum:
                - unavailable
            reason:
              type: string
              enum:
                - booking_unavailable
                - menu_evidence_unavailable
                - restaurant_unavailable
                - presentation_unavailable
          required:
            - state
            - reason
          additionalProperties: false
    CartItem:
      type: object
      properties:
        food:
          $ref: '#/components/schemas/CartLineFoodEvidence'
        id:
          type: string
          minLength: 1
          maxLength: 128
        productId:
          type: string
          minLength: 1
          maxLength: 128
        name:
          type: string
        description:
          type: string
        imageUrl:
          type: string
        price:
          type: string
          pattern: ^-?\d+(?:\.\d+)?$
        priceFormatted:
          type: string
        quantity:
          type: integer
          minimum: 0
          maximum: 9007199254740991
        total:
          type: string
          pattern: ^-?\d+(?:\.\d+)?$
        totalFormatted:
          type: string
        discount:
          type: string
          pattern: ^-?\d+(?:\.\d+)?$
        discountFormatted:
          type: string
        categoryId:
          nullable: true
          type: string
          minLength: 1
          maxLength: 128
        specialInstructions:
          type: string
        itemUnavailableAction:
          type: string
          enum:
            - remove_item
            - cancel_entire_order
        selections:
          maxItems: 50
          type: array
          items:
            $ref: '#/components/schemas/CartModifierGroup'
        product:
          type: object
          properties:
            id:
              type: string
              minLength: 1
              maxLength: 128
            name:
              type: string
            price:
              type: string
              pattern: ^-?\d+(?:\.\d+)?$
          required:
            - id
      required:
        - food
        - id
        - productId
        - name
        - description
        - imageUrl
        - price
        - priceFormatted
        - quantity
        - total
        - totalFormatted
        - discount
        - discountFormatted
        - categoryId
        - itemUnavailableAction
        - selections
      additionalProperties: {}
    DeliveryAddress:
      type: object
      properties:
        street:
          type: string
          minLength: 1
        streetOptional:
          default: ''
          type: string
        city:
          type: string
          minLength: 1
        state:
          type: string
          minLength: 1
        zipCode:
          type: string
          minLength: 1
        country:
          type: string
          enum:
            - United States
            - United Arab Emirates
            - Australia
            - United Kingdom
        lat:
          type: number
          minimum: -90
          maximum: 90
        lng:
          type: number
          minimum: -180
          maximum: 180
      required:
        - street
        - city
        - state
        - zipCode
        - country
        - lat
        - lng
      additionalProperties: false
    StorefrontCartConflictEnvelope:
      type: object
      properties:
        code:
          type: string
          enum:
            - CART_CONFLICT
        message:
          type: string
          minLength: 1
        requestId:
          type: string
          minLength: 8
        details:
          type: object
          properties:
            expectedRevision:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            currentRevision:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            currentEtag:
              type: string
              pattern: ^"cart-(?:0|[1-9]\d*)"$
            cart:
              $ref: '#/components/schemas/StorefrontCart'
          required:
            - expectedRevision
            - currentRevision
            - currentEtag
            - cart
          additionalProperties: false
      required:
        - code
        - message
        - requestId
        - details
      additionalProperties: false
    StorefrontCartMutationNonRevisionConflictEnvelope:
      type: object
      properties:
        code:
          type: string
          enum:
            - REQUOTE_REQUIRED
            - RESOURCE_CONFLICT
            - CART_IMMUTABLE
            - IDEMPOTENCY_KEY_REUSED
            - IDEMPOTENCY_IN_PROGRESS
        message:
          type: string
          minLength: 1
        requestId:
          type: string
          minLength: 8
        details:
          type: object
          additionalProperties: {}
      required:
        - code
        - message
        - requestId
      additionalProperties: false
    CateringPresentationChoiceGroup:
      type: object
      properties:
        name:
          type: string
          minLength: 1
        options:
          minItems: 1
          maxItems: 200
          type: array
          items:
            type: object
            properties:
              name:
                type: string
                minLength: 1
              quantity:
                type: integer
                minimum: 0
                exclusiveMinimum: true
                maximum: 99
              children:
                maxItems: 50
                type: array
                items:
                  $ref: '#/components/schemas/CateringPresentationChoiceGroup'
            required:
              - name
              - quantity
              - children
            additionalProperties: false
      required:
        - name
        - options
      additionalProperties: false
    CartLineFoodEvidence:
      oneOf:
        - type: object
          properties:
            state:
              type: string
              enum:
                - configured
            result:
              allOf:
                - $ref: '#/components/schemas/ConfiguredFoodEvaluation'
          required:
            - state
            - result
          additionalProperties: false
        - type: object
          properties:
            state:
              type: string
              enum:
                - unavailable
            reason:
              type: string
              enum:
                - HISTORICAL_MENU_RELEASE_UNAVAILABLE
                - MENU_RELEASE_CHANGED
                - CONFIGURATION_UNAVAILABLE
            source:
              nullable: true
              type: object
              properties:
                menuId:
                  type: string
                  format: uuid
                  pattern: >-
                    ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                locationId:
                  type: string
                  format: uuid
                  pattern: >-
                    ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                channel:
                  type: string
                  enum:
                    - online
                    - catering
                kind:
                  type: string
                  enum:
                    - released
                menuReleaseId:
                  type: string
                  format: uuid
                  pattern: >-
                    ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              required:
                - menuId
                - locationId
                - channel
                - kind
                - menuReleaseId
              additionalProperties: false
            result:
              type: string
              nullable: true
              enum:
                - null
          required:
            - state
            - reason
            - source
            - result
          additionalProperties: false
    CartModifierGroup:
      type: object
      properties:
        id:
          type: string
          minLength: 1
          maxLength: 128
        name:
          type: string
        rule:
          type: object
          properties:
            min:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            max:
              type: integer
              minimum: 0
              maximum: 9007199254740991
          required:
            - min
            - max
          additionalProperties: false
        items:
          maxItems: 50
          type: array
          items:
            type: object
            properties:
              id:
                type: string
                minLength: 1
                maxLength: 128
              name:
                type: string
              price:
                type: string
                pattern: ^-?\d+(?:\.\d+)?$
              priceFormatted:
                type: string
              quantity:
                type: integer
                minimum: 1
                maximum: 99
              children:
                maxItems: 20
                type: array
                items:
                  $ref: '#/components/schemas/CartModifierGroup'
            required:
              - id
              - name
              - price
              - priceFormatted
              - quantity
            additionalProperties: false
      required:
        - id
        - name
        - rule
        - items
      additionalProperties: false
    ConfiguredFoodEvaluation:
      type: object
      properties:
        source:
          oneOf:
            - type: object
              properties:
                menuId:
                  type: string
                  format: uuid
                  pattern: >-
                    ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                locationId:
                  type: string
                  format: uuid
                  pattern: >-
                    ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                channel:
                  type: string
                  enum:
                    - online
                    - catering
                kind:
                  type: string
                  enum:
                    - released
                menuReleaseId:
                  type: string
                  format: uuid
                  pattern: >-
                    ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              required:
                - menuId
                - locationId
                - channel
                - kind
                - menuReleaseId
              additionalProperties: false
            - type: object
              properties:
                menuId:
                  type: string
                  format: uuid
                  pattern: >-
                    ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                locationId:
                  type: string
                  format: uuid
                  pattern: >-
                    ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                channel:
                  type: string
                  enum:
                    - online
                    - catering
                kind:
                  type: string
                  enum:
                    - draft
                draftRevision:
                  type: integer
                  minimum: 0
                  exclusiveMinimum: true
                  maximum: 9007199254740991
              required:
                - menuId
                - locationId
                - channel
                - kind
                - draftRevision
              additionalProperties: false
        contributions:
          maxItems: 10000
          type: array
          items:
            type: object
            properties:
              entityId:
                type: string
                format: uuid
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              selectionPath:
                maxItems: 80
                type: array
                items:
                  type: string
                  format: uuid
                  pattern: >-
                    ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              fraction:
                type: object
                properties:
                  numerator:
                    type: number
                    minimum: 0
                  denominator:
                    type: number
                    minimum: 0
                    exclusiveMinimum: true
                required:
                  - numerator
                  - denominator
                additionalProperties: false
              provenance:
                nullable: true
                oneOf:
                  - type: object
                    properties:
                      kind:
                        type: string
                        enum:
                          - entered
                    required:
                      - kind
                    additionalProperties: false
                  - type: object
                    properties:
                      kind:
                        type: string
                        enum:
                          - provider
                      provider:
                        type: string
                        enum:
                          - square
                          - clover
                          - toast
                      revision:
                        type: string
                        minLength: 1
                        maxLength: 128
                    required:
                      - kind
                      - provider
                      - revision
                    additionalProperties: false
                  - type: object
                    properties:
                      kind:
                        type: string
                        enum:
                          - recipe
                      servingsYield:
                        type: number
                        minimum: 0
                        exclusiveMinimum: true
                      components:
                        minItems: 1
                        maxItems: 100
                        type: array
                        items:
                          type: object
                          properties:
                            entityId:
                              type: string
                              format: uuid
                              pattern: >-
                                ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                            fraction:
                              type: object
                              properties:
                                numerator:
                                  type: number
                                  minimum: 0
                                denominator:
                                  type: number
                                  minimum: 0
                                  exclusiveMinimum: true
                              required:
                                - numerator
                                - denominator
                              additionalProperties: false
                          required:
                            - entityId
                            - fraction
                          additionalProperties: false
                    required:
                      - kind
                      - servingsYield
                      - components
                    additionalProperties: false
              nutrients:
                type: object
                properties:
                  caloriesKcal:
                    nullable: true
                    type: number
                    minimum: 0
                  proteinGrams:
                    nullable: true
                    type: number
                    minimum: 0
                  carbohydrateGrams:
                    nullable: true
                    type: number
                    minimum: 0
                  fatGrams:
                    nullable: true
                    type: number
                    minimum: 0
                  fiberGrams:
                    nullable: true
                    type: number
                    minimum: 0
                  sugarGrams:
                    nullable: true
                    type: number
                    minimum: 0
                  saturatedFatGrams:
                    nullable: true
                    type: number
                    minimum: 0
                  sodiumMilligrams:
                    nullable: true
                    type: number
                    minimum: 0
                required:
                  - caloriesKcal
                  - proteinGrams
                  - carbohydrateGrams
                  - fatGrams
                  - fiberGrams
                  - sugarGrams
                  - saturatedFatGrams
                  - sodiumMilligrams
                additionalProperties: false
            required:
              - entityId
              - selectionPath
              - fraction
              - provenance
              - nutrients
            additionalProperties: false
        serving:
          type: object
          properties:
            label:
              type: string
              minLength: 1
              maxLength: 255
            grams:
              nullable: true
              type: number
              minimum: 0
              exclusiveMinimum: true
          required:
            - label
            - grams
          additionalProperties: false
        quantity:
          type: object
          properties:
            unit:
              type: string
              enum:
                - serving
                - person
                - item
                - dozen
                - tray
                - pack
                - lb
                - oz
                - kg
                - g
                - gallon
                - quart
                - liter
                - ml
                - fl_oz
            count:
              type: number
              minimum: 0
              exclusiveMinimum: true
              maximum: 10000
          required:
            - unit
            - count
          additionalProperties: false
        trayYield:
          nullable: true
          type: object
          properties:
            servingsPerTray:
              type: number
              minimum: 0
              exclusiveMinimum: true
          required:
            - servingsPerTray
          additionalProperties: false
        perServing:
          type: object
          properties:
            caloriesKcal:
              nullable: true
              type: number
              minimum: 0
            proteinGrams:
              nullable: true
              type: number
              minimum: 0
            carbohydrateGrams:
              nullable: true
              type: number
              minimum: 0
            fatGrams:
              nullable: true
              type: number
              minimum: 0
            fiberGrams:
              nullable: true
              type: number
              minimum: 0
            sugarGrams:
              nullable: true
              type: number
              minimum: 0
            saturatedFatGrams:
              nullable: true
              type: number
              minimum: 0
            sodiumMilligrams:
              nullable: true
              type: number
              minimum: 0
          required:
            - caloriesKcal
            - proteinGrams
            - carbohydrateGrams
            - fatGrams
            - fiberGrams
            - sugarGrams
            - saturatedFatGrams
            - sodiumMilligrams
          additionalProperties: false
        perTray:
          nullable: true
          type: object
          properties:
            caloriesKcal:
              nullable: true
              type: number
              minimum: 0
            proteinGrams:
              nullable: true
              type: number
              minimum: 0
            carbohydrateGrams:
              nullable: true
              type: number
              minimum: 0
            fatGrams:
              nullable: true
              type: number
              minimum: 0
            fiberGrams:
              nullable: true
              type: number
              minimum: 0
            sugarGrams:
              nullable: true
              type: number
              minimum: 0
            saturatedFatGrams:
              nullable: true
              type: number
              minimum: 0
            sodiumMilligrams:
              nullable: true
              type: number
              minimum: 0
          required:
            - caloriesKcal
            - proteinGrams
            - carbohydrateGrams
            - fatGrams
            - fiberGrams
            - sugarGrams
            - saturatedFatGrams
            - sodiumMilligrams
          additionalProperties: false
        lineTotal:
          type: object
          properties:
            caloriesKcal:
              nullable: true
              type: number
              minimum: 0
            proteinGrams:
              nullable: true
              type: number
              minimum: 0
            carbohydrateGrams:
              nullable: true
              type: number
              minimum: 0
            fatGrams:
              nullable: true
              type: number
              minimum: 0
            fiberGrams:
              nullable: true
              type: number
              minimum: 0
            sugarGrams:
              nullable: true
              type: number
              minimum: 0
            saturatedFatGrams:
              nullable: true
              type: number
              minimum: 0
            sodiumMilligrams:
              nullable: true
              type: number
              minimum: 0
          required:
            - caloriesKcal
            - proteinGrams
            - carbohydrateGrams
            - fatGrams
            - fiberGrams
            - sugarGrams
            - saturatedFatGrams
            - sodiumMilligrams
          additionalProperties: false
        completeness:
          type: string
          enum:
            - complete
            - partial
            - unknown
        missing:
          maxItems: 10000
          type: array
          items:
            type: object
            properties:
              entityId:
                type: string
                format: uuid
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              nutrient:
                type: string
                enum:
                  - caloriesKcal
                  - proteinGrams
                  - carbohydrateGrams
                  - fatGrams
                  - fiberGrams
                  - sugarGrams
                  - saturatedFatGrams
                  - sodiumMilligrams
            required:
              - entityId
              - nutrient
            additionalProperties: false
        warnings:
          maxItems: 10000
          type: array
          items:
            type: object
            properties:
              code:
                type: string
                enum:
                  - DIETARY_CONFLICT
                  - ALLERGEN_PRESENT
                  - ALLERGEN_POSSIBLE
                  - DIETARY_INFORMATION_UNKNOWN
              entityId:
                type: string
                format: uuid
                pattern: >-
                  ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
              preferenceId:
                anyOf:
                  - type: string
                    enum:
                      - vegetarian
                      - vegan
                  - type: string
                    enum:
                      - milk
                      - egg
                      - fish
                      - crustacean_shellfish
                      - tree_nuts
                      - peanut
                      - wheat
                      - soy
                      - sesame
                      - celery
                      - mustard
                      - lupin
                      - molluscs
                      - sulphites
              selectionPath:
                maxItems: 80
                type: array
                items:
                  type: string
                  format: uuid
                  pattern: >-
                    ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            required:
              - code
              - entityId
              - preferenceId
              - selectionPath
            additionalProperties: false
      required:
        - source
        - contributions
        - serving
        - quantity
        - trayYield
        - perServing
        - perTray
        - lineTotal
        - completeness
        - missing
        - warnings
      additionalProperties: false
  securitySchemes:
    StorefrontCartCapability:
      type: apiKey
      in: header
      name: X-Cart-Token
      description: Purpose-limited capability returned for a guest cart.
    StorefrontCustomerAuth:
      type: http
      scheme: bearer
      bearerFormat: opaque
      description: >-
        Merchant-bound opaque customer access capability returned by fresh code
        verification or refresh.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.