postMessage, and receives a single SDK_FLOW_RESULT once verification succeeds or fails. The intro, document review, provider handoff, and polling screens are all handled by the SDK.https://{env}-virtualcard.simplifipay.com/simplifi-sdk/postMessage, delivered after the SDK has fully loaded and signalled readiness — same handshake used by the rest of the Virtual Card SDK.SIMPLIFI_SDK_READY to the hostSIMPLIFI_SDK_READY and sends SIMPLIFI_SDK_CONFIG with credentialsSIMPLIFI_SDK_CONFIG_ACK (accepted) or SIMPLIFI_SDK_CONFIG_ERROR (rejected)SDK_FLOW_RESULTImportant: Never send credentials before receiving SIMPLIFI_SDK_READY. The SDK may not have mounted yet and the message will be lost.
Important: Send config once, at the very start. Do not resend it later in the flow.
SIMPLIFI_SDK_READY.| Field | Type | Required | Description |
|---|---|---|---|
| token | String | Yes | Admin-scoped JWT for this specific user, minted server-side by your backend via the SimpliFi Auth API. This is not the customer's own session/login token — the customer never generates or sees it directly. |
| userID | String | Yes | The unique 36-character ID of the user to verify. |
| action | String | Yes | Must be initiate_kyc. |
| Action | Description |
|---|---|
| initiate_kyc | Launch identity verification |
postMessage. All messages are JSON objects.| eventName | source | Description |
|---|---|---|
SIMPLIFI_SDK_READY | simplifi-sdk | SDK loaded and waiting for config |
SIMPLIFI_SDK_CONFIG_ACK | simplifi-sdk | Config accepted, SDK initialising |
SIMPLIFI_SDK_CONFIG_ERROR | simplifi-sdk | Config rejected — check errorCode and message |
SDK_FLOW_RESULT | simplifi-sdk | Flow completed — check status (SUCCESS/FAILURE) and flow |
| eventName | source | Description |
|---|---|---|
SIMPLIFI_SDK_CONFIG | simplifi-parent | Send config payload to SDK |
{
"source": "simplifi-parent",
"eventName": "SIMPLIFI_SDK_CONFIG",
"payload": {
"token": "YOUR_TOKEN",
"userId": "YOUR_USER_UUID",
"action": "initiate_kyc"
}
}SDK_FLOW_RESULT for KYC{
"source": "simplifi-sdk",
"eventName": "SDK_FLOW_RESULT",
"flow": "INITIATE_KYC",
"status": "SUCCESS",
"action": "initiate_kyc",
"userID": "YOUR_USER_UUID",
"message": "Your identity verification was submitted successfully.",
"timestamp": "2026-09-17T12:00:00.000Z"
}status is "FAILURE" and errorCode/httpStatus may be present alongside message.SDK_FLOW_RESULT arrives.sdkOrigin scopes all postMessage communication to the SDK domain only. Derive it from sdkUrl — never hardcode it separately.Note: Don't clear cookies, sessionStorage, or local storage for this WebView between navigations — doing so mid-flow will strand the user.
?platform=webview to the URL. This tells the SDK it is running inside a WebView and to use SimplifiSDKChannel instead of window.parent/window.open. Without this param, KYC's provider handoff will not work in a WebView and no events will be sent.SIMPLIFI_SDK_READY handler. Never send config before the SDK signals ready — the message will be lost.SIMPLIFI_SDK_READY within a few seconds of the initial load. Because KYC involves multiple redirects afterward, don't apply this same short timeout to the whole flow — only to the initial readiness handshake.<iframe> tag to your page structure.If the popup is blocked: the flow still completes, but the user ends up on a SimpliFi-hosted success screen ("You can close this window") instead of returning to your site directly.
targetOrigin to the SDK origin when calling postMessage — never "*".e.origin on all incoming messages before processing.?platform=webview is required for Flutter/native — without it the KYC handoff cannot complete in a WebView context.token field from the config payload.