transaction.refunded — delivered when a refund's funds have been returned to your USD
transactionNo, and they mean different things:| Event | Meaning | Money moved? |
|---|---|---|
transaction.completed | The refund transaction has posted | Not necessarily yet |
transaction.refunded | The funds have been returned to the balance | Yes |
transaction.completed to learn that a refund
transactionNo and its own pair of events.originalTransactionNo, or read the original transaction
billingAmount in this event is what was actually
| Field | Type | Description |
|---|---|---|
eventId | string | Unique per event. Deduplicate on this value |
eventType | string | Always transaction.refunded |
version | string | Payload schema version. Additive changes do not bump it |
occurredAt | string | When the funds were returned — not when the refund posted (ISO 8601) |
data | object | The refund transaction, see below |
dataGET /api/v1/issuing/transaction/{transactionNo}, and
data of transaction.completed for the same transaction. One parser handles all paths.| Field | Type | Description |
|---|---|---|
transactionNo | string | PIK transaction number of the refund |
originalTransactionNo | string | The purchase being refunded |
cardNo | string | PIK card number |
cardholderNo | string | PIK cardholder number |
type | string | Always REFUND for this event |
status | string | COMPLETED |
transactionAmount / transactionCurrency | string | Amount and currency at the merchant |
billingAmount / billingCurrency | string | Amount actually returned in the card's settlement currency |
fx | object | Foreign exchange details |
fees | array | Itemised fee breakdown |
totalFeeAmount | string | Sum of all fee amounts |
totalDebitAmount | string | billingAmount + totalFeeAmount |
merchant | object | name / mcc / city / country |
transactionTime / postedTime | string | Transaction and posting times |
declineReason | string | null for this event |
fx
fees[].{
"eventId": "evt_01J9X8ZQ4TA1",
"eventType": "transaction.refunded",
"version": "1.0",
"occurredAt": "2026-09-23T06:02:44Z",
"data": {
"transactionNo": "TX260923U8V1W3",
"originalTransactionNo": "TX260811K3M5N1",
"cardNo": "CD260811X9Y8Z7",
"cardholderNo": "CH260811A1B2C3",
"type": "REFUND",
"status": "COMPLETED",
"transactionAmount": "4.00",
"transactionCurrency": "USD",
"billingAmount": "4.00",
"billingCurrency": "USD",
"fx": {
"isCrossCurrency": false,
"rate": "1.00000000"
},
"fees": [],
"totalFeeAmount": "0.00",
"totalDebitAmount": "4.00",
"merchant": {
"name": "STEAM PURCHASE",
"mcc": "5734",
"city": "Singapore",
"country": "SG"
},
"transactionTime": "2026-09-23T06:02:30Z",
"postedTime": "2026-09-23T06:02:33Z",
"declineReason": null
}
}| Header | Value |
|---|---|
X-Webhook-Event | Event category, always ISSUING for this event |
X-Webhook-Event-Type | The specific event type, see above |
X-Webhook-Signature | HMAC-SHA256 signature, lowercase hex |
X-Webhook-Signature = hex_lower( HMAC_SHA256( appSecret, rawBody ) )appSecret — there is no separate webhook secret.eventId is mandatory, not optional.eventId.occurredAt to decide which version is newer. In particular,
transaction.completed.transactionNo as the business key; a transaction generates several events.