# Comprovante Cash Out

Obtém o comprovante de uma transação PIX em formato estruturado, com dados formatados para exibição ao usuário final.

## Endpoint

```
GET /api/external/transactions/:id/receipt
```

## Headers

| Header | Tipo | Obrigatório | Descrição |
|--------|------|-------------|-----------|
| `Authorization` | String | Sim | `ApiKey {client_id}:{client_secret}` |

## Path Parameters

| Parâmetro | Tipo | Obrigatório | Descrição |
|-----------|------|-------------|-----------|
| `id` | String | Sim | ID da transação (`transaction_id`) |

::: tip Disponibilidade
O comprovante consulta a tabela `transactions` - disponível para transações com status final (`settled` ou `failed`). Transações ainda em processamento (estado `processing` em `outbound_requests`, stage 1-2) **retornam 404** aqui; consulte primeiro via [GET /transactions/:id](/pix-cashout-status) e aguarde a promoção para `transactions` antes de solicitar o comprovante.

QRs pagos aparecem no comprovante da transação real linkada (não do QR em si) - use o `transaction_id` retornado no webhook `pix.charge.paid` ou via consulta.
:::

## Exemplo

```bash
curl -X GET https://api.monetarie.com/api/external/transactions/PIXOUT20260309a1b2c3d4e5f6/receipt \
  -H "Authorization: ApiKey $CLIENT_ID:$CLIENT_SECRET"
```

## Resposta de Sucesso -- 200

```json
{
  "worked": true,
  "receipt": {
    "transaction_id": "PIXOUT20260309a1b2c3d4e5f6",
    "end_to_end_id": "E46026562202603091530abcdef01",
    "external_id": "order-9876",
    "type": "pix",
    "direction": "outbound",
    "status": "settled",
    "amount": 300000,
    "amount_formatted": "R$ 30,00",
    "fee_amount": 350,
    "fee_formatted": "R$ 0,035",
    "net_amount": 300350,
    "description": "Pagamento fornecedor",
    "counterparty_name": "Joao Silva",
    "recipient_key": "12345678901",
    "created_at": "2026-03-09T15:30:00Z",
    "completed_at": "2026-03-09T15:30:02Z",
    "institution": {
      "name": "Monetarie",
      "cnpj": "46.026.562/0001-05",
      "ispb": "46026562"
    }
  }
}
```

## Campos do Comprovante

O objeto `receipt` contém **exatamente 17 campos** (incluindo o sub-objeto `institution`). Este é o inventário completo - **não há outros campos** retornados por este endpoint:

| # | Campo | Tipo | Descrição |
|---|-------|------|-----------|
| 1 | `receipt.transaction_id` | String | Identificador único da transação |
| 2 | `receipt.end_to_end_id` | String | Identificador End-to-End no SPI/BACEN |
| 3 | `receipt.external_id` | String | ID externo fornecido pelo cliente no cash-out. `null` quando não informado, ou quando o ID externo não passou no sanitize (max 128 chars, apenas `a-zA-Z0-9._:-`) |
| 4 | `receipt.type` | String | Tipo da transação. Valores observados: `pix` (default), `pix_return` (devolução). Registros legados podem retornar outros valores (`ted`, `tef`, etc.) |
| 5 | `receipt.direction` | String | Direção do movimento no comprovante: `outbound`, `inbound`, `credit` ou `debit` |
| 6 | `receipt.status` | String | Status da transação. Valores possíveis: `settled`, `pending`, `failed` ou `completed` para registros legados. Veja [valores possíveis](/pix-cashout-status#valores-do-campo-status) |
| 7 | `receipt.amount` | Integer | Valor em **unidades base** (÷ 10.000 para reais). `300000` = R$ 30,00 |
| 8 | `receipt.amount_formatted` | String | Valor formatado em reais (`R$ 30,00`) |
| 9 | `receipt.fee_amount` | Integer | Tarifa em unidades base |
| 10 | `receipt.fee_formatted` | String | Tarifa formatada em reais (inclui sub-centavos quando aplicável, ex: `R$ 0,035`) |
| 11 | `receipt.net_amount` | Integer | Valor líquido em unidades base (fallback `t.net_amount || t.amount`) |
| 12 | `receipt.description` | String | Descrição da transferência |
| 13 | `receipt.counterparty_name` | String | Nome da contraparte (pagador ou recebedor, conforme `direction`) |
| 14 | `receipt.recipient_key` | String | Chave PIX do destinatário (apenas saídas) |
| 15 | `receipt.created_at` | String | Data de criação (ISO 8601, vindo de `t.started_at`) |
| 16 | `receipt.completed_at` | String | Data de conclusão (ISO 8601, vindo de `t.finished_at`) |
| 17 | `receipt.institution` | Object | Dados da instituição emissora - sub-objeto com `name`, `cnpj` (formatado `XX.XXX.XXX/XXXX-XX`) e `ispb` |

::: tip Campos formatados
O comprovante inclui campos `_formatted` com valores já convertidos para reais (ex: `R$ 30,00`, `R$ 0,035` para tarifas sub-centavo). Use estes campos para exibição ao usuário. Use os campos numéricos (`amount`, `fee_amount`, `net_amount`) para cálculos. Não há `net_amount_formatted` - derive a exibição do `amount_formatted + fee_formatted`.
:::

::: danger O comprovante **NÃO** retorna os campos de contraparte
Este endpoint **explicitamente omite** os seguintes campos que aparecem em outras consultas (ex: [`GET /transactions/:id`](/pix-cashout-status), [`GET /transactions/e2e/:e2e_id`](/pix-cashout-e2e), [Consulta PIX IN por ID](/pix-cashin-status)):

- `payer_document`
- `recipient_document`
- `payer_ispb`
- `payer_bank_name`

Se sua integração assumiu esses campos em `/receipt` baseada em exemplos de cash-in, ela **está lendo `undefined`** em tempo de execução. Para acesso aos dados completos da contraparte (documentos, ISPB, nome do banco), use `GET /transactions/:id` ou `GET /transactions/e2e/:e2e_id` - ambos usam a tabela `transactions` (mesma fonte) mas expõem o shape completo via `Helpers.format_external_transaction/1`.
:::

::: info Comprovante vs consulta por ID
O endpoint `/receipt` e o endpoint `GET /transactions/:id` usam a mesma fonte (`transactions`) mas retornam shapes distintos:

- **`/receipt`** (17 campos): foco em **exibição** - adiciona `_formatted`, `institution`, e omite os 4 campos de contraparte listados acima.
- **`GET /transactions/:id`** (18 campos no shape "settled"): foco em **integração** - inclui contexto completo da contraparte (`payer_document`, `recipient_document`, `payer_ispb`, `payer_bank_name`, `counterparty_name`) útil para conciliação, e omite os campos `_formatted`.

Use `/receipt` para gerar PDFs/emails/telas de confirmação ao usuário final. Use `GET /transactions/:id` para integração programática e reconciliação interna.
:::

## Resposta de Erro -- 404

```json
{
  "worked": false,
  "detail": "Transação não encontrada"
}
```
