Skip to main content
To receive events instead of polling, open your organization settings in the dashboard and go to the Webhooks tab. Configure the webhook URL and signing secret for that organization.

Delivery format

Events arrive as a JSON POST to your webhook URL:
The token is an HS256-signed JWT whose payload is { event, data, iat, exp }, signed with your organization’s webhook secret. The outer event and data fields are unauthenticated convenience copies — always verify the token before trusting anything.

Verifying deliveries

Use resolvePviumWebhookPayload to verify the signed token in a webhook request body and return the verified event and data. If you have already extracted the token, pass it directly to verifyPviumWebhookToken. Each SDK provides both helpers.
Verification checks the signature, rejects expired tokens, and checks the event name when an expected event is supplied. A valid token can be delivered more than once; use the deduplication guidance below to avoid processing the same event twice.

Events

All payloads carry appId — your organization’s ID.

Payloads

The event can follow either invite acceptance or a direct addition to a batch. Your handler must accept both payload variants; for example, do not require invite details for a payee added directly.
Instant batches fire once, on the single payment transaction. Scheduled and pool batches fire on every funding transaction — watch batch.fullyFunded for the transition into fully funded.
Fires the first time a payment transitions from unclaimed to claimed — duplicate claim events are debounced.
Delivers the payee’s resolved identity plus the active authorization your organization was granted, including access and refresh tokens. This event is emitted when the authorization is active immediately. If payee screening is pending, handle oauth.authorization.activated instead.
Sent when an invite authorization that was pending payee screening becomes active. The authorization is active only after the required onboarding checks for the invite scopes have completed. This event does not prove that the user is payable in a particular batch; use the batch-scoped isPayable check before adding or finalizing a Strict batch.

Retries and idempotency

Pvium retries failed deliveries with increasing delays between attempts. Store an identifier for each processed event and skip duplicate deliveries. Use the following identifiers for each event type:
  • batch.funded and batch.payee.claimed — the transactionHash
  • payment.attachedpaymentData.id
  • oauth.invite.accepted and oauth.authorization.activatedauthorization.id
  • batch.payee.addedinvite.id or authorization.id
Acknowledge quickly with a 2xx and process asynchronously, and reconcile against payout records rather than relying on webhooks alone — records are the source of truth for settled payments.