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

# Ciclo de vida da cobrança

> Os sete estados de uma cobrança PIX, quais são terminais e qual ainda admite estorno.

Uma cobrança nasce `pending` e caminha para um estado do qual não volta.

```mermaid theme={null}
stateDiagram-v2
    [*] --> pending: POST /v1/charges
    pending --> paid: PIX confirmado
    pending --> expired: expires_in vencido
    pending --> canceled: cancelada
    pending --> failed: falha no provedor
    paid --> partially_refunded: estorno parcial
    paid --> refunded: estorno integral
    partially_refunded --> partially_refunded: outro estorno parcial
    partially_refunded --> refunded: estorno do que restava
    paid --> [*]
    refunded --> [*]
    expired --> [*]
    canceled --> [*]
    failed --> [*]
```

| `status`             | Rótulo               | Terminal? | Admite estorno?        |
| -------------------- | -------------------- | --------- | ---------------------- |
| `pending`            | Aguardando pagamento | Não       | Não                    |
| `paid`               | Pago                 | Sim       | Sim                    |
| `partially_refunded` | Estornado em parte   | Não       | Sim, o que ainda resta |
| `refunded`           | Estornado            | Sim       | Não                    |
| `expired`            | Expirado             | Sim       | Não                    |
| `canceled`           | Cancelado            | Sim       | Não                    |
| `failed`             | Falhou               | Sim       | Não                    |

## `partially_refunded` é estado próprio

Uma venda devolvida pela metade fica `partially_refunded`, e não `refunded`.

A distinção existe porque tratar as duas como a mesma coisa faria o seu relatório descontar o valor
inteiro de uma venda que só voltou pela metade. O quanto voltou está em `refunded_amount`, acumulado
entre estornos parciais; o que ainda cabe estornar é `amount - refunded_amount`.

## Expiração

`expires_in` é a validade do QR, em segundos.

|        | Valor              |
| ------ | ------------------ |
| Padrão | 3.600 s (1 hora)   |
| Mínimo | 60 s               |
| Máximo | 604.800 s (7 dias) |

O piso de 60 s evita uma cobrança que expira antes de o comprador abrir o aplicativo do banco. O
horário exato do vencimento volta em `pix.expires_at`.

Uma cobrança `expired` não pode ser paga nem estornada. Para tentar de novo, crie outra — com uma
`Idempotency-Key` nova, já que é uma tentativa nova de verdade.

## Em qual estado agir

<Warning>
  O momento de liberar o produto é o `charge.paid`, não a resposta de `POST /v1/charges`. A criação
  devolve `pending` — o QR já existe, mas o pagamento ainda não aconteceu.
</Warning>

As datas contam a história e vêm `null` até acontecerem: `created_at`, `paid_at`, `expired_at`,
`refunded_at`.

## Veja também

<CardGroup cols={2}>
  <Card title="Checkout PIX" icon="qr-code" href="/receitas/checkout-pix">
    O fluxo inteiro, da criação à liberação do produto.
  </Card>

  <Card title="Estornos" icon="rotate-ccw" href="/essenciais/estornos">
    O que acontece depois de `paid`.
  </Card>
</CardGroup>

***

Ficou algo de fora? Escreva para [suporte@usevext.com](mailto:suporte@usevext.com). Se o assunto for
uma chamada específica, informe o horário dela; se for uma entrega de webhook, informe o
`X-Vext-Delivery` — é por ele que localizamos a tentativa, a resposta do seu servidor e o horário.
