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

# Cancelar Assinatura

> Cancele uma assinatura imediatamente ou ao fim do período

## Visão Geral

Cancele uma assinatura de duas formas: imediatamente (cliente perde acesso na hora) ou agendado para o fim do período pago (cliente mantém acesso até a data de renovação).

## Cancelamento Imediato

O cliente perde acesso imediatamente e nenhuma cobrança futura será realizada.

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST https://garu.com.br/api/subscriptions/100/cancel \
    -H "Authorization: Bearer sk_test_sua_chave" \
    -H "Content-Type: application/json" \
    -d '{
      "cancelImmediately": true,
      "reason": "Cliente solicitou cancelamento"
    }'
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch(
    'https://garu.com.br/api/subscriptions/100/cancel',
    {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${process.env.GARU_API_KEY}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        cancelImmediately: true,
        reason: 'Cliente solicitou cancelamento'
      })
    }
  );

  const result = await response.json();
  console.log(`Status: ${result.status}`); // "canceled"
  ```

  ```python Python theme={null}
  import requests
  import os

  url = "https://garu.com.br/api/subscriptions/100/cancel"
  headers = {
      "Authorization": f"Bearer {os.environ['GARU_API_KEY']}",
      "Content-Type": "application/json"
  }
  payload = {
      "cancelImmediately": True,
      "reason": "Cliente solicitou cancelamento"
  }

  response = requests.post(url, json=payload, headers=headers)
  result = response.json()
  print(f"Status: {result['status']}")  # "canceled"
  ```
</CodeGroup>

**Resultado:**

* Status muda para `canceled`
* Acesso revogado imediatamente
* Nenhuma cobrança futura

## Cancelamento Agendado

O cliente mantém acesso até o fim do período pago atual.

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST https://garu.com.br/api/subscriptions/100/cancel \
    -H "Authorization: Bearer sk_test_sua_chave" \
    -H "Content-Type: application/json" \
    -d '{
      "cancelImmediately": false,
      "reason": "Cliente optou por não renovar"
    }'
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch(
    'https://garu.com.br/api/subscriptions/100/cancel',
    {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${process.env.GARU_API_KEY}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        cancelImmediately: false,
        reason: 'Cliente optou por não renovar'
      })
    }
  );

  const result = await response.json();
  console.log(`Cancelamento agendado para: ${result.cancelAt}`);
  ```

  ```python Python theme={null}
  import requests
  import os

  url = "https://garu.com.br/api/subscriptions/100/cancel"
  headers = {
      "Authorization": f"Bearer {os.environ['GARU_API_KEY']}",
      "Content-Type": "application/json"
  }
  payload = {
      "cancelImmediately": False,
      "reason": "Cliente optou por não renovar"
  }

  response = requests.post(url, json=payload, headers=headers)
  result = response.json()
  print(f"Cancelamento agendado para: {result['cancelAt']}")
  ```
</CodeGroup>

**Resultado:**

* Status muda para `pending_cancellation`
* Cliente mantém acesso até `currentPeriodEnd`
* Campo `cancelAt` preenchido com a data de cancelamento
* No fim do período, status muda para `canceled`

## Parâmetros

<ParamField body="cancelImmediately" type="boolean" required>
  `true` = cancelamento imediato, `false` = cancelamento no fim do período.
</ParamField>

<ParamField body="reason" type="string">
  Motivo do cancelamento (opcional, para registro interno).
</ParamField>

## Resposta de Sucesso

### Cancelamento Imediato (200 OK)

```json theme={null}
{
  "id": 100,
  "status": "canceled",
  "cancelledAt": "2024-02-20T10:00:00.000Z",
  "message": "Assinatura cancelada com sucesso"
}
```

### Cancelamento Agendado (200 OK)

```json theme={null}
{
  "id": 100,
  "status": "pending_cancellation",
  "cancelAt": "2024-03-15T00:00:00.000Z",
  "message": "Assinatura será cancelada em 2024-03-15"
}
```

## Erros Comuns

<AccordionGroup>
  <Accordion title="404 - Assinatura não encontrada">
    ```json theme={null}
    {
      "statusCode": 404,
      "message": "Subscription not found"
    }
    ```

    **Solução:** Verifique se o ID da assinatura está correto.
  </Accordion>

  <Accordion title="400 - Assinatura já cancelada">
    ```json theme={null}
    {
      "statusCode": 400,
      "message": "Subscription is already canceled"
    }
    ```

    **Solução:** A assinatura já foi cancelada anteriormente.
  </Accordion>
</AccordionGroup>

## Próximos Passos

<CardGroup cols={2}>
  <Card title="Pausar Assinatura" icon="pause" href="/api-reference/assinaturas/pausar">
    Pause temporariamente as cobranças
  </Card>

  <Card title="Webhooks" icon="webhook" href="/api-reference/webhooks">
    Receba notificações de cancelamento
  </Card>
</CardGroup>
