Skip to main content

📄 Guide

Organization onboarding, employee creation, card issuing, card status, 3DS challenges, the three transaction events and the deposit alert add up to 18 outbound events in five groups. Every event shares one envelope — read webhookType, then parse the matching data. Your receiver needs a single endpoint.
Prerequisites: register the callback URL and be ready to recompute X-Signature with your SK. Setup steps and verification code are in Webhook configuration.
Webhook verification and dispatch by event typeWebhook verification and dispatch by event type

The envelope

The envelope matches the common webhook structure used by the platform’s other product lines, so one consumer can handle events from all of them. Every ID field is a string; amounts are strings and trailing zeros are not guaranteed.

Event overview (18)

Every event’s data carries organizationId except ORGANIZATION_REJECTED (the entity does not exist yet) and the three transaction events (attribution is derivable from cardId), so you never have to look up ownership.

Organization events

ORGANIZATION_CREATED

ORGANIZATION_REJECTED

This event carries no organizationId — the organization entity is only persisted once KYB passes, so it does not exist at rejection time. Match on organizationRef or organizationApplyId. Also note that status here refers to the application, not the entity as in ORGANIZATION_CREATED.

ORGANIZATION_STATUS_CHANGED

Mirrors updating organization restrictions; pushed once the change is committed.

Employee events

CUSTOMER_CREATED

CUSTOMER_REJECTED

CUSTOMER_STATUS_CHANGED

Mirrors updating employee restrictions.

Card events

CARD_CREATED

CARD_REJECTED

CARD_SHIPPED

Pushed when the tracking number is generated, exactly once.

CARD_ACTIVATED

CARD_STATUS_CHANGED

This event covers neither activation nor expiry: activation is pushed as CARD_ACTIVATED, and expiry currently has no trigger. The 7 card statuses are listed in Managing cards.

AUTHORISATION_3DS_CHALLENGE

The business flow and how to reply are covered in 3DS challenges. The following four fields are populated only when challengeFlowType=OTP_DELEGATE and the partner is configured with otpSendMode=ENTERPRISE: Decryption: AES/GCM/NoPadding with a 128-bit authentication tag; the key is your SK (the same one used for request signing), following the same contract as retrieving secure card details.
merchantCountryCode changes from alpha-3 (three letters) to alpha-2 (two uppercase letters) — that is a value conversion, not just a rename, so your parsing needs to change with it.

Transaction events

The three transaction events describe the same facts as statement line items and reuse the statement domain’s vocabulary: panLast4 / transactionTime / transactionCategory / originalAmount+originalCurrency (the original transaction amount) / postAmount+postCurrency (the posted amount) / merchantName / mcc / merchantCountryCode.
Transaction events carry no organizationId: attribution is derivable from cardId — a card’s organization is fixed at issue time and never changes, and you already received it in CARD_CREATED. Transaction events are far higher in volume than lifecycle events, so they carry only what is necessary. To aggregate by organization, use Statements and transactions.

CARD_TRANSACTION

Authorization and release share one event; approval versus decline is given by status.

CARD_TRANSACTION_SETTLEMENT

transactionCategory has three different value domains: six values on the authorization event (SALES, CASH_ADVANCE, …), twelve on the settlement event (RETAIL, CASH, …) and seven on statement lines (PURCHASE, REFUND, …). Parse them per event type; do not share one enum.

CARD_TRANSACTION_DEBT

Pushed when the card enters a debt state. This payload holds two amounts with different meanings (the debt and the posting), so each carries a qualifier instead of a bare amount.

Fund events

LOW_BALANCE

Raised when the funding pool falls below the threshold. Threshold setup is covered in Company maintenance.

BANK_TRANSFER_INFO

A VA deposit landed. Both success and failure are pushed, distinguished by status.

BALANCE_CHANGE

This event’s contract is not finalised and its fields may change at any time. The current implementation forwards the ledger change log as-is, including internal fields that do not follow the conventions in this documentation. Confirm with the platform before integrating; this page does not define its data structure.
Three things remain open: which balance dimensions it covers (organization pool balance / free balance / a dedicated-balance card’s own balance), how the subject and balance type are identified, and whether every ledger movement is pushed.

Next steps