The flow
Receive the challenge
A
3DS_CHALLENGE_INITIATED event arrives. Show the merchant name, amount, and
currency in a blocking prompt (modal or bottom sheet) with Approve / Reject.Acknowledge delivery
Send an ack over the WebSocket so the challenge isn’t re-delivered on reconnect:
Send the decision over REST
The decision is a state-changing action, so it goes through
Confirm a 3DS challenge — a REST call with a confirmed HTTP
response, not a fire-and-forget WebSocket message.
3DS_CHALLENGE_INITIATED
| Field | Meaning |
|---|---|
data.id | The challenge ID — pass it to the ack and the REST confirm. |
data.amount | Minor units (15000 = 150.00). |
data.expiresAt | Epoch ms — hide the prompt and treat as declined once passed. |
3DS_CHALLENGE_RESULT
Pushed when the challenge reaches a final state (approved, rejected, or expired), with the
same data.id. Use it to dismiss the prompt and refresh the transaction view.