Wallet Provisioning OTP
Where This Fits
When a cardholder adds a SetldPay card to Apple Pay or Google Pay, the card scheme may require a one-time step-up to confirm the real cardholder is behind the request — the identity & verification (
It is a side-branch off normal
ID&V?
The OTP Flow — End to End
The code originates at Tribe and travels outward to the cardholder, who enters it to finish verification. Read the lanes left to right and time top to bottom — SetldPay's lane only ever receives the request and sends the OTP; it is never on the validation path.
Step by step
- 1Cardholderadd card to wallet
Taps Add in Apple or Google Pay.
- 2Wallettokenize
Asks the scheme to create a device token for the card.
- 3Scheme TSPstep-up ID&V requiredyellow path
Needs holder verification and asks Tribe.
- 4TribeholderAuthentication
Generates the OTP and sends it to SetldPay in the notification.
- 5SetldPaygetHolder · render copy
Looks up the cardholder contact (getHolder) and renders the message.
- 6SetldPaydeliver OTP
Sends the code by SMS or email.
- 7Cardholderenter code
Types the code into the wallet.
- 8Walletrelay via scheme
Relays the code back through the scheme to Tribe.
- 9Tribevalidate · activate token
Validates the code and activates the device token.
- 10TribeholderAuthenticationNotification
Reports the outcome (Y/N/E/L/C) to SetldPay for logging.
The Trigger — holderAuthentication
Tribe delivers the trigger as a holderAuthentication TAI notification on the encrypted notify endpoint. The code is already in the payload — validationValue — and a single field, authenticationMethod, says which channel to use.
Message essentials
| Field | What it carries |
|---|---|
| validationValue | The OTP itself — generated by Tribe (1–8 chars) |
| authenticationMethod | Channel: 3 = SMS, 4 = email (1 / 2 out of scope) |
| requestor | 2 = tokenization (wallet provisioning); 1 = 3DS |
| walletProviderId | 3 = Apple Pay, 1 = Google Pay, 2 = Samsung |
| requestExpiresAt | Unix expiry — the real OTP validity window |
| holderId, cardId | Keys for the Tribe getHolder contact lookup |
| additionalData.maskedPan / maskedPhone | Display only — not a delivery target |
What we act on
| ID | authenticationMethod | Handling |
|---|---|---|
| 1 | OTP (generic) | Ignored — out of scope |
| 2 | Background authentication | Ignored — not a delivery case |
| 3 | OTP via SMS | Deliver by SMS |
| 4 | OTP via email | Deliver by email |
Example payload
{
"requestType": ["holderAuthentication"],
"holderAuthentication": {
"authRequestId": 16147738970184,
"holderId": 3731163,
"authenticationMethod": 4,
"requestor": 2,
"validationValue": "718294",
"requestExpiresAt": 1612789119,
"cardId": 1354301,
"cardProgramId": 44,
"walletProviderId": 3,
"additionalData": {
"maskedPan": "XXXXXXXXXXXX0013",
"maskedPhone": "XXXXXXX22"
}
}
} Method 4 (email) for an Apple Pay tokenization (requestor 2, walletProviderId 3). maskedPan / maskedPhone are display-only — the real contact comes from Tribe's getHolder.
The SetldPay Step — Receive, Resolve, Deliver
Inside SetldPay the work splits in two: ingest acknowledges Tribe in milliseconds, then a background worker does the slower delivery — so a slow SMS or email provider can never threaten the webhook response.
events-ingest Receive & verify
Decrypt the payload (AES‑256 + RSA x-sign) and check integrity (x-hook-signature). Persist the notification, then acknowledge Tribe — no provider call on this path.
queue Enqueue
Hand the job to the queue. The ack is already returned, so external-provider latency is fully decoupled from Tribe's request.
worker · getHolder Resolve contact
Call Tribe getHolder(holderId, cardId) for the real phone and email; backfill language from the program default.
worker Select channel
authenticationMethod 3 → SMS, 4 → email. The wallet name (Apple / Google) comes from walletProviderId.
worker Render copy
Apply the Apple Pay Issuer Functional Requirements: the OTP is the first number in the SMS; emails carry the Wallet / Apple Pay imagery and an issuer "from" address. Expiry is computed from requestExpiresAt.
send Deliver
Send via the SMS provider or email, and record the delivery attempt. The cardholder receives the code.
Completing Verification
Delivery is the end of SetldPay's request leg. As the lower half of the sequence above shows, the cardholder enters the code in the wallet; it relays back through the
Tribe reports the outcome to us with a separate holderAuthenticationNotification. We log it for observability (correlating a delivery to its result) but take no action on it.
| Status | Meaning |
|---|---|
| Y | Verified |
| N | Not verified |
| E | Expired |
| L | Limit reached |
| C | Cancelled |
Who Owns What
The OTP lifecycle is split deliberately. Reading the boundary as "SetldPay delivers, Tribe owns the code" keeps the design honest — it is why there is no OTP store, validation endpoint, or callback on our side.
| Party | Responsibility |
|---|---|
| Apple / Google Pay | Wallet UX, the ID&V step-up prompt, and code entry |
| Scheme TSP (MDES / VTS) | Tokenization and routing between the wallet and Tribe |
| Tribe | Generates the OTP, validates it on entry, sends holderAuthentication |
| SetldPay | Delivers the OTP by SMS or email — and nothing else |
| Cardholder | Receives the code and enters it in the wallet |