Skip to main content
Outbound webhooks are the notifications PagFinance sends to your backend when a cash-out, cash-in, withdraw, or KYC event happens. You register one destination and receive all your events there.
This is the outbound direction (API to you). The inbound webhooks the platform exposes to receive callbacks from the banking and KYC providers (for example /webhooks/bank) are not part of your integration; you do not consume them.

Register a destination

POST /api/v1/partners/me/webhook-config (partner API key or HMAC) Register once the destination URL, the events you want, and any custom headers. Read it with GET and remove it with DELETE on the same path.
string
required
The single HTTPS destination that receives all of your notifications.
string[]
Subscription filter. Absent or empty receives all events. See the catalog below for valid values.
object
Extra HTTP headers sent on every delivery (for example an authorization token for your endpoint). The platform’s signature and event headers take precedence and are never overwritten.
Without a registered destination, events are only persisted, not sent.

Payload envelope

Every delivery shares a common envelope. The correlation id varies by event family: intentId (cash-out and cash-in), withdrawId (BRLP withdraw), or sessionId (KYC).

Event catalog

Cash-out (offramp), correlation key intentId

Cash-in (onramp), correlation key intentId

CASHIN_COMPLETED has two variants, discriminated by data.deliveryId:
  • Without deliveryId (legacy): crediting the crypto to the user’s wallet is your backend’s responsibility. data: correlationID, walletAddress, valueCents, transactionID, splitApplied, splitValueCents, completedAt.
  • With deliveryId: the platform already delivered the crypto on-chain to data.destination, nothing to credit. data: correlationID, deliveryId, onChainTxId, asset, chain, tokenAmount, destination, completedAt.
CASHIN_FAILED means the fiat was captured but no crypto was delivered. Treat it as an incident and route it to support. The expiry of a cash-in charge does not currently produce a webhook; check status with GET if needed.

BRLP withdraw (Mode B), correlation key withdrawId

KYC, correlation key sessionId

The KYC data carries externalUserId, type ('PF' | 'PJ'), provider, status, previousStatus, documentMasked, rejectionReason?, completedAt?.

Signature verification

Every delivery is signed. Verify the signature before trusting the payload.
The signature is HMAC-SHA256 over the raw JSON body, signed with your partner webhookSecret (delivered at onboarding and rotatable via POST /api/v1/partners/me/rotate-webhook-secret). Compute the expected value and compare with a timing-safe equal.
The signature header prefix defaults to App (X-App-Signature, X-App-Event); your instance’s exact prefix is confirmed at onboarding. Legacy partners without their own secret fall back to a global signing secret.

Delivery guarantees

Retry

3 attempts, backoff 2s / 4s / 8s, 10s timeout per attempt. Failure after retries is only logged; it does not block the business flow.

Acknowledge

Respond 2xx. Any non-2xx or timeout counts as a failure and triggers a retry.

Idempotency

Order is not guaranteed. Deduplicate by intentId, correlationID, withdrawId, or sessionId.

HTTPS only

Register an HTTPS destination only.