SuperStartup
HomeContact Us
HomeContact Us
    • Introduction
    • SimpliFi Architecture
    • Webhooks
    • Webhook Signature
    • SimpliFi WebSDK Integration Guide
    • SimpliFi KYC SDK Integration Guide
    • Auth
      • Login to generate JWT token
        POST
      • Login to generate SDK Admin JWT token
        POST
    • User
      • List all Users
        GET
      • Create a User
        POST
      • Retrieve a User
        GET
      • Update a User
        PUT
      • Delete a User
        DELETE
      • Add update address of user
        POST
    • Funding Source
      • Raise Funding Document Upload
        POST
      • Raise Funding
        POST
    • Card
      • List all Cards
        GET
      • Create a Card
        POST
      • Get Card Details
        GET
      • Manage Card Status
        POST
      • Load a Card
        POST
      • Unload a Card
        POST
      • Renewal of the Card
        POST
      • Request a Physical Card
        POST
    • Webhook
      • Get all events
        GET
      • Create a webhook
        POST
      • Update a Webhook
        PUT
      • Delete a Webhook
        DELETE
      • Updates the status of Webhook
        PUT
      • Processor Mapping webhook
      • Card Activation webhook
      • Card Issuance webhook
      • Card PIN Setup webhook
      • Card Renewed webhook
      • Card Status Change webhook
      • Card Type Change webhook
      • Card Load webhook
      • Card Unload webhook
      • User create webhook
      • User update webhook
      • User delete webhook
      • Raise funding webhook
      • Transaction webhook
      • Transaction Enrichment webhook
    • Schemas
      • ErrorModel
      • AuthRequestModel
      • SdkAuthRequestModel
      • AuthResponseModel
      • RaiseFundingDocumentModel
      • RaiseFundingRequestModel
      • FileUploadModel
      • RaiseFundingResponseModel
      • UserRequestModel
      • UserDetailModel
      • AddressModel
      • AddressRequestModel
      • ContactModel
      • UserModel
      • CardRequestModel
      • CardResponseModel
      • InstrumentType
      • CardStatusModel
      • CardAmountModel
      • CardRenewalModel
      • WebhookEventType
      • WebhookEventModel
      • WebhookRequestModel
      • WebhookResponseModel
      • Webhook
      • CompanyUuidParameter
      • RequestUuidParameter
      • ProcessorMappingUuidParameter
      • UserUuidParameter
      • CardUuidParameter
      • MaskedPanParameter
      • CardStatusParameter
      • TransactionIdParameter
      • TransactionUuidParameter
      • TransactionTypeParameter
      • ProcessorMappingCreationWebhook
      • CardActivationWebhook
      • CardIssuanceWebhook
      • CardPinSetupWebhook
      • CardRenewedWebhook
      • CardStatusChangeWebhook
      • CardTypeChangeWebhook
      • CardLoadWebhook
      • CardUnloadWebhook
      • UserWebhook
      • CardHolderCreationWebhook
      • CardHolderUpdationWebhook
      • CardHolderDeletionWebhook
      • RaiseFundingWebhook
      • TransactionWebhook
      • TransactionEnrichmentWebhook
      • Error99997
      • Error40089
      • Error40065
      • Error40007
      • Error40056
      • Error15017
      • Error30003
      • Error40081
      • Error30022
      • Error15015
      • Error15016
      • Error30049
      • Error40006
      • Error40010
      • Error40080
      • Error40053
      • Error40113
      • Error40067
      • Error40069
      • Error50010
      • Error50011
      • Error50008
      • Error50004
      • Error10003
      • Error20046
      • Error35004
      • Error35005
      • Error35006
      • Error35007
      • Error35009
      • Error10001
      • Error20133
      • Error20017
      • Error20001
      • Error20005
      • Error20039
      • Error20011
      • Error20038
      • Error20127
      • Error20018
      • Error20002
      • Error20004
      • Error20006
      • Error20032
      • Error30012
      • Error20086
      • Error20019
      • Error20132
      • Error20008
      • Error40054
      • Error20015
      • Error20074
      • Error21090
      • Error20161
      • Error20162
      • Error20089
      • Error20076
      • Error30023
      • Error30013
      • Error20087
      • Error30028
      • Error20070
      • Error20050
      • Error82028
      • Error30004
      • Error30044
      • Error30001
      • Error30006
      • Error30048
      • Error30024
      • Error35043
      • Error30025
      • Error30010
      • Error30047
      • ErrorReason99997
      • Error81040
      • Error40128
      • Error40136
      • Error10035
      • Error35024
      • Error60001
      • Error60002
      • Error60003
      • Error60004
      • Error60005
      • Error60021
      • Error60012
      • Error60009

    SimpliFi KYC SDK Integration Guide

    Overview#

    The SimpliFi KYC SDK lets you launch identity verification (via the Mawarid provider) from inside your app without building any verification UI yourself. The host loads a secure SimpliFi page (iframe/popup on web, WebView on native), sends it a config over 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.
    Base URL: https://{env}-virtualcard.simplifipay.com/simplifi-sdk/

    Parameters through postMessage#

    The SDK accepts credentials via postMessage, delivered after the SDK has fully loaded and signalled readiness — same handshake used by the rest of the Virtual Card SDK.
    The Handshake
    1.
    Host loads the SDK URL in an iframe, popup, or WebView
    2.
    SDK mounts and sends SIMPLIFI_SDK_READY to the host
    3.
    Host receives SIMPLIFI_SDK_READY and sends SIMPLIFI_SDK_CONFIG with credentials
    4.
    SDK validates the config and sends SIMPLIFI_SDK_CONFIG_ACK (accepted) or SIMPLIFI_SDK_CONFIG_ERROR (rejected)
    5.
    On flow completion, SDK sends SDK_FLOW_RESULT
    Important: 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.
    Config Payload
    Sent to the SDK after it signals readiness via SIMPLIFI_SDK_READY.
    FieldTypeRequiredDescription
    tokenStringYesAdmin-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.
    userIDStringYesThe unique 36-character ID of the user to verify.
    actionStringYesMust be initiate_kyc.
    Available Actions
    ActionDescription
    initiate_kycLaunch identity verification

    Message Protocol#

    The SDK and host communicate via postMessage. All messages are JSON objects.

    SDK → Host#

    eventNamesourceDescription
    SIMPLIFI_SDK_READYsimplifi-sdkSDK loaded and waiting for config
    SIMPLIFI_SDK_CONFIG_ACKsimplifi-sdkConfig accepted, SDK initialising
    SIMPLIFI_SDK_CONFIG_ERRORsimplifi-sdkConfig rejected — check errorCode and message
    SDK_FLOW_RESULTsimplifi-sdkFlow completed — check status (SUCCESS/FAILURE) and flow

    Host → SDK#

    eventNamesourceDescription
    SIMPLIFI_SDK_CONFIGsimplifi-parentSend config payload to SDK
    Config message
    {
      "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"
    }
    On failure, status is "FAILURE" and errorCode/httpStatus may be present alongside message.
    Keep the SDK's iframe/WebView mounted and listening for messages until SDK_FLOW_RESULT arrives.

    Flutter Integration#

    Dependency#

    Step 1 — Define SDK URL and origin#

    sdkOrigin scopes all postMessage communication to the SDK domain only. Derive it from sdkUrl — never hardcode it separately.

    Step 2 — Set up WebViewController#

    All parts below are required. Missing any one will break the integration.
    Note: Don't clear cookies, sessionStorage, or local storage for this WebView between navigations — doing so mid-flow will strand the user.

    Step 3 — Load the SDK#

    Always append ?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.
    Call this after the controller is fully configured in Step 2.

    Step 4 — Handle incoming SDK messages#

    Step 5 — Send config to the SDK#

    Only called from inside the SIMPLIFI_SDK_READY handler. Never send config before the SDK signals ready — the message will be lost.

    Step 6 — Timeout handling (Optional)#

    The SDK should signal 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.

    Web Integration#

    To integrate this into a website (React, Vue, or plain HTML), use a standard HTML iframe.
    1.
    Create Element: Add an <iframe> tag to your page structure.
    2.
    Styling: Ensure the iframe has sufficient height (approx. 600px) and width (100%).
    3.
    Popups: The KYC flow opens the provider in a popup window. Make sure your page doesn't block popups triggered by a user gesture inside the iframe (most browsers allow this by default since it follows a click on "Get started" inside the SDK).
    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.

    Security Notes#

    Always set targetOrigin to the SDK origin when calling postMessage — never "*".
    Always validate 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.
    Never log the token field from the config payload.
    Modified at 2026-09-17 08:53:50
    Previous
    SimpliFi WebSDK Integration Guide
    Next
    Login to generate JWT token
    Built with