Documentation Index
Fetch the complete documentation index at: https://docs.seismic-cards.systems/llms.txt
Use this file to discover all available pages before exploring further.
Seismic Widget.js renders a user’s full card number, expiry date, and CVV inside iframes hosted on Seismic’s PCI-certified domain. Your servers and your front-end code never touch raw card data, which keeps your application out of PCI scope. You mint a short-lived token on your server, pass it to the widget on the client, and Seismic handles everything else.
How it works
Three things happen in three places:- Your server mints a 5-minute access token by calling
GET /v1/cards/{cardId}/private-info/access-tokenand sends it to your client. - Your client loads
Seismic Widget.jsand callswidget.bootstrap()with the token and three<div>IDs. - Your dashboard allowlists every hostname that will load the widget — iframes silently stay blank otherwise.
Mint a client access token
Call this endpoint from your server — never from the browser — every time a user opens the “Show card details” view.Path parametersQuery parametersResponse (200)
UUID of the card whose details you want to display.
UUID of the sub-account that owns the card.
A JWT scoped to one card and one user, valid for approximately 5 minutes. Send it to your client immediately and discard it — do not store or cache it.
Load the widget in your client
Add three empty
<div> elements as targets, load Seismic Widget.js, then call widget.bootstrap() with the token you received from your server.- Web
- iOS (Swift)
- Android (Kotlin)
Server-rendered widget page
For mobile WebViews, the recommended approach is to have your server compose the widget HTML — embedding the access token at render time — and serve the whole page. The client just loads the URL.Customizing the look
The widget exposes a single CSS selector per field —span — that you can theme through the styles config object. Fonts, colors, letter spacing, and weight all work.
<div>. Give the <div> elements a non-zero width and height before calling bootstrap() — the widget refuses to render into a 0×0 element. A min-height: 44px on each pane is sufficient for all browsers.
Troubleshooting
Iframes load but stay blank
Iframes load but stay blank
The host loading the widget is not on the allowlist. Go to Dashboard → Widget → Allowed Domains and add the exact hostname — no scheme, no path. For example,
app.your-company.com, not https://app.your-company.com/cards.widget.bootstrap is not a function
widget.bootstrap is not a function
The
Seismic Widget.js script has not finished loading, or the URL is incorrect. Open the network tab in browser DevTools and confirm the request to https://widget.seismic.systems/index.min.js returns a 200. Also make sure your Content-Security-Policy allows script-src widget.seismic.systems.onFailure fires with 'token expired'
onFailure fires with 'token expired'
The access token you minted is older than approximately 5 minutes. Do not cache it. Mint a fresh token from your server every time the user opens the card-details view.
Iframes are 0px tall on iOS or in a WebView
Iframes are 0px tall on iOS or in a WebView
The parent
<div> was measured at 0×0 when bootstrap() was called — typically because the layout had not yet settled. Fix options: set an explicit min-height on the <div> before bootstrapping, or delay the call using two requestAnimationFrame callbacks to ensure the layout has painted.Widget renders, then flashes blank when a card flips
Widget renders, then flashes blank when a card flips
bootstrap() was called again during a flip or transition animation. Call widget.destroy() first, wait for the animation to finish, then call widget.bootstrap() once the panes have stable dimensions.widget is undefined
widget is undefined
The script URL is blocked by a Content Security Policy on your page. Allow
widget.seismic.systems in both script-src and frame-src directives of your Content-Security-Policy header.PCI scope
Because all card data lives inside iframes served fromwidget.seismic.systems, your application:
- Qualifies for PCI DSS SAQ A — the lightest assessment tier, approximately 22 controls versus 200+ for full scope.
- Never logs, stores, transmits, or processes raw PAN, CVV, or track data.
- Does not need a tokenization vault — Seismic is the vault.