Card account updater
Keep saved cards working when issuers replace them. How Account Updater works and how to receive the webhook.
Cards expire, get lost or are reissued. When that happens, the card you saved no longer works and your next renewal fails.
Account Updater is a card-scheme service (Visa, Mastercard and Elo) that supplies the new card details when an issuer replaces a card. PPRO uses it to recover from these declines automatically.
How it works at PPRO
PPRO's Account Updater runs in real time, at the moment of the decline. You do not change your payment requests.
- You submit a payment with a
RAW_CARDor a vaulted card (CARD_PPRO_VAULTED). - The issuer declines with a card lifecycle reason, such as an expired, lost or stolen card.
- PPRO asks Visa or Mastercard for updated card details.
- If the scheme returns new details:
- PPRO updates the stored payment instrument with the new expiry date or card number.
- PPRO retries the authorization with the new details.
- If a webhook URL is configured, PPRO sends a
PAYMENT_INSTRUMENT_DETAILS_UPDATEDwebhook.
- You receive the result of the final authorization attempt: approved, or the decline reason.
sequenceDiagram
autonumber
participant M as Merchant
participant P as PPRO
participant S as Card scheme<br/>(Visa / Mastercard)
participant I as Issuer
M->>P: POST /v1/payment-charges (instrumentId)
P->>I: Authorization
I-->>P: Decline (expired / lost / stolen)
P->>S: Request updated card details
alt New details found
S-->>P: New PAN and/or expiry
P->>P: Update stored instrument
P-->>M: Webhook PAYMENT_INSTRUMENT_DETAILS_UPDATED
P->>I: Retry authorization with new details
I-->>P: Result
else No update available
S-->>P: No match or account closed
end
P-->>M: Final charge result
What you get back
| Outcome | What happens | What you should do |
|---|---|---|
| New account information | The instrument is updated, the payment is retried and the webhook is sent. | Nothing is required. Optionally sync your own records from the webhook. |
| Account closed, or no new details | The decline is returned to you. | Ask the customer for a new payment method. Check the Merchant Advice Code. |
| No changes | The card is still valid. | Handle the decline as a normal decline. |
Enabling Account Updater
- Contact your PPRO Account Manager to activate it for your account.
- No changes to your payment requests are needed.
- Supported networks: Elo, Visa and Mastercard.
Receiving the webhook
The webhook tells you that a stored card changed, so you can refresh your records and show the customer up-to-date card details (for example, the last four digits).
1. Set up your endpoint
- HTTPS only, on port 443. Other ports need to be enabled by your Account Manager.
- Respond with a
2xxstatus quickly. Store the payload and process it afterwards. - PPRO retries failed deliveries with exponential backoff (first retry after 15 seconds, doubling each time, up to 15 attempts over roughly 68 hours).
2. Configure the URL
Use an account-level URL for this event
PAYMENT_INSTRUMENT_DETAILS_UPDATEDis an instrument event, not a charge event. Ask your Account Manager to configure a defaultwebhooksUrlfor your account so it is delivered to your endpoint. AwebhooksUrlsent on an individual payment request applies to that payment's own events.
Ask your Account Manager to:
- Set your default
webhooksUrl. If you use separate URLs for payments and disputes, make sure the instrument events go to your payments URL. - Set your signing secret, so you can verify the
PPRO-Signatureheader. - Optionally add static custom headers, for example for your own routing or authentication.
The webhook URL can also be defined at merchant group or PSP level. PPRO uses the most specific configuration that exists for your merchant.
3. Verify the signature
Each delivery includes a PPRO-Signature header:
ppro-signature: t=1776785532,s=5271af077eb3525e5c50ceaa44834ff10cc6f32f6bd060e341e0dad60bae49bb
- Compute the HMAC SHA-256 of
t + "." + payload, using your signing secret as the key. Use the raw request body, not a re-serialized one. - Compare the result with
s. - Check that
tis recent, to guard against replays.
See Webhooks for details.
When is the webhook sent?
PPRO sends PAYMENT_INSTRUMENT_DETAILS_UPDATED whenever the details of a stored payment instrument change. This includes:
- Account Updater finds new card details after a lifecycle decline, as described above.
- The instrument is updated in another way (for example, a merchant-initiated update of the instrument).
It is not sent when:
- Account Updater finds nothing new.
- The card works and nothing changes.
The related instrument events are:
| Event | Sent when |
|---|---|
PAYMENT_INSTRUMENT_CREATED | A new instrument is stored. |
PAYMENT_INSTRUMENT_DETAILS_UPDATED | The details of a stored instrument change. |
PAYMENT_INSTRUMENT_DELETED | An instrument is deleted. |
What the webhook looks like
The payload follows the CloudEvents 1.0.2 envelope used by all PPRO webhooks. The data object carries the instrument ID, the update time and the new masked card details. Raw card numbers are never sent: you receive the BIN, last four digits, expiry date and aliases.
{
"specversion": "1.0.2",
"source": "https://www.ppro.com",
"datacontenttype": "application/json",
"id": "XvpFAF6I7ypsaxv0xJ9BW",
"type": "PAYMENT_INSTRUMENT_DETAILS_UPDATED",
"subject": "instr_yGeGPffd4Ch56wZENvDbi",
"time": "2026-10-09T13:05:14.744Z",
"data": {
"type": "PAYMENT_INSTRUMENT_DETAILS_UPDATED",
"paymentInstrumentId": "instr_yGeGPffd4Ch56wZENvDbi",
"merchantId": "merch_example",
"updateTimestamp": "2026-10-09T13:05:14.700Z",
"details": {
"type": "CARD_PPRO_VAULTED",
"details": {
"brand": "VISA",
"bin": "411111",
"last4Digits": "1111",
"expiryMonth": 2,
"expiryYear": 2031,
"holderName": "John Smith",
"panAlias": "alias_dCM4le6uVLMWc44SO-tBa"
}
}
}
}| Field | Description |
|---|---|
id | Unique event ID. Use it to deduplicate deliveries. |
type | Always PAYMENT_INSTRUMENT_DETAILS_UPDATED for this event. |
subject | The instrument the event is about. |
data.paymentInstrumentId | The instrument to update in your records. Same ID as before. |
data.updateTimestamp | When PPRO applied the update. Use it to ignore stale events. |
data.details | The instrument after the update, with masked card data. |
Example payloadThe example above is illustrative. Check the webhook event payloads reference for the authoritative schema.
Handling the event
- Deduplicate on
id, because retries can deliver the same event more than once. - Treat events as possibly out of order. Compare
updateTimestampbefore overwriting your data. - Do not wait for this webhook to continue a payment. The retry and its result are already part of the charge response.
Checking updates without webhooks
- The charge response includes
instrumentUpdated, which tells you whether the instrument was updated during that payment. - Call
GET /v1/payment-instruments/{instrumentId}to retrieve the current details at any time.
Account Updater and Merchant Advice Codes
A 01 ("New account information available") means the issuer has new details for the card. With Account Updater enabled, PPRO handles the refresh and retry for you. Without it, ask the customer for the new details. See Merchant Advice Code.
Updated 9 days ago