> ## 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 d'annulation publique

> Ajoute l'annulation de commande n'importe où dans ta boutique Shopify. Intègre des boutons d'annulation dans les e-mails, pages de support, chatbots ou formulaires personnalisés grâce à notre endpoint API public.

<Note>
  L'API d'annulation publique te permet d'ajouter l'annulation de commande en libre-service n'importe où — e-mails post-achat, pages de support, chatbots ou formulaires personnalisés. Aucun app embed requis.
</Note>

## Pourquoi utiliser l'API d'annulation

<CardGroup cols={2}>
  <Card title="Annulation partout" icon="globe" color="#8b5cf6">
    Ajoute des boutons d'annulation aux e-mails, pages FAQ, flux de chatbot ou toute interface personnalisée hors de ta boutique.
  </Card>

  <Card title="Aucun app embed nécessaire" icon="code" color="#10b981">
    Fonctionne indépendamment du portail client Revize. Il suffit d'appeler l'endpoint API.
  </Card>

  <Card title="Tes règles s'appliquent" icon="shield" color="#f59e0b">
    L'API respecte automatiquement tes fenêtres temporelles d'annulation et tes règles d'éligibilité.
  </Card>

  <Card title="Intégration simple" icon="plug" color="#ef4444">
    Un endpoint, un format de requête simple. Facile à intégrer avec n'importe quel système ou plateforme.
  </Card>
</CardGroup>

## Endpoint API

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

**Paramètres :**

* `shop-domain-slug` — Le domaine de ta boutique Shopify sans `.myshopify.com` (ex. `my-store` depuis `my-store.myshopify.com`)

## Format de requête

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

| Champ          | Type   | Requis | Description                                          |
| -------------- | ------ | ------ | ---------------------------------------------------- |
| `order_number` | string | Oui    | Le numéro de commande incluant le symbole #          |
| `email`        | string | Oui    | L'adresse e-mail du client utilisée pour la commande |

## Codes de réponse

L'API retourne un champ `status` indiquant le résultat :

| Status            | Description                                                      |
| ----------------- | ---------------------------------------------------------------- |
| `SUCCESS`         | Commande annulée avec succès                                     |
| `ORDER_NOT_FOUND` | La commande n'existe pas ou l'e-mail ne correspond pas           |
| `NOT_CANCELLABLE` | La commande ne peut pas être annulée (restrictions de politique) |
| `ORDER_FULFILLED` | Commande déjà préparée, annulation impossible                    |
| `NOT_EDITABLE`    | La commande est verrouillée pour l'édition                       |
| `CANCEL_DISABLED` | Fonctionnalité d'annulation non activée pour cette boutique      |
| `APP_INACTIVE`    | L'application Revize n'est pas active                            |
| `SHOP_NOT_FOUND`  | Boutique introuvable dans le système                             |
| `DOMAIN_MISSING`  | Slug de domaine de boutique manquant dans la requête             |
| `FAILED`          | Échec général de l'opération                                     |

## Exemple d'intégration

Voici un exemple JavaScript pour appeler 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>

## Section de thème Shopify

Ajoute un formulaire d'annulation à n'importe quelle page de ton thème Shopify. Cette section prête à l'emploi gère tous les appels API et affiche les messages appropriés.

<Accordion title="Code complet de la section 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>

## Cas d'usage courants

<Tabs>
  <Tab title="Pages de support">
    **Annulation en libre-service sur les pages FAQ/Aide**

    Ajoute le formulaire d'annulation à tes pages de support ou FAQ pour que les clients puissent annuler des commandes sans contacter le support.

    * Réduit les tickets de support
    * Disponibilité 24/7
    * Traitement instantané
  </Tab>

  <Tab title="E-mails post-achat">
    **Bouton d'annulation dans les e-mails de confirmation**

    Ajoute un lien « Cancel Order » dans tes e-mails transactionnels qui ouvre une page d'annulation sur ta boutique.

    * Pratique pour les clients
    * Capte tôt les demandes d'annulation impulsives
    * Réduit les questions « comment annuler ? »
  </Tab>

  <Tab title="Chatbots">
    **Annulation automatisée via chat**

    Intègre l'API avec des chatbots (Gorgias, Zendesk, etc.) pour gérer automatiquement les demandes d'annulation.

    * Réponse instantanée
    * Aucune intervention d'agent nécessaire
    * Fonctionne 24/7
  </Tab>
</Tabs>

## Exigences de configuration

L'API d'annulation publique est une fonctionnalité avancée qui nécessite une activation par notre équipe.

<Steps>
  <Step title="Contacte-nous pour l'activer">
    [Contacte notre équipe](/fr/support/contact) pour activer l'API d'annulation publique pour ta boutique.
  </Step>

  <Step title="Configurer les paramètres de remboursement">
    Définis ta méthode de remboursement dans **Payments & Refunds** — moyen de paiement initial ou crédit boutique.
  </Step>

  <Step title="Récupérer tes détails d'intégration">
    Nous te fournirons ton slug de domaine boutique et toute configuration personnalisée nécessaire à ton cas d'usage.
  </Step>

  <Step title="Tester avec des draft orders">
    Crée des commandes test pour vérifier que l'API fonctionne correctement avant la mise en production.
  </Step>
</Steps>

<Note>
  Cette fonctionnalité est disponible sur les forfaits Pro. [Contacte-nous](/fr/support/contact) pour la tarification et l'aide à la configuration.
</Note>

## Questions fréquentes

<AccordionGroup>
  <Accordion title="L'API respecte-t-elle mes règles d'annulation ?" icon="shield">
    Oui. L'API applique automatiquement tes paramètres de fenêtre d'édition, restrictions de commande et politiques de remboursement. Les commandes hors fenêtre d'édition ou avec des tags bloquants ne peuvent pas être annulées via l'API.
  </Accordion>

  <Accordion title="Comment les remboursements sont-ils traités ?" icon="credit-card">
    Les remboursements sont traités selon tes paramètres de paiement Revize — soit sur le moyen de paiement initial, soit en crédit boutique, exactement comme les annulations via le portail client.
  </Accordion>

  <Accordion title="Puis-je l'utiliser pour des intégrations tierces ?" icon="plug">
    Absolument. L'API est conçue pour les intégrations externes — chatbots, fournisseurs de service e-mail, applications personnalisées ou tout système capable de faire des requêtes HTTP.
  </Accordion>

  <Accordion title="Une authentification est-elle requise ?" icon="key">
    L'API utilise la vérification numéro de commande + e-mail pour la sécurité. Aucune clé API n'est requise, ce qui rend l'intégration simple tout en garantissant que seuls les propriétaires de commande peuvent annuler.
  </Accordion>
</AccordionGroup>

<Note>
  L'API d'annulation publique étend l'annulation en libre-service au-delà du portail Revize. Utilise-la pour rejoindre les clients où qu'ils soient — e-mails, pages de support ou chatbots.
</Note>

## Fonctionnalités liées

* [Annulation de commande](/fr/features/cancel-order) — annulation standard en libre-service via le portail
* [Restrictions de modification de commande](/fr/setup/order-edit-restrictions) — contrôle quelles commandes peuvent être annulées
* [Paiements & Remboursements](/fr/setup/payments-and-refunds) — configure le traitement des remboursements
