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

# Reembolsar um Checkout

> Reembolsa integralmente um Checkout pago (PIX ou Cartão). O valor reembolsado é igual ao valor original da transação — reembolsos parciais não são suportados.


Reembolsa integralmente um Checkout pago. O valor reembolsado é igual ao valor original da transação — não há reembolso parcial.

<Card title="Obrigatório" horizontal>
  Apenas `id` é obrigatório — o ID público do recurso a reembolsar.
</Card>

O campo `id` aceita:

| Prefixo                                | Recurso                                                               |
| -------------------------------------- | --------------------------------------------------------------------- |
| `bill_...`                             | ID público do Checkout (billing) — resolve para o payment intent pago |
| `char_...`, `pix_char_...`, `card_...` | ID público do payment intent (charge)                                 |

**Exemplo mínimo:**

```json theme={null}
{
  "id": "bill_abc123xyz"
}
```

**Exemplo com motivo:**

```json theme={null}
{
  "id": "bill_abc123xyz",
  "reason": "Pedido cancelado pelo cliente."
}
```

**Resposta:**

```json theme={null}
{
  "data": { "refundPublicId": "tran_refund789xyz" },
  "success": true,
  "error": null
}
```

<Tip title="Idempotência" horizontal>
  Chamar o endpoint para o mesmo `id` retorna sempre o mesmo `refundPublicId` — não cria reembolsos duplicados.
</Tip>

***

## Regras de negócio

* **Reembolso total apenas** — o valor é sempre igual ao valor original da transação.
* **Métodos suportados** — `PIX`, `PIX_QRCODE` e `CARD`. Boleto, TED e movimentações internas não são reembolsáveis via API.
* **Estado exigido:**
  * `PIX` / `PIX_QRCODE` — transação precisa estar `COMPLETE`.
  * `CARD` — transação precisa estar `APPROVED` ou `COMPLETE`.
* **Disputas** — transações em disputa (`UNDER_DISPUTE` ou `metadata.underDispute=true`) não podem ser reembolsadas por este endpoint.
* **Saldo** — o valor é debitado do saldo `available` da loja (ou `pending`, em casos específicos de `CARD`). Sem saldo, retorna `INSUFFICIENT_FUNDS`.
* **Modo dev (sandbox)** — em `devMode` o reembolso é confirmado instantaneamente, sem chamar o provider real.
* **Status final após o reembolso:**
  * A transação original vira `REFUNDED`.
  * O billing vira `REFUNDED`.
  * O payment intent vira `REFUNDED`.
  * É criada uma nova transação `WITHDRAW` representando o reembolso (retornada em `refundPublicId`).

<Note>
  Ao concluir, é disparado o webhook [`checkout.refunded`](/pages/webhooks/events/checkout). Configure seu endpoint em [Webhooks](/pages/webhooks/create) para receber a notificação.
</Note>

***

## Códigos de erro

| Código                       | Significado                                                                                                      |
| ---------------------------- | ---------------------------------------------------------------------------------------------------------------- |
| `LOCK_NOT_ACQUIRED`          | Outra operação está em andamento para esta loja — tente novamente em instantes.                                  |
| `TRANSACTION_NOT_FOUND`      | O `id` informado não existe ou não pertence à loja.                                                              |
| `TRANSACTION_NOT_REFUNDABLE` | A transação não está em um estado reembolsável (precisa estar `COMPLETE`, ou `APPROVED`/`COMPLETE` para `CARD`). |
| `TRANSACTION_UNDER_DISPUTE`  | Transação em disputa — não pode ser reembolsada.                                                                 |
| `INVALID_METHOD`             | Apenas `PIX`, `PIX_QRCODE` e `CARD` podem ser reembolsados.                                                      |
| `INSUFFICIENT_FUNDS`         | Saldo da loja menor que o valor da transação.                                                                    |
| `STORE_NOT_FOUND`            | Loja não encontrada.                                                                                             |
| `REFUND_REQUEST_FAILED`      | Falha ao criar a transação no ledger ou ao acionar o provider.                                                   |
| `REFUND_CONFIRMATION_FAILED` | Falha ao confirmar o reembolso após a criação.                                                                   |

**Exemplo de erro:**

```json theme={null}
{
  "data": null,
  "success": false,
  "error": "TRANSACTION_UNDER_DISPUTE"
}
```

***

## Exemplo cURL

```bash theme={null}
curl -X POST https://api.abacatepay.com/v2/checkouts/refund \
  -H "Authorization: Bearer $ABACATE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "bill_abc123xyz",
    "reason": "Pedido cancelado pelo cliente."
  }'
```


## OpenAPI

````yaml POST /checkouts/refund
openapi: 3.1.0
info:
  title: API AbacatePay
  description: API para gerenciamento de cobranças e pagamentos usando o AbacatePay.
  version: 1.0.0
servers:
  - url: https://api.abacatepay.com/v2
    description: Único servidor para os ambientes de produção e sandbox.
security: []
paths:
  /checkouts/refund:
    post:
      summary: Reembolsar um Checkout
      description: >
        Reembolsa integralmente um Checkout pago (PIX ou Cartão). O valor
        reembolsado é igual ao valor original da transação — reembolsos parciais
        não são suportados.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RefundRequest'
      responses:
        '200':
          description: Reembolso criado com sucesso.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RefundResponse'
        '400':
          description: Reembolso recusado por regra de negócio.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RefundError'
        '401':
          description: Não autorizado. Falha na autenticação.
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: Motivo da falha na autenticação.
                    example: Token de autenticação inválido ou ausente.
      security:
        - bearerAuth: []
components:
  schemas:
    RefundRequest:
      type: object
      required:
        - id
      additionalProperties: false
      properties:
        id:
          type: string
          description: >
            ID público do recurso a reembolsar. Aceita os prefixos `char_` /
            `pix_char_` / `card_` (payment intent) ou `bill_` (billing —
            resolvido para o payment intent pago).
          example: bill_abc123xyz
        reason:
          type: string
          maxLength: 500
          description: Motivo do reembolso. Aparece no histórico da transação.
          example: Pedido cancelado pelo cliente.
    RefundResponse:
      type: object
      properties:
        data:
          type: object
          properties:
            refundPublicId:
              type: string
              description: ID público da transação de reembolso (WITHDRAW) criada.
              example: tran_refund789xyz
        error:
          type: string
          nullable: true
          example: null
        success:
          $ref: '#/components/schemas/Success'
    RefundError:
      type: object
      properties:
        data:
          nullable: true
          example: null
        error:
          type: string
          description: Código do erro de reembolso.
          enum:
            - LOCK_NOT_ACQUIRED
            - TRANSACTION_NOT_FOUND
            - TRANSACTION_NOT_REFUNDABLE
            - TRANSACTION_UNDER_DISPUTE
            - INVALID_METHOD
            - INSUFFICIENT_FUNDS
            - STORE_NOT_FOUND
            - REFUND_REQUEST_FAILED
            - REFUND_CONFIRMATION_FAILED
          example: TRANSACTION_UNDER_DISPUTE
        success:
          type: boolean
          example: false
    Success:
      type: boolean
      description: Se a requisição obteve sucesso ou não.
      example: true
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >
        Todas as requisições devem incluir sua chave de API no header
        Authorization usando o formato `Bearer <abacatepay-api-key>`. Sem esse
        header a requisição será rejeitada.


        Saiba mais sobre como criar e usar chaves de API na [documentação de
        autenticação](/pages/authentication).

````