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/receiptHeaders
| 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) |
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 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
curl -X GET https://api.owem.com.br/api/external/transactions/PIXOUT20260309a1b2c3d4e5f6/receipt \
-H "Authorization: ApiKey $CLIENT_ID:$CLIENT_SECRET"Resposta de Sucesso -- 200
{
"worked": true,
"receipt": {
"transaction_id": "PIXOUT20260309a1b2c3d4e5f6",
"end_to_end_id": "E37839059202603091530abcdef01",
"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": "Owem Pay",
"cnpj": "37.839.059/0001-88",
"ispb": "37839059"
}
}
}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). Rows legadas podem retornar outros valores (ted, tef, etc.) — o controller faz passthrough de t.type sem filtrar |
| 5 | receipt.direction | String | outbound ou inbound quando o campo está persistido em transactions.direction. Quando nil, o controller faz fallback para Helpers.infer_direction/2, que retorna apenas credit (conta alvo é a do recebedor) ou debit (conta alvo é a do pagador) — nunca inbound/outbound no caminho de inferência |
| 6 | receipt.status | String | Status da transação resolvido via Helpers.format_status/1. Valores possíveis: settled (normal), pending (transactions.status=2), failed (status=3), completed (fallback legado para rows onde status=1 e payment_status=nil). Veja valores possíveis |
| 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 |
| 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 |
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.
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, GET /transactions/e2e/:e2e_id, Consulta PIX IN por ID):
payer_documentrecipient_documentpayer_ispbpayer_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.
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
{
"worked": false,
"detail": "Transação não encontrada"
}