Skip to main content

Silent Verification

Silent Verification lets a returning, previously validated identity complete a Card Not Present Verification transaction without a visible capture screen. Instead of asking the user for a new selfie, Unico's technology evaluates signals and recurrence in the background to decide whether the transaction can be silently approved.

Silent Verification is not a separate product — it's an extra step on top of the same transaction creation flow described in Payment transactions and Credit card Onboarding. Collecting context signals with the SDK and sending that same external key when creating the transaction is what enables the possibility of a silent approval.

When it applies
  • Silent Verification applies when there's enough history for Unico's technology to evaluate the identity through signals.
  • When that evaluation isn't possible — due to a lack of history or for other reasons — the transaction falls back to the standard visual flow instead. This can happen, for example, the first time a given identity is seen on the network.
1. Collect device metadata with the SDK

Install and initialize the Capture SDK for your platform as usual — Silent Verification does not change that setup. Follow the platform's Monitoring Data Collection guide to send externalUserId:

info

Flutter is not supported for Silent Verification yet.

This is not just observability metadata here

The Monitoring Data Collection guides describe externalUserId as optional telemetry that "does not change the SDK's capture behavior or the API response." That's true for the SDK on its own. In Card Not Present Verification, this same field is what the backend uses to decide whether the transaction can be silently approved. Sending it is what enables Silent Verification for that transaction — it is not inert here.

Two adjustments to the standard capture setup are required to keep the flow silent:

  • Mobile (Android / iOS): use the prepareCamera / prepareSelfieCamera overload that receives a PrepareInfo object with externalUserId, and do not call the camera-open method inside the success callback — unless you actually want the full visual flow for that session.
unicoCheckCamera.prepareCamera(unicoConfig, object : CameraListener {
override fun onCameraReady(cameraOpener: UnicoCheckCameraOpener.Camera?) {
// No need to call cameraOpener?.open() here — the background collection already started.
}
override fun onCameraFailed(message: String?) { /* handle error */ }
}, PrepareInfo("YOUR_EXTERNAL_USER_ID"))
  • Web: call setSilentInfo(externalUserId, useCase) on the UnicoCheckBuilder instance before calling prepareCamera / prepareSelfieCamera, and likewise skip opening the camera in the success callback.
unicoCamera.setSilentInfo("YOUR_EXTERNAL_USER_ID");
await unicoCamera.prepareSelfieCamera(config, SelfieCameraTypes.SMART);
// No need to open the camera here — the background collection already started.
Timing window

The SDK collects data in the background, so there must be a minimum gap before you create the transaction:

  • Start the SDK preparation at least 4 seconds before calling the transaction API — too soon, and the collection may not have finished.
  • The collected data is valid for up to 5 minutes — too late, and it will have expired by the time the transaction is created.
2. Create the transaction with the same externalUserID

externalUserID is optional — but without it, Silent Verification cannot happen for that transaction. When creating the transaction — via Payment transactions or Credit card Onboarding — send the exact same externalUserID used in the SDK, inside additionalInfo:

{
"additionalInfo": {
"externalUserID": "YOUR_EXTERNAL_USER_ID"
}
}

Omitting it doesn't cause any error — the transaction is still created normally, it just always follows the standard flow with visual friction.

3. Handle the response

If the transaction qualifies and is silently approved, no further action is needed:

{
"id": "6ab1771e-dfab-4e47-8316-2452268e5481",
"status": "approved"
}

Otherwise, the response includes a link to complete the standard visual flow, exactly like a transaction created without Silent Verification:

{
"id": "6ab1771e-dfab-4e47-8316-2452268e5481",
"status": "waiting",
"link": "https://aces.so/example",
"token": "eyJhbGciOiJIUzI1NiIsInR5cC[...]Ok6yJV_adQssw5c"
}

For any other status, follow the standard flow using the returned link — see Controlling the experience and Enumerated for the full list of statuses.