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.
- 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.
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:
Flutter is not supported for Silent Verification yet.
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/prepareSelfieCameraoverload that receives aPrepareInfoobject withexternalUserId, 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 theUnicoCheckBuilderinstance before callingprepareCamera/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.
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.
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.
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.