> ## 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 Pública de Cancelamento

> Adicione cancelamento de pedido em qualquer lugar da sua loja Shopify. Crie botões de cancelamento em e-mails, páginas de suporte, chatbots ou formulários personalizados usando nosso endpoint de API pública.

<Note>
  A API Pública de Cancelamento permite adicionar cancelamento de pedido em autoatendimento em qualquer lugar — e-mails pós-compra, páginas de suporte, chatbots ou formulários personalizados. Sem necessidade de embed do app.
</Note>

## Por que usar a API de Cancelamento

<CardGroup cols={2}>
  <Card title="Cancelamento em Qualquer Lugar" icon="globe" color="#8b5cf6">
    Adicione botões de cancelamento a e-mails, páginas de FAQ, fluxos de chatbot ou qualquer interface personalizada fora da sua loja.
  </Card>

  <Card title="Sem Necessidade de Embed do App" icon="code" color="#10b981">
    Funciona independentemente do portal do cliente Revize. Basta chamar o endpoint da API.
  </Card>

  <Card title="Suas Regras se Aplicam" icon="shield" color="#f59e0b">
    A API respeita suas janelas de tempo de cancelamento e regras de elegibilidade automaticamente.
  </Card>

  <Card title="Integração Simples" icon="plug" color="#ef4444">
    Um endpoint, formato simples de requisição. Fácil de integrar com qualquer sistema ou plataforma.
  </Card>
</CardGroup>

## Endpoint da API

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

**Parâmetros:**

* `shop-domain-slug` — O domínio da sua loja Shopify sem `.myshopify.com` (ex.: `my-store` de `my-store.myshopify.com`)

## Formato da requisição

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

| Campo          | Tipo   | Obrigatório | Descrição                                |
| -------------- | ------ | ----------- | ---------------------------------------- |
| `order_number` | string | Sim         | O número do pedido incluindo o símbolo # |
| `email`        | string | Sim         | E-mail do cliente usado no pedido        |

## Códigos de resposta

A API retorna um campo `status` indicando o resultado:

| Status            | Descrição                                              |
| ----------------- | ------------------------------------------------------ |
| `SUCCESS`         | Pedido cancelado com sucesso                           |
| `ORDER_NOT_FOUND` | Pedido não existe ou e-mail não corresponde            |
| `NOT_CANCELLABLE` | Pedido não pode ser cancelado (restrições de política) |
| `ORDER_FULFILLED` | Pedido já processado, não pode cancelar                |
| `NOT_EDITABLE`    | Pedido bloqueado para edição                           |
| `CANCEL_DISABLED` | Recurso de cancelamento não habilitado para esta loja  |
| `APP_INACTIVE`    | App Revize não está ativo                              |
| `SHOP_NOT_FOUND`  | Loja não encontrada no sistema                         |
| `DOMAIN_MISSING`  | Slug de domínio da loja ausente na requisição          |
| `FAILED`          | Falha geral na operação                                |

## Exemplo de integração

Aqui está um exemplo em JavaScript para chamar a 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>

## Seção do tema Shopify

Adicione um formulário de cancelamento a qualquer página do seu tema Shopify. Esta seção pronta para uso lida com todas as chamadas da API e exibe mensagens apropriadas.

<Accordion title="Código Completo da Seção 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>

## Casos de uso comuns

<Tabs>
  <Tab title="Páginas de Suporte">
    **Cancelamento em autoatendimento em páginas de FAQ/Ajuda**

    Adicione o formulário de cancelamento às suas páginas de suporte ou FAQ para que os clientes possam cancelar pedidos sem contatar o suporte.

    * Reduz tickets de suporte
    * Disponibilidade 24/7
    * Processamento instantâneo
  </Tab>

  <Tab title="E-mails Pós-Compra">
    **Botão de cancelar em e-mails de confirmação de pedido**

    Adicione um link "Cancelar Pedido" nos seus e-mails transacionais que abre uma página de cancelamento na sua loja.

    * Conveniente para clientes
    * Captura solicitações de cancelamento por impulso cedo
    * Reduz consultas de "como cancelo?"
  </Tab>

  <Tab title="Chatbots">
    **Cancelamento automatizado via chat**

    Integre a API com chatbots (Gorgias, Zendesk, etc.) para lidar com solicitações de cancelamento automaticamente.

    * Resposta instantânea
    * Sem necessidade de envolvimento de agente
    * Funciona 24/7
  </Tab>
</Tabs>

## Requisitos de configuração

A API Pública de Cancelamento é um recurso avançado que requer ativação pela nossa equipe.

<Steps>
  <Step title="Entre em contato para habilitar">
    [Entre em contato com nossa equipe](/pt/support/contact) para habilitar a API Pública de Cancelamento para sua loja.
  </Step>

  <Step title="Configure as definições de reembolso">
    Defina seu método de reembolso em **Pagamentos e Reembolsos** — método de pagamento original ou crédito da loja.
  </Step>

  <Step title="Obtenha seus detalhes de integração">
    Forneceremos o slug do domínio da sua loja e qualquer configuração personalizada necessária para o seu caso de uso.
  </Step>

  <Step title="Teste com pedidos rascunho">
    Crie pedidos de teste para verificar se a API funciona corretamente antes de entrar no ar.
  </Step>
</Steps>

<Note>
  Este recurso está disponível nos planos Pro. [Entre em contato](/pt/support/contact) para preços e assistência de configuração.
</Note>

## Perguntas frequentes

<AccordionGroup>
  <Accordion title="A API respeita minhas regras de cancelamento?" icon="shield">
    Sim. A API aplica automaticamente suas configurações de janela de edição, restrições de pedido e políticas de reembolso. Pedidos fora da janela de edição ou com tags de bloqueio não podem ser cancelados via API.
  </Accordion>

  <Accordion title="Como os reembolsos são processados?" icon="credit-card">
    Os reembolsos são processados de acordo com suas configurações de pagamento Revize — tanto para o método de pagamento original quanto como crédito da loja, exatamente como cancelamentos pelo portal do cliente.
  </Accordion>

  <Accordion title="Posso usar isto para integrações de terceiros?" icon="plug">
    Com certeza. A API é projetada para integrações externas — chatbots, provedores de serviços de e-mail, apps personalizados ou qualquer sistema que possa fazer requisições HTTP.
  </Accordion>

  <Accordion title="É necessária autenticação?" icon="key">
    A API usa verificação por número do pedido + e-mail para segurança. Não são necessárias chaves de API, tornando a integração simples enquanto garante que apenas os donos do pedido possam cancelar.
  </Accordion>
</AccordionGroup>

<Note>
  A API Pública de Cancelamento estende o cancelamento em autoatendimento além do portal Revize. Use-a para encontrar os clientes onde quer que estejam — e-mails, páginas de suporte ou chatbots.
</Note>

## Recursos relacionados

* [Cancelar Pedido](/pt/features/cancel-order) — cancelamento padrão em autoatendimento pelo portal
* [Restrições de Edição de Pedido](/pt/setup/order-edit-restrictions) — controle quais pedidos podem ser cancelados
* [Pagamentos e Reembolsos](/pt/setup/payments-and-refunds) — configure o processamento de reembolso
