The flow
1
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.2
Acknowledge delivery
Send an ack over the WebSocket so the challenge isn’t re-delivered on reconnect:
3
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.
4
Get the result
A
3DS_CHALLENGE_RESULT event confirms the outcome and the transaction status
updates.3DS_CHALLENGE_INITIATED
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.