1. Issuing
PIK
  • Start
    • Getting Started
  • Authentication
    • Authentication Token
      POST
  • Global Account
    • Contacts
      • Create Contact
      • List Contacts
      • Get Contact
      • Count Contacts
    • Virtual Accounts
      • Create Virtual Account
      • List Virtual Accounts
      • Get Virtual Account
    • Transactions
      • List Transactions
      • Get Transaction
    • Account Balance
      • List Account Balances
      • Get Balance by Currency
    • Payout
      • Create Payout
  • Payment Links
    • Payment Links
      • Create Payment Link
      • Update Payment Link
      • Get Payment Link Detail
      • Get Payment Link List
    • Transactions
      • Get Transaction List
  • Webhook
    • Global Account
      • Deposit Webhook
      • Payout Webhook
      • Virtual Account Webhook
    • Payment Links
      • Overview
      • Order Collect Out Webhook
      • Customer Payment Webhook
      • Customer Refund Webhook
      • Master Recharge Webhook
      • Web3 Direct Payment Webhook
      • Withdraw Out Webhook
    • Issuing
      • Card Activated
      • Card Failed
      • Transaction Completed
      • Transaction Declined
  • Issuing
    • Card Products
      • List Card Products
    • Cardholders
      • Create Cardholder
      • List Cardholders
      • Get Cardholder
    • Cards
      • Issue Card
      • List Cards
      • Get Card
      • Create Card Secure Session
    • Transactions
      • List Transactions
      • Get Transaction
  1. Issuing

Transaction Declined

transaction.declined — delivered when a transaction is declined by the card network.

When it fires#

A transaction was attempted on one of your cards and the card network refused it. The most
common cause is that the amount exceeds the card's remaining availableLimit.
Because this release performs no pre-authorization, PIK does not participate in the decision;
declineReason is passed through from the card network verbatim.
Declined transactions carry no fees in this release, so fees is empty and
totalFeeAmount is 0.00.

Payload#

Envelope#

FieldTypeDescription
eventIdstringUnique per event. Deduplicate on this value
eventTypestringAlways transaction.declined
versionstringPayload schema version. Additive changes do not bump it
occurredAtstringWhen the event happened, not when it was delivered (ISO 8601)
dataobjectThe transaction, see below

data#

Structurally identical to the response of GET /api/v1/issuing/transaction/{transactionNo}, so
a single parser handles both paths.
FieldTypeDescription
transactionNostringPIK transaction number
cardNostringPIK card number
cardholderNostringPIK cardholder number
typestringPURCHASE / REFUND / REVERSAL / ATM_WITHDRAWAL / VERIFICATION / SETTLEMENT_ADJUST
statusstringDECLINED for this event
originalTransactionNostringnull unless the declined attempt referenced an earlier transaction
transactionAmountstringAmount in the merchant's currency
transactionCurrencystringMerchant currency, ISO 4217
billingAmountstringAmount that would have been posted in the settlement currency
billingCurrencystringSettlement currency, ISO 4217
fxobjectForeign exchange details, see below
feesarrayEmpty for declined transactions
totalFeeAmountstring0.00
totalDebitAmountstringEquals billingAmount, since no fee applies
merchantobjectname / mcc / city / country
transactionTimestringTime the transaction was attempted
postedTimestringnull — the transaction never posted
declineReasonstringReason passed through from the card network

fx#

FieldTypeDescription
isCrossCurrencybooleanWhether the transaction currency differs from the billing currency
ratestringExchange rate applied, billing currency per unit of transaction currency
convertedAmountstringTransaction amount converted at that rate, excluding any fees

Example#

{
  "eventId": "evt_01J9X8ZQ4T5S",
  "eventType": "transaction.declined",
  "version": "1.0",
  "occurredAt": "2026-08-11T11:05:02+08:00",
  "data": {
    "transactionNo": "TX260811V4W6X2",
    "cardNo": "CD260811X9Y8Z7",
    "cardholderNo": "CH260811A1B2C3",
    "type": "PURCHASE",
    "status": "DECLINED",
    "originalTransactionNo": null,
    "transactionAmount": "620.00",
    "transactionCurrency": "USD",
    "billingAmount": "620.00",
    "billingCurrency": "USD",
    "fx": {
      "isCrossCurrency": false,
      "rate": "1",
      "convertedAmount": "620.00"
    },
    "fees": [],
    "totalFeeAmount": "0.00",
    "totalDebitAmount": "620.00",
    "merchant": {
      "name": "CLOUD HOSTING LTD",
      "mcc": "5734",
      "city": "Singapore",
      "country": "SG"
    },
    "transactionTime": "2026-08-11T11:05:00+08:00",
    "postedTime": null,
    "declineReason": "Insufficient card limit"
  }
}

Verifying the signature#

Two headers accompany every delivery:
HeaderValue
x-pik-timestampUnix timestamp in seconds
x-pik-signatureHMAC-SHA512 signature, lowercase hex
x-pik-signature = hex_lower( HMAC_SHA512( webhookSecret, rawBody + timestamp ) )
The signed content is the raw body concatenated with the timestamp, no separator.
1.
Sign the raw bytes of the request body, before any JSON parsing.
2.
Compare in constant time.
3.
Reject deliveries whose x-pik-timestamp is more than 300 seconds from your clock.

Delivery#

Return HTTP 200 within 5 seconds to acknowledge.
Failed deliveries are retried with exponential backoff: 10s, 1m, 5m, 30m, 2h, 6h, 24h.
Delivery is at least once — deduplicate on eventId.
Ordering is not guaranteed — use occurredAt to decide which version is newer.
See the Webhooks guide for verification code samples and recommended
handling.
Modified at 2026-08-11 10:12:51
Previous
Transaction Completed
Next
List Card Products
Built with