Register your web origins
The embed only opens on origins you’ve registered. Register them once from your server:PUT replaces the whole list and GET reads it back. Up to 10 origins, https only, except that http is allowed for localhost, 127.0.0.1, and [::1] while you develop. Values are normalized to their origin (scheme, host, port), and changes take effect within about five minutes. On an unregistered origin the wallet doesn’t open at all, so this is the first thing to check if you see a blank frame.
Create a wallet link (server side)
The wallet needs a link for the user who is opening it. Create one from your server:url. Hand that to your frontend. Links expire after 15 minutes by default, and you can pass expires_in (60 to 86400 seconds) to change that.
Open the wallet
Your backend creates the wallet link; your page fetches it from you and hands it to the wallet:pay:
update(next) swaps the token or pay intent in place, exit() closes the sheet, and destroy() removes everything. Every bridge event also reaches onEvent(name, data) if you want analytics.
Webhooks you will receive
The SDK events are UI signals. Your server should trust webhooks instead:connected_card.updatedwhen the user adds a cardtransaction.authorizedand the othertransaction.*events when payments happen
When it fails
If the wallet link expired, the sheet says so andonTokenExpired fires. Create a fresh link and call wallet.update({ token }).
Bank approvals sometimes need a popup. If the browser blocks it, the SDK shows an approval bar inside the sheet that the user can tap instead. You can take over that behavior with onOpenUrl(url).
Sandbox behavior
With sandbox credentials, the connect code is always111111 and the test card is 4242 4242 4242 4242 with any future expiry and any CVC. No real money moves.
Next: Connect users