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
  • Issuing
    • Card Products
      • List Card Products
    • Cardholders
      • Create Cardholder
      • List Cardholders
      • Get Cardholder
    • Cards
      • Issue Card
      • List Cards
      • Get Card
      • Create Card Secure Session
      • Adjust Card Limit
      • Freeze Card
      • Unfreeze Card
    • Transactions
      • List Transactions
      • Get Transaction
  • 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 Operation Failed
      • Card OTP
      • Card Updated
      • Transaction Completed
      • Transaction Declined
      • Transaction Refunded
      • Transaction Reversed
      • Card Activated
      • Card Failed
  1. Issuing

Card Updated

card.updated — delivered when a card's limit or status has changed and the change has taken effect.

When it fires#

The three card operations — adjust limit, freeze, unfreeze — all return status: PROCESSING,
which only means the request was accepted. The card itself has not changed yet. This event is the
confirmation that it has.
Wait for this event before showing your end user the new limit or status.
One event covers all three operations; there is no separate event per operation. Whatever changed,
data is the full current card — apply it as a replacement snapshot, not as a diff.
It also fires for changes PIK made on your behalf rather than through your API call, and for
status changes set by the card network (for example a card becoming BLOCKED or CANCELLED), so a
card can change without you having asked. Treat this event, not your own request, as the source of truth
for a card's current limit and status.
If the card network rejects an operation after accepting it, you receive
card.operation.failed instead, and the card keeps its previous
limit and status. Every accepted operation therefore ends in exactly one of the two events. An
operation refused synchronously by the API (a 4xx response) was never accepted and produces no
event.

Payload#

Envelope#

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

data#

Structurally identical to the response of GET /api/v1/issuing/card/{cardNo}, so a single parser
handles both paths.
FieldTypeDescription
cardNostringPIK card number
cardholderNostringPIK cardholder number this card belongs to
maskedCardNumberstringMasked card number
statusstringThe status after the change. After your own limit / freeze / unfreeze operations this is ACTIVE or FROZEN; changes from the card network can bring any card status: PENDING / ACTIVE / FROZEN / BLOCKED / PRE_CANCEL / CANCELLED / LOST / STOLEN / FAILED. Treat an unrecognised value as "not usable"
cardLimitstringCumulative spending ceiling, after the change
availableLimitstringRemaining spendable amount against cardLimit
currencystringSettlement currency
labelstringYour label for the card
externalIdstringYour own identifier
createTimeUtcstringCreation time (UTC)

Example — limit raised#

{
  "eventId": "evt_01J9X8ZQ4T7M",
  "eventType": "card.updated",
  "version": "1.0",
  "occurredAt": "2026-09-23T04:11:27Z",
  "data": {
    "cardNo": "CD260811X9Y8Z7",
    "cardholderNo": "CH260811A1B2C3",
    "maskedCardNumber": "409636******0501",
    "status": "ACTIVE",
    "cardLimit": "800.00",
    "availableLimit": "788.50",
    "currency": "USD",
    "label": "Ads spend - Q3",
    "externalId": "card-req-4471",
    "createTimeUtc": "2026-08-11T02:16:02Z"
  }
}

Example — card frozen#

{
  "eventId": "evt_01J9X8ZQ4T8N",
  "eventType": "card.updated",
  "version": "1.0",
  "occurredAt": "2026-09-23T04:15:02Z",
  "data": {
    "cardNo": "CD260811X9Y8Z7",
    "cardholderNo": "CH260811A1B2C3",
    "maskedCardNumber": "409636******0501",
    "status": "FROZEN",
    "cardLimit": "800.00",
    "availableLimit": "788.50",
    "currency": "USD",
    "label": "Ads spend - Q3",
    "externalId": "card-req-4471",
    "createTimeUtc": "2026-08-11T02:16:02Z"
  }
}
What freezing does. A frozen card is refused for all new authorisations. Transactions
that were already authorised but not yet settled are unaffected — they will still settle, and
you will still receive their events.

Verifying the signature#

Three headers accompany every delivery:
HeaderValue
X-Webhook-EventEvent category, always ISSUING for this event
X-Webhook-Event-TypeThe specific event type, see above
X-Webhook-SignatureHMAC-SHA256 signature, lowercase hex
X-Webhook-Signature = hex_lower( HMAC_SHA256( appSecret, rawBody ) )
The signed content is the raw request body only, with no timestamp and no separator. The signing
key is your appSecret — there is no separate webhook secret.
1.
Sign the raw bytes of the request body, before any JSON parsing.
2.
Compare in constant time.
3.
Nothing time-based is signed, so a captured delivery stays replayable — deduplicating on
eventId is mandatory, not optional
.

Delivery#

Return any 2xx within 10 seconds to acknowledge.
Failed deliveries are retried on a fixed interval: 5 attempts, 5 minutes apart (about
20 minutes in total), after which the event is marked exhausted and never retried again.
This endpoint receives Issuing events only; still return 2xx for event types you do not handle.
Delivery is at least once — deduplicate on eventId.
Ordering is not guaranteed — use occurredAt to decide which version is newer. A card that
changes twice in quick succession produces two events, and they can arrive out of order.
See the Webhooks guide for verification code samples and recommended
handling.
Modified at 2026-09-30 09:26:58
Previous
Card OTP
Next
Transaction Completed
Built with