Skip to content

Webhook Payloads

Examples of payloads sent for each event type. All webhooks are sent as HTTP POST with Content-Type: application/json.

Security headers

Each notification includes the headers X-Owem-Signature (HMAC-SHA256), X-Owem-Timestamp, X-Owem-Event-Id, and X-Owem-Event-Type. See Webhooks — Overview for validation details.


Status Reference

Not all events mean the transaction is complete. Use the table below to know when funds have actually been settled.

EventStatusMeaningFunds settled?
pix.charge.createdcreatedQR code generated or cash-in initiated. Awaiting payment.No — just created
pix.charge.paidpaidPIX received and settled in account. Balance updated, fee charged.Yes
pix.charge.expiredexpiredQR code expired without payment.N/A
pix.charge.cancelledcancelledQR code cancelled before payment.N/A
pix.payout.processingprocessingPIX sent, awaiting confirmation from destination. Balance reserved (hold).No — may revert
pix.payout.confirmedsettledPIX sent confirmed by destination. Final debit.Yes
pix.payout.failedrejectedPIX sent rejected by destination. Hold released, balance restored.No
pix.payout.returnedreturnedPIX sent returned after settlement.Yes (reverse)
pix.refund.requestedrequestedPIX refund requested (MED or voluntary). Reserve created.Partial
pix.refund.completedcompletedPIX refund completed and settled. Final debit.Yes
pix.return.receivedreceivedPIX return received (credit to account).Yes
webhook.testtestManual test event triggered.N/A

Rule: For financial reconciliation, only consider paid, settled, received, or completed statuses as final. All others are intermediate.


Common Fields

All webhook payloads include these fields:

FieldTypeDescription
event_typestringThe event that triggered this webhook (e.g., pix.charge.paid)
statusstringOperation status — see Status Reference
account_idintegerYour account number at Owem
entity_idstring (UUID)Owem entity identifier

Monetary values: All amounts are in subcentavos (1 BRL = 10,000 subcentavos). To convert to BRL: amount / 10000. Example: 300000 / 10000 = R$ 30.00.


pix.charge.paid

Sent when a PIX is received and settled in the account. This is the event that confirms the money has arrived.

Example — linked to QR code

json
{
  "event_type": "pix.charge.paid",
  "status": "paid",
  "account_id": 10014,
  "amount": 300000,
  "fee_amount": 400,
  "end_to_end_id": "E9040088820260402095758709999671",
  "entity_id": "26a48541-edce-4581-8c6e-564e7f2e6cd7",
  "tx_id": "u5f26sfyrq4plkw7tjwa",
  "counterparty_name": "MARIA SANTOS",
  "external_id": "order-9876",
  "paid_at": "2026-04-02T09:58:05Z"
}

Example — direct transfer (no QR)

json
{
  "event_type": "pix.charge.paid",
  "status": "paid",
  "account_id": 10014,
  "amount": 300000,
  "fee_amount": 400,
  "end_to_end_id": "E9040088820260402095758709999671",
  "entity_id": "26a48541-edce-4581-8c6e-564e7f2e6cd7",
  "tx_id": null,
  "counterparty_name": "JOAO SILVA",
  "external_id": null,
  "paid_at": "2026-04-02T10:15:22Z"
}
FieldTypeDescription
event_typestringAlways pix.charge.paid
statusstringAlways paid
account_idintegerAccount number that received the PIX
amountintegerAmount received in subcentavos. 300000 = R$ 30.00
fee_amountintegerFee charged in subcentavos. 400 = R$ 0.04
end_to_end_idstringBACEN end-to-end identifier (unique per PIX transaction)
entity_idstring (UUID)Owem entity identifier
tx_idstring or nullTransaction ID. Present when linked to a QR code. null for direct transfers
counterparty_namestring or nullName of the payer (sender)
external_idstring or nullYour external identifier. Present when the QR code was created via API with external_id. null for direct transfers or QR codes without external_id
qr_code_idstring or nullLinked QR code ID. null for direct transfers
paid_atstring (ISO 8601)Settlement timestamp (UTC)

pix.charge.expired

Triggered automatically when a QR code expires (worker runs every 5 min).

json
{
  "event_type": "pix.charge.expired",
  "status": "expired",
  "account_id": 10014,
  "entity_id": "26a48541-edce-4581-8c6e-564e7f2e6cd7",
  "tx_id": "abc123def456ghi789",
  "external_id": "order-9876"
}
FieldTypeDescription
event_typestringAlways pix.charge.expired
statusstringAlways expired
tx_idstringCharge/QR code ID
external_idstring or nullYour external identifier

pix.charge.cancelled

Planned

This event is planned but not yet implemented.


pix.charge.created

Sent when a QR code is generated or a cash-in is initiated. No financial movement has occurred.

json
{
  "event_type": "pix.charge.created",
  "status": "created",
  "account_id": 10014,
  "amount": 500000,
  "entity_id": "26a48541-edce-4581-8c6e-564e7f2e6cd7",
  "tx_id": "abc123def456ghi789",
  "external_id": "order-9876"
}
FieldTypeDescription
event_typestringAlways pix.charge.created
statusstringAlways created
amountintegerExpected amount in subcentavos
tx_idstringCharge/QR code ID
external_idstring or nullYour external identifier, returned as provided. null if not set or QR generated via portal

pix.payout.confirmed

Sent when a PIX payout is confirmed by the destination institution. Final debit.

json
{
  "event_type": "pix.payout.confirmed",
  "status": "settled",
  "account_id": 10014,
  "amount": 500000,
  "fee_amount": 200,
  "end_to_end_id": "E3783905920260402101500000001",
  "entity_id": "26a48541-edce-4581-8c6e-564e7f2e6cd7",
  "transaction_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "external_id": "payment-456",
  "pix_key": "destinatario@email.com",
  "description": "Pagamento fornecedor",
  "recipient": {
    "name": "EMPRESA DESTINO LTDA",
    "document": "12345678000199",
    "ispb": "60701190",
    "account": "12345678",
    "agency": "0001",
    "institution_name": "Itau Unibanco S.A."
  }
}
FieldTypeDescription
event_typestringAlways pix.payout.confirmed
statusstringAlways settled — final debit
amountintegerAmount sent in subcentavos
fee_amountintegerFee charged in subcentavos
end_to_end_idstringBACEN end-to-end identifier
transaction_idstring (UUID)Unique transaction identifier
external_idstring or nullYour external identifier
pix_keystringRecipient PIX key
descriptionstring or nullDescription provided by sender
recipientobjectRecipient bank details (resolved via DICT)
recipient.namestring or nullName of the destination account holder
recipient.documentstring or nullRecipient CPF/CNPJ (digits only)
recipient.ispbstring or nullDestination institution ISPB
recipient.accountstring or nullDestination account number
recipient.agencystring or nullDestination account agency
recipient.institution_namestring or nullDestination institution name

pix.payout.processing

Sent when a PIX payout is being processed. Balance is reserved (hold) but not final.

json
{
  "event_type": "pix.payout.processing",
  "status": "processing",
  "account_id": 10014,
  "amount": 500000,
  "fee_amount": 0,
  "end_to_end_id": "E3783905920260402101500000001",
  "entity_id": "26a48541-edce-4581-8c6e-564e7f2e6cd7",
  "transaction_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "external_id": "payment-456",
  "pix_key": "destinatario@email.com",
  "description": "Pagamento fornecedor",
  "recipient": {
    "name": "EMPRESA DESTINO LTDA",
    "document": "12345678000199",
    "ispb": "60701190",
    "account": "12345678",
    "agency": "0001",
    "institution_name": "Itau Unibanco S.A."
  }
}
FieldTypeDescription
event_typestringAlways pix.payout.processing
statusstringAlways processing — balance reserved, may revert
amountintegerAmount in subcentavos
fee_amountintegerFee in subcentavos (usually 0 until confirmation)
end_to_end_idstringBACEN end-to-end identifier
transaction_idstring (UUID)Unique transaction identifier
external_idstring or nullYour external identifier
pix_keystringRecipient PIX key
descriptionstring or nullDescription provided by sender
recipientobjectRecipient bank details (resolved via DICT)
recipient.namestring or nullName of the destination account holder
recipient.documentstring or nullRecipient CPF/CNPJ (digits only)
recipient.ispbstring or nullDestination institution ISPB
recipient.accountstring or nullDestination account number
recipient.agencystring or nullDestination account agency
recipient.institution_namestring or nullDestination institution name

pix.payout.failed

Sent when a PIX payout is rejected. Hold released, balance restored.

json
{
  "event_type": "pix.payout.failed",
  "status": "rejected",
  "account_id": 10014,
  "amount": 500000,
  "fee_amount": 0,
  "end_to_end_id": "E3783905920260402101500000001",
  "entity_id": "26a48541-edce-4581-8c6e-564e7f2e6cd7",
  "transaction_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "external_id": "payment-456",
  "pix_key": "destinatario@email.com",
  "reason": "Conta destinatario nao encontrada",
  "recipient": {
    "name": "EMPRESA DESTINO LTDA",
    "document": "12345678000199",
    "ispb": "60701190",
    "account": "12345678",
    "agency": "0001",
    "institution_name": "Itau Unibanco S.A."
  }
}
FieldTypeDescription
event_typestringAlways pix.payout.failed
statusstringAlways rejected — hold released, balance restored
amountintegerAmount in subcentavos
fee_amountintegerFee in subcentavos (usually 0 when rejected)
end_to_end_idstringBACEN end-to-end identifier
transaction_idstring (UUID)Unique transaction identifier
external_idstring or nullYour external identifier
pix_keystringRecipient PIX key
reasonstringRejection reason description
recipientobjectRecipient bank details (resolved via DICT)
recipient.namestring or nullName of the destination account holder
recipient.documentstring or nullRecipient CPF/CNPJ (digits only)
recipient.ispbstring or nullDestination institution ISPB
recipient.accountstring or nullDestination account number
recipient.agencystring or nullDestination account agency
recipient.institution_namestring or nullDestination institution name

pix.payout.returned

Sent when a PIX payout is returned after settlement. The payload follows the same format as pix.return.received.

json
{
  "event_type": "pix.payout.returned",
  "status": "returned",
  "account_id": 10014,
  "amount": 300000,
  "entity_id": "26a48541-edce-4581-8c6e-564e7f2e6cd7",
  "return_e2e_id": "D9040088820260402111500000001",
  "original_e2e_id": "E9040088820260402095758709999671",
  "return_code": "MD06",
  "external_id": "payment-456"
}
FieldTypeDescription
event_typestringAlways pix.payout.returned
statusstringAlways returned — PIX payout returned
amountintegerAmount returned in subcentavos
return_e2e_idstringReturn E2E identifier
original_e2e_idstringE2E of the original PIX transaction
return_codestringBACEN return code
external_idstring or nullYour external identifier from the original transaction (if applicable)

pix.refund.requested

Sent when a PIX refund is requested via MED (Special Return Mechanism). Funds have been precautionarily blocked in the merchant account that received the original PIX.

PIX In only

This event only applies to received PIX payments (cash-in). If you sent a PIX and it was returned, you will receive pix.return.received instead of pix.refund.*.

json
{
  "event_type": "pix.refund.requested",
  "status": "requested",
  "account_id": 10014,
  "amount": 300000,
  "entity_id": "26a48541-edce-4581-8c6e-564e7f2e6cd7",
  "block_id": "b1c2d3e4-f5g6-7890-hijk-lm1234567890",
  "infraction_report_id": "INF20260402001",
  "e2e_id": "E9040088820260402095758709999671",
  "external_id": null,
  "blocked_amount": 300000,
  "fee_amount": 0,
  "fraud_category": "SCAM",
  "deadline": "2026-04-09T14:30:00Z",
  "scenario": "cautelar",
  "created_at": "2026-04-02T14:30:00Z"
}
FieldTypeDescription
event_typestringAlways pix.refund.requested
statusstringAlways requested — precautionary block active
amountintegerAmount requested for refund in subcentavos
block_idstring (UUID)Precautionary block identifier
infraction_report_idstringInfraction identifier at OnZ
e2e_idstringE2E of the original PIX transaction being disputed
external_idstring or nullYour external identifier (if applicable)
blocked_amountintegerAmount effectively blocked in subcentavos
fee_amountintegerMED fee in subcentavos
fraud_categorystringAlleged fraud category (e.g., SCAM, ACCOUNT_TAKEOVER)
deadlinestring (ISO 8601)Deadline for analysis/defense (UTC)
scenariostringMED scenario: cautelar or fraude
created_atstring (ISO 8601)Block timestamp (UTC)

pix.refund.completed

Sent when a PIX refund is processed and completed.

json
{
  "event_type": "pix.refund.completed",
  "status": "completed",
  "account_id": 10014,
  "amount": 300000,
  "entity_id": "26a48541-edce-4581-8c6e-564e7f2e6cd7",
  "block_id": "b1c2d3e4-f5g6-7890-hijk-lm1234567890",
  "infraction_report_id": "INF20260402001",
  "e2e_id": "E9040088820260402095758709999671",
  "external_id": null,
  "reason": "analysis_unfounded",
  "completed_at": "2026-04-02T14:30:00Z"
}
FieldTypeDescription
event_typestringAlways pix.refund.completed
statusstringAlways completed — MED refund finalized
amountintegerAmount refunded in subcentavos
block_idstring (UUID)Precautionary block identifier
infraction_report_idstringOnZ infraction identifier
e2e_idstringE2E of the original PIX transaction
external_idstring or nullYour external identifier (if applicable)
reasonstringRelease reason (e.g., analysis_unfounded, manual_release)
completed_atstring (ISO 8601)Completion timestamp (UTC)

pix.return.received

Sent when a PIX return is received (credit to account).

json
{
  "event_type": "pix.return.received",
  "status": "received",
  "account_id": 10014,
  "amount": 300000,
  "entity_id": "26a48541-edce-4581-8c6e-564e7f2e6cd7",
  "return_e2e_id": "D9040088820260402111500000001",
  "original_e2e_id": "E9040088820260402095758709999671",
  "return_code": "MD06",
  "external_id": null
}
FieldTypeDescription
event_typestringAlways pix.return.received
statusstringAlways received — return credit applied
return_e2e_idstringReturn E2E identifier
original_e2e_idstringE2E of the original PIX transaction
return_codestringBACEN return code
external_idstring or nullYour external identifier from the original transaction (if applicable)

webhook.test

Manual test event triggered to validate webhook configuration.

json
{
  "event_type": "webhook.test",
  "status": "test",
  "account_id": 10014,
  "entity_id": "26a48541-edce-4581-8c6e-564e7f2e6cd7",
  "message": "Webhook test event"
}

How to interpret webhooks

To confirm money has arrived: Wait for pix.charge.paid with status: "paid". This is the only event that guarantees the amount was credited and the fee was charged.

To confirm money was sent: Wait for pix.payout.confirmed with status: "settled". The processing status is intermediate — balance is reserved but may be reversed if rejected.

For returns: pix.return.received with status: "received" confirms credit to account.

Deduplication: Use the X-Owem-Event-Id header or the end_to_end_id field as an idempotency key.

Owem Pay Instituição de Pagamento — ISPB 37839059