This page assumes you’ve read Secure Elements
Overview — it covers minting a
client token, loading the SDK, and styling fields, all of which apply here.
Mint a reveal token
CallPOST /v1/client-token with "purpose": "van-reveal" and the virtualAccountNumberId you want to show:
clientToken and loadToken it returns straight into createAccountViewer below.
Minting this token requires the LIST_PAYMENT OAuth scope — the same scope getSpendAccountVirtualAccountNumbers requires, so an integration already listing VANs needs no new provisioning to reveal one. This is distinct from Card Reveal’s CREATE_VIRTUALCARD and Secure Card Input’s MANAGE_PAYMENT.
Create the viewer
fields controls which pieces of the VAN render, in order — omit it and you get ["accountNumber", "routingNumber"]. Each entry is either a bare field name or a { field, individualReveal } object, the same shape as createCardViewer’s fields. accountNumber and routingNumber are the only valid field names — anything else throws a FluzElementsError (error.code === "INVALID_FIELD") synchronously, from createAccountViewer itself, before you ever call mount().
Only
accountNumber is vault data. routingNumber is cleartext metadata
Fluz already has at grant-mint time, so it renders immediately and
reveal()/reveal("routingNumber") has no effect on it — there’s nothing
to fetch. individualReveal on accountNumber behaves exactly like it does
on Card Reveal’s fields:
it defaults to true, and setting it to false prevents that field from
being revealed on its own via reveal("accountNumber") — see Reveal a
single field for the
same pattern applied to a card field.Mount it
mount() appends one sandboxed iframe per configured field into the container element you pass it, and returns a promise that resolves once every frame has completed its handshake. It rejects with a FluzElementsError the same way createCardViewer’s viewer does — see Card Reveal’s Mount it for the full list of INVALID_STYLE / MOUNT_TIMEOUT / MOUNT_FAILED cases.
Reveal and mask fields
reveal(), reveal(field), and setMask() behave exactly as they do on Card Reveal — the same async/sync split, the same { hidden: true } option to blank a field completely instead of showing its masked placeholder, and the same destroy() to tear down every frame. Calling either against routingNumber is a no-op beyond toggling its own masked/unmasked display state, since that field is never fetched from the reveal endpoint.
Handle events
INVALID_FIELD, INVALID_FRAME_HOST_ORIGIN, INVALID_STYLE, MOUNT_TIMEOUT, MOUNT_FAILED, INDIVIDUAL_REVEAL_DISABLED, FIELD_ERROR, and RATE_LIMITED.
Full example
/mint-van-reveal-token is your own backend route — the one that calls POST /v1/client-token with "purpose": "van-reveal" and your Fluz OAuth access token, as described in Mint a client token.
Next steps
Secure Elements Overview
Token minting, SDK loading, styling, and CSP.
Card Reveal
The same capability, applied to a virtual card’s PAN, expiry, and CVV.
Virtual Account Numbers
How a VAN is provisioned, and how to list the ones on a spend account.
Secure Card Input
Collect a physical card and add it as a payment method.