> ## Documentation Index
> Fetch the complete documentation index at: https://api-doc.xmenu.it/llms.txt
> Use this file to discover all available pages before exploring further.

# Anteprima ordine

> Valida un ordine senza crearlo e restituisce il preventivo calcolato (totale, costo di consegna e coupon applicati, inclusi quelli automatici). Accetta lo stesso payload della creazione ordine.

<Badge color="blue" icon="key">`write:orders`</Badge>


## OpenAPI

````yaml openapi-it.json POST /order/preview
openapi: 3.1.0
info:
  title: xMenu API
  description: API Pubblica xMenu - Endpoint REST e notifiche webhook
  version: 1.0.0
servers:
  - url: https://app.xmenu.it/api
    description: xMenu API Production
security: []
paths:
  /order/preview:
    post:
      tags:
        - Inserimento Ordine
      summary: Anteprima ordine
      description: >-
        Valida un ordine senza crearlo e restituisce il preventivo calcolato
        (totale, costo di consegna e coupon applicati, inclusi quelli
        automatici). Accetta lo stesso payload della creazione ordine.
      operationId: orderPreview
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OrderRequest'
      responses:
        '200':
          description: Risposta anteprima ordine
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OrderPreviewResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
      security:
        - clientId: []
          clientSecret: []
        - oauth2: []
components:
  schemas:
    OrderRequest:
      type: object
      required:
        - client
        - dmethod
        - payment_method
        - details
      properties:
        subrestaurant_uid:
          type: string
          description: >-
            Identificatore punto vendita. Obbligatorio per ristoranti
            multi-locale
        client:
          type: object
          required:
            - first_name
          properties:
            first_name:
              type: string
              description: Nome cliente
            last_name:
              type: string
              description: Cognome cliente
            email:
              type: string
              description: Email cliente
            phone:
              type: string
              description: Telefono cliente
        dmethod:
          type: string
          description: >-
            Modalità di consegna:

            - `0` = ritiro presso il punto vendita

            - `1` = consegna a domicilio

            - `0t` = al tavolo

            - `20` = ritiro presso punto di ritiro

            - `0e-{id}` = evento (dove {id} è l'ID dell'evento)

            - `dcf-{id}` = modalità personalizzata (dove {id} è l'ID della
            modalità)
        language:
          type: string
          description: >-
            Codice lingua ISO 639-1; di default viene utilizzato quello
            impostato nelle impostazioni del ristorante
        pickup:
          type: object
          required:
            - date
          description: Dati ritiro. Obbligatorio per `dmethod`=0
          properties:
            date:
              type: string
              format: date-time
              description: Data e ora desiderata per il ritiro
        delivery:
          type: object
          required:
            - date
            - address
          description: Dati consegna. Obbligatorio per `dmethod`=1
          properties:
            date:
              type: string
              format: date-time
              description: Data e ora desiderata per la consegna
            address:
              type: object
              required:
                - place_id
              properties:
                place_id:
                  type: string
                  description: Identificatore indirizzo dalla validazione
                doorbell:
                  type: string
                  description: Citofono
                floor:
                  type: string
                  description: Piano
        payment_method:
          type: string
          enum:
            - cash
            - invoice
            - external
          description: |-
            Metodo di pagamento:
            - `cash` = contanti
            - `invoice` = fattura
            - `external` = gestito esternamente
        payment_method_sub:
          type: string
          description: Sotto-metodo di pagamento. Obbligatorio se payment_method=cash
        details:
          type: array
          description: Articoli dell'ordine (prodotti con quantità/opzioni)
          items:
            type: object
            required:
              - product
              - quantity
            properties:
              product:
                type: object
                required:
                  - uid
                properties:
                  uid:
                    type: string
                    description: ID prodotto
              quantity:
                type: integer
                description: Quantità prodotto
              notes:
                type: string
                description: Note specifiche per l'articolo
              options:
                type: array
                description: Personalizzazioni selezionate con valori
                items:
                  type: object
                  required:
                    - uid
                    - values
                  properties:
                    uid:
                      type: string
                      description: Identificatore univoco opzione
                    values:
                      type: array
                      description: >-
                        Valori opzione selezionati. Per opzioni a scelta
                        singola, contiene un elemento; per scelta multipla,
                        contiene gli elementi selezionati
                      items:
                        type: object
                        required:
                          - uid
                        properties:
                          uid:
                            type: string
                            description: Identificatore univoco valore opzione
                          quantity:
                            type: integer
                            description: 'Quantità del valore opzione. Default: 1'
        coupon:
          type: object
          required:
            - code
          description: Coupon da applicare all'ordine.
          properties:
            code:
              type: string
              description: Codice coupon da applicare.
        notes:
          type: string
          description: Note generali ordine
        creator:
          type: string
          enum:
            - customer
            - restaurant
          description: >-
            Origine ordine:

            - `customer` = ordine online effettuato dal cliente (default)

            - `restaurant` = ordine telefonico gestito dal ristorante per conto
            del cliente
    OrderPreviewResponse:
      type: object
      required:
        - success
      properties:
        success:
          type: boolean
          description: >-
            Risultato dell'operazione: `true` se l'ordine è valido, `false` se è
            fallita
        error:
          type: string
          description: >-
            Codice errore se la validazione è fallita (stessi codici della
            creazione ordine, esclusi quelli generati durante l'inoltro
            dell'ordine). Valori possibili:

            - `VALIDATION_ERROR` = i dati della richiesta non hanno superato la
            validazione (parametri mancanti o non validi, orario di
            ritiro/consegna scelto non più disponibile, locale chiuso, importo
            minimo d'ordine non raggiunto, ...) - vedi il campo `message` per i
            dettagli

            - `PRODUCT_NOT_FOUND` = prodotto non trovato

            - `PRODUCT_NOT_AVAILABLE` = prodotto non disponibile

            - `PRODUCT_ERROR` = errore durante l'aggiunta del prodotto
            all'ordine - vedi il campo `message` per i dettagli

            - `OPTION_VALUE_NOT_FOUND` = valore opzione non trovato

            - `INVALID_ADDRESS` = indirizzo non valido, incompleto o non trovato

            - `ADDRESS_NOT_SERVED` = indirizzo fuori dalla zona di servizio

            - `DELIVERY_NOT_AVAILABLE` = servizio di consegna non disponibile

            - `EXTERNAL_SERVICE_ERROR` = il servizio esterno di
            geocodifica/calcolo distanze è temporaneamente non disponibile

            - `COUPON_ERROR` = errore di applicazione coupon

            - `SUBRESTAURANT_NOT_FOUND` = locale non trovato


            Vedi [Codici errore](/docs/it/overview/error-codes) per i codici
            errore generali che possono comunque verificarsi.
        message:
          type: string
          description: Descrizione leggibile dell'errore se la validazione è fallita
        order:
          type: object
          description: >-
            Preventivo dell'ordine calcolato (presente solo se success = true).
            Nessun ordine viene creato.
          required:
            - total
          properties:
            total:
              type: number
              format: double
              description: Totale ordine stimato calcolato dal sistema
            delivery_fee:
              type: number
              format: double
              description: Costo di consegna
            pickup_date:
              type: string
              format: date-time
              description: Data e orario di ritiro presso punto vendita
            delivery_date:
              type: string
              format: date-time
              description: Data e orario di consegna a domicilio
            coupon:
              $ref: '#/components/schemas/Coupon'
              description: Coupon applicato (automatico o manuale)
    Coupon:
      type: object
      description: Dettagli del coupon sconto applicato
      required:
        - code
        - description
        - discount
        - auto
      properties:
        code:
          type: string
          description: Codice coupon
        description:
          type: string
          description: Descrizione del coupon
        discount:
          type: number
          description: Importo dello sconto
        auto:
          type: boolean
          description: Indica se il coupon è stato applicato automaticamente
  responses:
    Unauthorized:
      description: Autenticazione fallita.
      content:
        application/json:
          schema:
            oneOf:
              - type: object
                description: >-
                  Formato errore standard (quando si usa autenticazione API Key
                  o Client ID/Secret)
                required:
                  - success
                  - error
                properties:
                  success:
                    type: boolean
                    enum:
                      - false
                    description: Sempre false per gli errori
                  error:
                    type: string
                    enum:
                      - RESTAURANT_NOT_FOUND
                      - INVALID_KEY
                      - INVALID_AUTH
                    description: Codice errore
                  message:
                    type: string
                    description: Descrizione errore leggibile
              - type: object
                description: >-
                  Formato errore OAuth (quando si usa l'autenticazione Bearer
                  token)
                required:
                  - error
                properties:
                  error:
                    type: string
                    enum:
                      - invalid_token
                      - invalid_request
                    description: Codice errore OAuth (RFC 6749)
                  error_description:
                    type: string
                    description: Descrizione errore leggibile
          examples:
            standard:
              summary: Formato errore standard (API Key / Client ID+Secret)
              value:
                success: false
                error: INVALID_KEY
                message: La chiave API fornita non è valida
            oauth:
              summary: Formato errore OAuth (Bearer token)
              value:
                error: invalid_token
                error_description: Access token non valido o scaduto
    Forbidden:
      description: Autorizzazione fallita - permessi insufficienti o accesso negato.
      content:
        application/json:
          schema:
            oneOf:
              - type: object
                description: >-
                  Formato errore standard (quando si usa autenticazione API Key
                  o Client ID/Secret)
                required:
                  - success
                  - error
                properties:
                  success:
                    type: boolean
                    enum:
                      - false
                    description: Sempre false per gli errori
                  error:
                    type: string
                    enum:
                      - API_DISABLED
                      - INSUFFICIENT_SCOPE
                      - UNAUTHORIZED
                    description: Codice errore
                  message:
                    type: string
                    description: Descrizione errore leggibile
              - type: object
                description: >-
                  Formato errore OAuth (quando si usa l'autenticazione Bearer
                  token)
                required:
                  - error
                properties:
                  error:
                    type: string
                    enum:
                      - insufficient_scope
                      - invalid_request
                    description: Codice errore OAuth (RFC 6749)
                  error_description:
                    type: string
                    description: Descrizione errore leggibile
          examples:
            standard:
              summary: Formato errore standard (API Key / Client ID+Secret)
              value:
                success: false
                error: API_DISABLED
                message: L'accesso API non è abilitato per il ristorante
            oauth:
              summary: Formato errore OAuth (Bearer token)
              value:
                error: insufficient_scope
                error_description: 'Permessi mancanti richiesti: write:orders'
  securitySchemes:
    clientId:
      type: apiKey
      in: header
      name: X-Client-Id
      description: >-
        Client ID per l'autenticazione API Client (deve essere usato insieme al
        Client Secret)
    clientSecret:
      type: apiKey
      in: header
      name: X-Client-Secret
      description: >-
        Client Secret per l'autenticazione API Client (deve essere usato insieme
        al Client ID)
    oauth2:
      type: oauth2
      flows:
        clientCredentials:
          tokenUrl: https://app.xmenu.it/oauth/token
          scopes: {}
      description: >-
        Autenticazione OAuth 2.0 utilizzando il flusso client credentials. Il
        token di accesso deve essere incluso nell'header Authorization come
        Bearer token.

````