Face Match
Documents & BiometricsCompare a selfie to the photo on an ID document or KYC record.
Confirm the person presenting an ID is the person on it. Send a selfie and a reference photo, from an ID document, Aadhaar eKYC or DigiLocker, and receive a match score with a clear pass or fail against your threshold.
Endpoint
Request parameters
| Field | Type | Description |
|---|---|---|
selfie_image
required
|
string | Selfie image |
reference_photo_i_d_document_or_k_y_c_record
required
|
string | Reference photo (ID document or KYC record) |
Example request
curl -X POST https://app.emver.io/api/sandbox/v1/face-match \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"selfie_image": "string",
"reference_photo_i_d_document_or_k_y_c_record": "string"
}'
import requests
response = requests.post(
"https://app.emver.io/api/sandbox/v1/face-match",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Accept": "application/json",
},
json={
"selfie_image": "string",
"reference_photo_i_d_document_or_k_y_c_record": "string"
},
timeout=60,
)
response.raise_for_status()
data = response.json()
const response = await fetch("https://app.emver.io/api/sandbox/v1/face-match", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
"Accept": "application/json",
},
body: JSON.stringify({
"selfie_image": "string",
"reference_photo_i_d_document_or_k_y_c_record": "string"
}),
});
const data = await response.json();
$response = Http::withToken('YOUR_API_KEY')
->acceptJson()
->post('https://app.emver.io/api/sandbox/v1/face-match', {
"selfie_image": "string",
"reference_photo_i_d_document_or_k_y_c_record": "string"
});
$data = $response->json();
Replace YOUR_API_KEY and the placeholder values. Use the switch above to see production URLs.
Response
Structure · 200
{
"status": INTEGER,
"message": STRING,
"data": {
"match_score": STRING,
"match_decision_against_threshold": STRING,
"face_detected_in_each_image": STRING
}
}
Example · 200
{
"status": 200,
"message": "string",
"data": {
"match_score": "string",
"match_decision_against_threshold": "string",
"face_detected_in_each_image": "string"
}
}
Error · 4xx / 5xx
{
"status": INTEGER,
"message": STRING
}
See Errors & status codes for what each status means and which calls are billed.
About this API
Document checks prove a document is real. Face Match proves the right person is holding it. The API compares two facial images and returns a similarity score, with a decision against the threshold you configure, so onboarding can stop impersonation without a human reviewer.
Pair it with Liveness Detection to be sure the selfie is a live capture and not a photo of a photo.
Typical uses
- Digital account opening. Match the selfie to the eKYC photo.
- Gig partner activation. Confirm the rider matches the licence photo.
- Remote exams and assessments. Verify the candidate at the start of a session.
- High-value transactions. Step-up authentication using a stored reference.
Questions
- What threshold should I use?
- emver provides recommended thresholds per use case. Higher thresholds reduce false accepts at the cost of more manual reviews.
- Can it use the photo from Aadhaar eKYC or DigiLocker?
- Yes. The photograph returned by those flows is a strong reference image.