Document Verification
Perform a Document Verification Job
Document Verification is exposed as a flow which performs the following high level steps:
Displays instructions to the user
Requests camera permissions (if not already granted)
Performs Document Capture
Performs Selfie Capture
useStrictMode defaults to false and will use Smile Smartselfie™ capture screens for selfie
If useStrictMode is set to true the selfie capture use Enhanced SmartSelfie™ capture
Submits the job to the Smile ID API
Delivers the result back to the caller
import android.util.Log
import androidx.compose.runtime.Composable
import com.smileidentity.SmileID
import com.smileidentity.compose.SmartSelfieRegistration
import com.smileidentity.results.SmartSelfieResult
@Composable
fun DocumentVerificationExample() {
// It will need to be provided as input depending on your use case
SmileID.DocumentVerification(
country = "GH"
useStrictMode = true, // true if you want to capture using enhanced SmartSelfie™ capture
) { result ->
when (result) {
is SmileIDResult.Success -> {
val resultData = result.data
Log.d("DocumentVerification", "Success: $resultData")
// DocumentVerificationResult contains: captured documents, captured selfie,
// and job status response from the API
val (selfieFile, documentFrontFile, documentBackFile, jobStatusResponse) = resultData
}
is SmileIDResult.Error -> {
// There was an error (could be denied camera permissions, network errors, etc)
val throwable = result.throwable
Log.w("DocumentVerification", "Failure: $it", throwable)
}
}
}
}DocumentVerificationFragment documentVerificationFragment = DocumentVerificationFragment
.newInstance("GH");
getSupportFragmentManager().setFragmentResultListener(
DocumentVerificationFragment.KEY_REQUEST,
this,
(requestKey, result) -> {
SmileIDResult<DocumentVerificationResult> documentVerificationResult =
DocumentVerificationFragment.resultFromBundle(result);
Timber.v("DocumentVerification Result: %s", documentVerificationResult);
getSupportFragmentManager()
.beginTransaction()
.remove(documentVerificationFragment)
.commit();
hideProductFragment();
}
);When using the Fragment approach, a convenience resultFromBundle static method is provided to help extract a typed object from the result Bundle.
import SwiftUI
import SmileID
struct HomeView: View, DocumentVerificationResultDelegate {
@State private var presentDocumentVerification = false
var body: some View {
HStack(spacing: 15) {
Button(action: {
self.presentDocumentVerification.toggle()
}) {
Text("Document Verification")
}
.sheet(isPresented: $presentDocumentVerification, content: {
SmileID.documentVerificationScreen(
countryCode: "GH",
useStrictMode: true, // true if you want to capture using enhanced SmartSelfie™ capture
delegate: self
)
})
}
}
func didSucceed(selfie: URL, documentFrontImage: URL, documentBackImage: URL?, didSubmitDocumentVerificationJob: Bool) {
print("Successfully submitted Document Verification job")
}
func didError(error: Error) {
print("An error occurred - \(error.localizedDescription)")
}
}let documentVerificationScreen = SmileID.documentVerificationScreen(...)
let controller = UIHostingController(rootView: documentVerificationScreen)
controller.modalPresentationStyle = .fullScreen
navigationController?.present(controller, animated: true)Navigator.of(context).push( //Requires Navigator.of(context).push in order to load
MaterialPageRoute<void>(
builder: (BuildContext context) => Scaffold(
appBar: AppBar(title: const Text("SmileID Document Verification")),
body: SmileIDDocumentVerification(
countryCode: "GH",
useStrictMode: true, // true if you want to capture using enhanced SmartSelfie™ capture
// There are more parameters -- they correspond 1:1 with the native SDK parameters
onSuccess: (String? result) {
// Your success handling logic
final snackBar = SnackBar(content: Text("Success: $result"));
ScaffoldMessenger.of(context).showSnackBar(snackBar);
Navigator.of(context).pop(); //Return flow to your app
},
onError: (String errorMessage) {
// Your error handling logic
final snackBar = SnackBar(content: Text("Error: $errorMessage"));
ScaffoldMessenger.of(context).showSnackBar(snackBar);
Navigator.of(context).pop(); //Return flow to your app
}
),
),
),
);On success, you will receive a JSON string following the structure:
{
"selfieFile": "<path to selfie file>",
"livenessFiles": "<path to liveness file>",
"documentFrontFile": "<path to document front file>",
"documentBackFile": null
|
"<path to document back file>",
"didSubmitDocumentVerificationJob": true
|
false
} <SmileIDDocumentVerificationView
allowAgentMode:false, // true if you need to use the secondary camera
showInstructions:true, // show instructions before capture
countryCode:'NG',
documentType:'PASSPORT',
captureBothSides:true, // true if capturing back and front of document
allowGalleryUpload:false, //true if document can be uploaded from gallery
style = {{ width: '100%', height: '100%' }} //fill the entire view
onResult = {
(event) => {
setResult(event.nativeEvent.result);
}
}
/>On onResult, you will receive a JSON string following the structure:
{
"selfieFile": "<path to selfie file>",
"livenessFiles": "<path to liveness file>",
"documentFrontFile": "<path to document front file>",
"documentBackFile": null
|
"<path to document back file>",
"didSubmitDocumentVerificationJob": true
|
false
}Begin by defining a document verification parameters object:
import { DocumentVerificationParams } from 'react-native-expo';
const documentVerificationParams: DocumentVerificationParams = {
// userId: 'user123', // Optional user ID
// jobId: 'job456', // Optional job ID
countryCode: 'NG',
allowNewEnroll: false,
documentType: 'PASSPORT',
// idAspectRatio: 1.0, // Optional aspect ratio for document capture
// bypassSelfieCaptureWithFile: '', // Optional file path to bypass selfie capture
autoCaptureTimeout: 10, // this is in seconds,
autoCapture: AutoCapture.AutoCapture,
captureBothSides: false,
allowAgentMode: true,
showInstructions: true,
showAttribution: true,
allowGalleryUpload: true,
skipApiSubmission: false,
useStrictMode: false,
extraPartnerParams: {
'custom_param_1': 'value1',
'custom_param_2': 'value2'
}
};Integrate the document verification component into your view by rendering the SmileIDDocumentVerificationView and passing in the configured parameters:
<SmileIDDocumentVerificationView
style={styles.nativeView}
params={documentVerificationParams}
onResult={handleSuccessResult}
onError={handleError}
/>On onResult, you will receive a JSON string following the structure:
{
"selfieFile": "<path to selfie file>",
"documentFrontFile": "<path to document front file>",
"documentBackFile": null | "<path to document back file>",
}Arguments
country
countryA 2-letter country code (ISO 3166-1 alpha-2 compliant)
documentType
documentTypeThe type of document/ID that is to be captured. If omitted, the document type will be automatically determined
captureBothSides
captureBothSidesBoolean indicating whether both sides of the ID card should be captured. When set to true, the user will still be presented with the option to skip capturing the back of the ID card. This value can be fetched by calling SmileID.api.getValidDocuments() and checking the hasBack property of a document
bypassSelfieCaptureWithFile
bypassSelfieCaptureWithFileIf this value is provided, then the user will not be asked to capture a selfie as part of this flow
userId
userIdThe user ID to associate with the job. Most often, this will correspond to a unique User ID within your own system. (If not provided at time of Registration, a random user ID will be generated. This field is required for Authentication)
jobId
jobIdThe job ID to associate with the job. Most often, this will correspond to a unique Job ID within your own system. If not provided, a random job ID will be generated.
idAspectRatio
idAspectRatioThe aspect ratio of the ID to be captured. If not specified, the aspect ratio will attempt to be inferred from the device's camera.
showAttribution
showAttributionWhether to show the Smile ID attribution or not on the Instructions screen
autoCapture
autoCaptureThis is an enum that determines whether how autocapture is used. It takes the values: autoCapture, autoCaptureOnly, manualCaptureOnly. The default is autoCapture
autoCapture
autoCaptureThis is an enum that determines how autocapture is used. It takes the values: autoCapture, autoCaptureOnly, manualCaptureOnly. The default is autoCapture
⚠️ Do not change the default as this might affect your passrates. Learn more on the reason for using this flag here: document autocapture details.
Enum Options
autoCapture(default)
Uses automatic document capture, with a fallback to a manual capture button after 10 seconds if auto-capture is unsuccessful.
Recommended: Best for maintaining high pass rates and optimal user experience.
autoCaptureOnly⚠️
Only automatic document capture is allowed. There is no manual fallback.
Warning: Enabling this may reduce your pass rates if auto-capture fails, since users will not be able to capture documents manually.
manualCaptureOnly⚠️
Only manual capture is permitted. No automatic capture is used.
Warning: Disabling auto-capture may negatively impact your pass rates and user experience, as manual capture relies entirely on user input.
allowGalleryUpload
allowGalleryUploadWhether the user should be allowed to upload their document photos from the Gallery instead of performing a live capture
showInstructions
showInstructionsWhether to deactivate capture screen's instructions
skipApiSubmission
skipApiSubmissionWhether to capture images and not Submit to the SmileID api, this will return file paths which can be retrieved for later use.
extraPartnerParams
extraPartnerParamsCustom values specific to partners passed as an immutable map
colorScheme
colorSchemeSee Theming
typography
typographySee Theming
onResult (Android)
onResult (Android)Callback to be invoked when the job is complete. The result itself is a SmileIDResult which can either be a SmileIDResult.Success or SmileIDResult.Error
delegate (iOS)
delegate (iOS)This is the delegate object that is notified when there is a result from the DocumentVerification flow. This class has to conform to DocumentCaptureResultDelegate and implement the delegate methods
func didSucceed(selfie: URL, documentFrontImage: URL, documentBackImage: URL?, jobStatusResponse: DocumentVerificationJobStatusResponse) and func didError(error: Error).
Last updated
Was this helpful?

