Skip to content

Extrato

Lista as transações da conta com paginação e filtros.

Endpoint

GET /api/external/statement

Headers

HeaderTipoObrigatórioDescrição
AuthorizationStringSimApiKey {client_id}:{client_secret}
X-Key-CaseStringNãoDefina como camelCase para receber os campos da resposta em camelCase (padrão é snake_case)

Query Parameters

ParâmetroTipoObrigatórioDescriçãoDefault
pageIntegerNãoNúmero da página1
per_pageIntegerNãoItens por página (max 100)20
statusStringNãoFiltrar pela coluna payment_status. Valores: settled, rejected, failed, processing--
typeStringNãoFiltrar por tipo (pix, ted, internal)--
date_fromStringNãoData inicial (formato YYYY-MM-DD)--
date_toStringNãoData final (formato YYYY-MM-DD)--

Valores aceitos em status:

  • settled: Transações liquidadas (padrão de sucesso)
  • rejected: Rejeitadas pelo BACEN
  • failed: Falhas internas ou pós-rejeição
  • processing: Em processamento

Display vs Filter

O valor exibido no campo status da resposta pode diferir do valor aceito pelo filtro:

  • Row com status=2 exibe "pending" mas é filtrada por status=processing
  • Row com payment_status=nil e status=1 exibe "completed" mas é filtrada por status=settled

Use os valores do filtro acima; o display é normalizado para consumo cliente.

Exemplo

bash
curl -X GET "https://api.owem.com.br/api/external/statement?page=1&per_page=20&status=settled&date_from=2026-03-01&date_to=2026-03-07" \
  -H "Authorization: ApiKey $CLIENT_ID:$CLIENT_SECRET"

Resposta de Sucesso (200)

json
{
  "worked": true,
  "data": [
    {
      "id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
      "transaction_id": "7popu57v6us7p6pcicgq12345",
      "end_to_end_id": "E37839059202603071530000001",
      "external_id": "order-9876",
      "type": "pix",
      "status": "settled",
      "amount": 300000,
      "fee_amount": 0,
      "net_amount": 300000,
      "description": "Pedido #1234",
      "direction": "inbound",
      "counterparty_name": "Maria Santos",
      "created_at": "2026-03-07T15:30:00Z",
      "completed_at": "2026-03-07T15:30:02Z"
    },
    {
      "id": "f7e8d9c0-b1a2-4c3d-9e8f-7a6b5c4d3e2f",
      "transaction_id": "PIXOUT20260306x9y8z7w6v5u4",
      "end_to_end_id": "E37839059202603061200000005",
      "external_id": "invoice-4521",
      "type": "pix",
      "status": "settled",
      "amount": 500000,
      "fee_amount": 350,
      "net_amount": 500350,
      "description": "Pagamento fornecedor",
      "direction": "outbound",
      "counterparty_name": "Joao Silva",
      "recipient_key": "12345678901",
      "created_at": "2026-03-06T12:00:00Z",
      "completed_at": "2026-03-06T12:00:03Z"
    }
  ],
  "page": 1,
  "per_page": 20
}
CampoTipoDescrição
workedBooleantrue indica sucesso na operação
dataArrayLista de transações
pageIntegerPágina atual
per_pageIntegerItens por página

Campos de cada transação

CampoTipoDescrição
idStringUUID interno da transação
transaction_idStringIdentificador público da transação
end_to_end_idStringE2E ID do BACEN
external_idStringIdentificador do seu sistema. null se não informado
typeStringTipo (pix, ted, internal)
statusStringStatus da transação (normalizado para display). Ver bloco "Display vs Filter" em Query Parameters.
amountIntegerValor em unidades base (÷ 10.000 para reais). 300000 = R$ 30,00
fee_amountIntegerTarifa cobrada em unidades base
net_amountIntegerValor líquido em unidades base
descriptionStringDescrição da transação
directionStringinbound (entrada) ou outbound (saída)
counterparty_nameStringNome da contraparte
recipient_keyStringChave PIX do destinatário (apenas saídas)
payer_documentStringCPF/CNPJ do pagador (apenas inbound). null para outbound.
recipient_documentStringCPF/CNPJ do recebedor (apenas outbound). null para inbound.
payer_ispbStringISPB da instituição pagadora (apenas inbound). null para outbound.
payer_bank_nameStringNome do banco pagador resolvido pelo ISPB (apenas inbound). null para outbound.
created_atStringData de criação (ISO 8601 UTC)
completed_atStringData de conclusão (ISO 8601 UTC). null se ainda não liquidada.

Data em UTC

Todos os campos de data/hora são retornados em ISO 8601 UTC (sufixo Z). Para converter para horário de Brasília (BRT), subtraia 3 horas. O filtro date_from/date_to também é interpretado como UTC — um dia filtrado (date_from=2026-03-07) cobre de 2026-03-07T00:00:00Z até 2026-03-07T23:59:59Z.

In-flight transactions

A página 1 da listagem inclui PIX OUT ainda em voo (tabela outbound_requests, stage < 3) quando não há filtro status aplicado ou status=processing. Isso permite conciliação em tempo real — você vê a transação enquanto ela está sendo processada pelo BACEN, com status="pending", payment_status="processing" e completed_at=null.

Quando você aplica status=settled ou status=rejected, o merge com outbound_requests não é feito — apenas a tabela transactions/failed_transactions é consultada. Isso evita duplicidade quando você só quer transações terminais.

net_amount em outbound é a soma (não subtração)

Em transações outbound (direction="outbound"), o net_amount é calculado como amount + fee_amount (débito total na conta, incluindo a tarifa). Em transações inbound, net_amount = amount - fee_amount (crédito líquido já com a tarifa descontada).

Exemplo outbound: amount=500000, fee_amount=350, net_amount=500350 — R$ 50,035 debitados da sua conta. Não R$ 49,965.

Rate limit e polling

GET /statement passa pelo rate limiter global de /api/external/* (90.000 req/min por IP autenticado). Apenas GET /balance é exceção e não passa pelo limiter. Mesmo assim, evite polling alto neste endpoint — prefira assinar webhooks (pix.charge.paid, pix.payout.confirmed, pix.payout.failed) para notificação em tempo real e use /statement para conciliação periódica (ex: intervalos de 5-15 min ou end-of-day batch).

Permissão

Este endpoint requer statement:read na API Key. O endpoint irmão GET /api/external/transactions (mesma query base, shape quase idêntica) requer transfer:read — caso sua integração use apenas um conjunto de permissões, confirme qual endpoint aceita seus escopos.

Resposta de Erro (401)

json
{
  "worked": false,
  "errors": {
    "unauthorized": "Missing API key credentials. Use Authorization: ApiKey <client_id>:<client_secret>"
  }
}

Paginação

O limite máximo de per_page é 100. Para extrair grandes volumes, itere pelas páginas incrementando o parâmetro page até que a resposta retorne um array data vazio ou com menos itens que per_page.

Owem Pay Instituição de Pagamento — ISPB 37839059