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

# API pubblica di cancellazione

> Aggiungi la cancellazione degli ordini ovunque nel tuo store Shopify. Crea pulsanti di annullamento in email, pagine di supporto, chatbot o moduli personalizzati utilizzando il nostro endpoint API pubblico.

<Note>
  L'API pubblica di cancellazione ti permette di aggiungere la cancellazione self-service degli ordini ovunque — email post-acquisto, pagine di supporto, chatbot o moduli personalizzati. Nessun embed dell'app richiesto.
</Note>

## Perché usare l'API di cancellazione

<CardGroup cols={2}>
  <Card title="Cancellazione ovunque" icon="globe" color="#8b5cf6">
    Aggiungi pulsanti di annullamento alle email, pagine FAQ, flussi di chatbot o qualsiasi interfaccia personalizzata al di fuori del tuo store.
  </Card>

  <Card title="Nessun embed dell'app necessario" icon="code" color="#10b981">
    Funziona indipendentemente dal portale clienti Revize. Basta chiamare l'endpoint API.
  </Card>

  <Card title="Si applicano le tue regole" icon="shield" color="#f59e0b">
    L'API rispetta automaticamente le tue finestre temporali di cancellazione e le regole di idoneità.
  </Card>

  <Card title="Integrazione semplice" icon="plug" color="#ef4444">
    Un endpoint, formato di richiesta semplice. Facile da integrare con qualsiasi sistema o piattaforma.
  </Card>
</CardGroup>

## Endpoint API

<CodeGroup>
  ```bash Endpoint theme={null}
  POST https://revize.untechnickle.com/api/public/v1/{shop-domain-slug}/cancel_order
  ```
</CodeGroup>

**Parametri:**

* `shop-domain-slug` — Il dominio del tuo store Shopify senza `.myshopify.com` (es. `my-store` da `my-store.myshopify.com`)

## Formato della richiesta

<CodeGroup>
  ```json Request Body theme={null}
  {
    "order_number": "#2667",
    "email": "customer@example.com"
  }
  ```
</CodeGroup>

| Campo          | Tipo   | Obbligatorio | Descrizione                                           |
| -------------- | ------ | ------------ | ----------------------------------------------------- |
| `order_number` | string | Sì           | Il numero dell'ordine incluso il simbolo #            |
| `email`        | string | Sì           | L'indirizzo email del cliente utilizzato per l'ordine |

## Codici di risposta

L'API restituisce un campo `status` che indica il risultato:

| Status            | Descrizione                                                  |
| ----------------- | ------------------------------------------------------------ |
| `SUCCESS`         | Ordine annullato con successo                                |
| `ORDER_NOT_FOUND` | L'ordine non esiste o l'email non corrisponde                |
| `NOT_CANCELLABLE` | L'ordine non può essere annullato (restrizioni di policy)    |
| `ORDER_FULFILLED` | Ordine già evaso, impossibile annullare                      |
| `NOT_EDITABLE`    | L'ordine è bloccato per la modifica                          |
| `CANCEL_DISABLED` | Funzionalità di cancellazione non abilitata per questo store |
| `APP_INACTIVE`    | L'app Revize non è attiva                                    |
| `SHOP_NOT_FOUND`  | Negozio non trovato nel sistema                              |
| `DOMAIN_MISSING`  | Slug del dominio del negozio mancante nella richiesta        |
| `FAILED`          | Errore generale dell'operazione                              |

## Esempio di integrazione

Ecco un esempio JavaScript per chiamare l'API:

<CodeGroup>
  ```javascript Fetch Example theme={null}
  async function cancelOrder(orderNumber, email) {
    const shopDomain = 'your-store'; // Without .myshopify.com
    const apiUrl = 'https://revize.untechnickle.com';
    
    try {
      const response = await fetch(
        `${apiUrl}/api/public/v1/${shopDomain}/cancel_order`,
        {
          method: 'POST',
          headers: {
            'Content-Type': 'application/json',
            'Accept': 'application/json'
          },
          body: JSON.stringify({
            order_number: orderNumber,
            email: email
          })
        }
      );
      
      const result = await response.json();
      
      if (result.success === true || result.status === 'SUCCESS') {
        console.log('Order cancelled successfully');
        return { success: true };
      } else {
        console.log('Cancellation failed:', result.status);
        return { success: false, status: result.status };
      }
    } catch (error) {
      console.error('Error:', error);
      return { success: false, status: 'FAILED' };
    }
  }
  ```
</CodeGroup>

## Sezione tema Shopify

Aggiungi un modulo di cancellazione a qualsiasi pagina del tuo tema Shopify. Questa sezione pronta all'uso gestisce tutte le chiamate API e mostra i messaggi appropriati.

<Accordion title="Codice completo della sezione Shopify" icon="code">
  ```liquid order-cancellation-form.liquid theme={null}
  <div class="order-cancel-section">
    <div class="order-cancel-container">
      <div class="order-cancel-form">
        {% if section.settings.show_heading %}
          <h2>{{ section.settings.heading }}</h2>
        {% endif %}
        
        {% if section.settings.show_description %}
          <p class="form-description">{{ section.settings.description }}</p>
        {% endif %}
        
        <form id="cancelOrderForm">
          <div class="form-group">
            <label for="orderNumber">{{ section.settings.order_label }}</label>
            <input 
              type="text" 
              id="orderNumber" 
              name="orderNumber" 
              required
              placeholder="{{ section.settings.order_placeholder }}"
            >
            <small>{{ section.settings.order_help_text }}</small>
          </div>
          
          <div class="form-group">
            <label for="email">{{ section.settings.email_label }}</label>
            <input 
              type="email" 
              id="email" 
              name="email" 
              required
              placeholder="{{ section.settings.email_placeholder }}"
            >
          </div>
          
          <button type="submit" id="submitBtn">{{ section.settings.button_text }}</button>
          <div id="message"></div>
        </form>
      </div>
    </div>
  </div>

  <script>
  document.getElementById('cancelOrderForm').addEventListener('submit', async (e) => {
    e.preventDefault();
    
    const submitBtn = document.getElementById('submitBtn');
    const messageDiv = document.getElementById('message');
    
    submitBtn.disabled = true;
    submitBtn.textContent = 'Processing...';
    messageDiv.textContent = '';
    messageDiv.className = '';
    
    const orderNumber = document.getElementById('orderNumber').value.trim();
    const email = document.getElementById('email').value.trim();
    
    const shopDomain = {{ shop.permanent_domain | json }};
    const domainSlug = shopDomain.replace('.myshopify.com', '');
    const apiUrl = {{ section.settings.api_url | json }};
    
    const statusMessages = {
      'SUCCESS': {{ section.settings.msg_success | json }},
      'ORDER_NOT_FOUND': {{ section.settings.msg_order_not_found | json }},
      'NOT_CANCELLABLE': {{ section.settings.msg_not_cancellable | json }},
      'ORDER_FULFILLED': {{ section.settings.msg_order_fulfilled | json }},
      'NOT_EDITABLE': {{ section.settings.msg_not_editable | json }},
      'CANCEL_DISABLED': {{ section.settings.msg_cancel_disabled | json }},
      'APP_INACTIVE': {{ section.settings.msg_app_inactive | json }},
      'FAILED': {{ section.settings.msg_failed | json }}
    };
    
    const buttonText = {{ section.settings.button_text | json }};
    
    try {
      const response = await fetch(`${apiUrl}/api/public/v1/${domainSlug}/cancel_order`, {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
          'Accept': 'application/json'
        },
        body: JSON.stringify({
          order_number: orderNumber,
          email: email
        })
      });
      
      const result = await response.json();
      
      if (result.success === true || result.status === 'SUCCESS') {
        messageDiv.className = 'success';
        messageDiv.textContent = statusMessages['SUCCESS'];
        document.getElementById('cancelOrderForm').reset();
      } else {
        messageDiv.className = 'error';
        messageDiv.textContent = statusMessages[result.status] || statusMessages['FAILED'];
      }
      
    } catch (error) {
      console.error('Error:', error);
      messageDiv.className = 'error';
      messageDiv.textContent = statusMessages['FAILED'];
    } finally {
      submitBtn.disabled = false;
      submitBtn.textContent = buttonText;
    }
  });
  </script>

  <style>
  .order-cancel-section {
    padding: {{ section.settings.section_padding_top }}px 0 {{ section.settings.section_padding_bottom }}px;
    background: {{ section.settings.background_color }};
  }

  .order-cancel-container {
    max-width: 1200px;
    margin: 0 auto;
    padding: 0 20px;
  }

  .order-cancel-form {
    max-width: {{ section.settings.form_width }}px;
    margin: 0 auto;
    padding: {{ section.settings.form_padding }}px;
    border: 1px solid {{ section.settings.border_color }};
    border-radius: {{ section.settings.border_radius }}px;
    background: {{ section.settings.form_background }};
  }

  .order-cancel-form h2 {
    margin-bottom: 10px;
    font-size: {{ section.settings.heading_size }}px;
    color: {{ section.settings.heading_color }};
    text-align: {{ section.settings.text_align }};
  }

  .order-cancel-form .form-description {
    margin-bottom: 24px;
    color: {{ section.settings.description_color }};
    text-align: {{ section.settings.text_align }};
  }

  .form-group {
    margin-bottom: 20px;
    text-align: left;
  }

  .form-group label {
    display: block;
    margin-bottom: 8px;
    font-weight: 600;
    font-size: 14px;
  }

  .form-group input {
    width: 100%;
    padding: 12px;
    border: 1px solid {{ section.settings.input_border_color }};
    border-radius: 4px;
    font-size: 14px;
    box-sizing: border-box;
  }

  .form-group small {
    display: block;
    margin-top: 4px;
    color: #666;
    font-size: 12px;
  }

  button {
    width: 100%;
    padding: 14px;
    background: {{ section.settings.button_background }};
    color: {{ section.settings.button_text_color }};
    border: none;
    border-radius: 4px;
    font-size: 16px;
    font-weight: 600;
    cursor: pointer;
  }

  button:disabled {
    opacity: 0.5;
    cursor: not-allowed;
  }

  #message {
    margin-top: 20px;
    padding: 12px;
    border-radius: 4px;
    text-align: center;
  }

  #message.success {
    background: #d4edda;
    color: #155724;
  }

  #message.error {
    background: #f8d7da;
    color: #721c24;
  }
  </style>

  {% schema %}
  {
    "name": "Order Cancellation Form",
    "settings": [
      {
        "type": "text",
        "id": "api_url",
        "label": "API URL",
        "default": "https://revize.untechnickle.com"
      },
      {
        "type": "text",
        "id": "heading",
        "label": "Heading",
        "default": "Cancel Your Order"
      },
      {
        "type": "textarea",
        "id": "description",
        "label": "Description",
        "default": "Enter your order number and email to cancel your order"
      },
      {
        "type": "text",
        "id": "button_text",
        "label": "Button Text",
        "default": "Cancel Order"
      },
      {
        "type": "textarea",
        "id": "msg_success",
        "label": "Success Message",
        "default": "Your order has been cancelled successfully!"
      },
      {
        "type": "textarea",
        "id": "msg_order_not_found",
        "label": "Order Not Found",
        "default": "We couldn't find an order with that number and email."
      },
      {
        "type": "textarea",
        "id": "msg_not_cancellable",
        "label": "Not Cancellable",
        "default": "This order cannot be cancelled due to our cancellation policy."
      },
      {
        "type": "textarea",
        "id": "msg_order_fulfilled",
        "label": "Order Fulfilled",
        "default": "This order has already been fulfilled and cannot be cancelled."
      },
      {
        "type": "textarea",
        "id": "msg_failed",
        "label": "General Error",
        "default": "Unable to process your request. Please try again."
      }
    ],
    "presets": [{ "name": "Order Cancellation Form" }]
  }
  {% endschema %}
  ```
</Accordion>

## Casi d'uso comuni

<Tabs>
  <Tab title="Pagine di supporto">
    **Cancellazione self-service su pagine FAQ/Aiuto**

    Aggiungi il modulo di cancellazione alle tue pagine di supporto o FAQ in modo che i clienti possano annullare gli ordini senza contattare il supporto.

    * Riduce i ticket di supporto
    * Disponibilità 24/7
    * Elaborazione immediata
  </Tab>

  <Tab title="Email post-acquisto">
    **Pulsante di annullamento nelle email di conferma ordine**

    Aggiungi un link "Annulla ordine" nelle tue email transazionali che apre una pagina di cancellazione sul tuo store.

    * Comodo per i clienti
    * Cattura tempestivamente le richieste impulsive di annullamento
    * Riduce le richieste "come faccio ad annullare?"
  </Tab>

  <Tab title="Chatbot">
    **Cancellazione automatizzata via chat**

    Integra l'API con i chatbot (Gorgias, Zendesk, ecc.) per gestire automaticamente le richieste di cancellazione.

    * Risposta immediata
    * Nessun coinvolgimento dell'agente necessario
    * Funziona 24/7
  </Tab>
</Tabs>

## Requisiti di configurazione

L'API pubblica di cancellazione è una funzionalità avanzata che richiede l'attivazione da parte del nostro team.

<Steps>
  <Step title="Contattaci per abilitare">
    [Contatta il nostro team](/it/support/contact) per abilitare l'API pubblica di cancellazione per il tuo store.
  </Step>

  <Step title="Configura le impostazioni di rimborso">
    Imposta il tuo metodo di rimborso in **Payments & Refunds** — metodo di pagamento originale o credito negozio.
  </Step>

  <Step title="Ottieni i tuoi dettagli di integrazione">
    Ti forniremo lo slug del dominio del tuo negozio e qualsiasi configurazione personalizzata necessaria per il tuo caso d'uso.
  </Step>

  <Step title="Testa con ordini bozza">
    Crea ordini di prova per verificare che l'API funzioni correttamente prima di andare live.
  </Step>
</Steps>

<Note>
  Questa funzionalità è disponibile sui piani Pro. [Contattaci](/it/support/contact) per i prezzi e l'assistenza alla configurazione.
</Note>

## Domande frequenti

<AccordionGroup>
  <Accordion title="L'API rispetta le mie regole di cancellazione?" icon="shield">
    Sì. L'API applica automaticamente le tue impostazioni della finestra di modifica, le restrizioni dell'ordine e le politiche di rimborso. Gli ordini al di fuori della finestra di modifica o con tag di blocco non possono essere annullati tramite API.
  </Accordion>

  <Accordion title="Come vengono elaborati i rimborsi?" icon="credit-card">
    I rimborsi vengono elaborati in base alle tue impostazioni di pagamento Revize — sul metodo di pagamento originale o come credito negozio, esattamente come le cancellazioni tramite il portale clienti.
  </Accordion>

  <Accordion title="Posso usarla per integrazioni di terze parti?" icon="plug">
    Assolutamente sì. L'API è progettata per integrazioni esterne — chatbot, fornitori di servizi email, app personalizzate o qualsiasi sistema in grado di effettuare richieste HTTP.
  </Accordion>

  <Accordion title="È richiesta l'autenticazione?" icon="key">
    L'API utilizza la verifica tramite numero ordine + email per la sicurezza. Nessuna chiave API richiesta, rendendo l'integrazione semplice e garantendo al tempo stesso che solo i proprietari dell'ordine possano annullare.
  </Accordion>
</AccordionGroup>

<Note>
  L'API pubblica di cancellazione estende la cancellazione self-service oltre il portale Revize. Usala per incontrare i clienti ovunque si trovino — email, pagine di supporto o chatbot.
</Note>

## Funzionalità correlate

* [Annulla ordine](/it/features/cancel-order) — cancellazione self-service standard tramite il portale
* [Restrizioni di modifica ordini](/it/setup/order-edit-restrictions) — controlla quali ordini possono essere annullati
* [Pagamenti e rimborsi](/it/setup/payments-and-refunds) — configura l'elaborazione dei rimborsi
