Face Match

2 endpoints · Core API

This API is designed to compare faces captured in various KYC documents or photographs, enabling organizations to conduct thorough identity verification processes. By leveraging advanced facial recognition technology, it performs precise comparisons across different sources, ensuring accurate matching of individuals' identities. This capability is particularly valuable in scenarios where multiple documents or photographs need to be cross-referenced to confirm an individual's identity with a high degree of reliability. By facilitating seamless integration into existing systems, this API streamlines identity verification workflows, enhances security measures, and reduces the risk of fraudulent activities. Ultimately, it empowers organizations to maintain robust KYC processes, comply with regulatory requirements, and safeguard against identity theft and unauthorized access.

What you can do

This API compares faces across multiple KYC documents or photographs, facilitating accurate identity verification and ensuring reliable matching of individuals across different sources.

POST

/api/v1/FaceMatch

#

Get Face Match details

docs.signcare.io/core/api/biometric/face-match/#post-api-v1-facematch

Compares the face in image1B64 with the face in image2B64. The match threshold is fixed and cannot be set in this request; use the verify endpoint if you need to set a similarity threshold.

Headers

  • X-API-KEY
    stringrequired
    Your secret API key for the environment you are calling (Stage and Live use different keys).
  • X-API-APP-ID
    stringrequired
    The App ID issued together with the key.
  • Content-Type
    stringrequired
    application/json

Body parameters

application/json
  • image1B64
    stringrequired
    Required. Base64-encoded first image (a JPEG or PNG photo with a clearly visible face). Send the raw Base64 string without a data: prefix.
    minLength 1pattern ^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2…default SGVsbG8gV29ybGQ=
  • image2B64
    stringrequired
    Required. Base64-encoded second image to compare with the first (a JPEG or PNG photo with a clearly visible face). Send the raw Base64 string without a data: prefix.
    minLength 1pattern ^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2…default SGVsbG8gV29ybGQ=
  • getNumberOfFaces
    booleanoptional
    Optional. Boolean, default false. Set to true to also receive the number of faces found in each image in faceProperties.
    default false
  • requestId
    stringoptional
    Optional. Your own reference for the request. Note the camelCase name (requestId), unlike the request_id used by most other APIs. A new one is generated when omitted.
    nullable
Sample request body
{ "image1B64": "SGVsbG8gV29ybGQ=", "image2B64": "SGVsbG8gV29ybGQ=", "getNumberOfFaces": false }

Responses

200OK
  • success
    booleanoptional
    No description.
  • statusCode
    integer (int32)optional
    No description.
    default 200
  • message
    stringoptional
    No description.
    nullabledefault XXXXX
  • data
    objectoptional
    Response model containing face match comparison results.
    5 fields
    • match
      stringoptional
      Indicates whether the faces in the two images match.
      nullable
    • matchScore
      number (double)optional
      Numeric score indicating the degree of similarity between the two faces.
    • reviewNeeded
      stringoptional
      Indicates whether manual review is recommended for the match result.
      nullable
    • confidence
      number (double)optional
      Confidence level of the face match determination.
    • faceProperties
      objectoptional
      No description.
      2 fields
      • image1
        objectoptional
        No description.
        1 field
        • numberOfFaces
          integer (int32)optional
          No description.
      • image2
        objectoptional
        No description.
        1 field
        • numberOfFaces
          integer (int32)optional
          No description.
  • messages
    array<string>optional
    No description.
    nullable
  • request_id
    stringoptional
    No description.
    nullable
  • isBillable
    booleanoptional
    Whether this request was charged: true if it was, false if not. Errors always show false. Flows that finish later (ITR Fetch, SHCIL eStamp, DigiLocker, eSign) show false here, because the charge is made when the result is ready. eSign charges each signer when they complete signing. DigiLocker deducts the credit when the link is created and refunds it automatically if the link expires before the user completes it.
Example
{ "success": false, "statusCode": 200, "message": "XXXXX", "data": { "match": "string", "matchScore": 0, "reviewNeeded": "string", "confidence": 0, "faceProperties": { "image1": { "numberOfFaces": 0 }, "image2": { "numberOfFaces": 0 } } }, "messages": [ "string" ], "request_id": "string", "isBillable": false }
400Bad Request
  • data
    objectoptional
    No description.
  • messages
    array<string>optional
    No description.
    nullable
  • request_id
    stringoptional
    No description.
    nullable
  • success
    booleanoptional
    No description.
    default false
  • message
    stringoptional
    No description.
    nullabledefault XXXXX
  • isBillable
    booleanoptional
    No description.
  • statusCode
    integer (int32)optional
    No description.
    default 400
Example
{ "data": {}, "messages": [ "string" ], "request_id": "string", "success": false, "message": "XXXXX", "isBillable": false, "statusCode": 400 }
401Unauthorized
  • data
    objectoptional
    No description.
  • messages
    array<string>optional
    No description.
    nullable
  • request_id
    stringoptional
    No description.
    nullable
  • success
    booleanoptional
    No description.
    default false
  • message
    stringoptional
    No description.
    nullabledefault XXXXX
  • isBillable
    booleanoptional
    No description.
  • statusCode
    integer (int32)optional
    No description.
    default 401
Example
{ "data": {}, "messages": [ "string" ], "request_id": "string", "success": false, "message": "XXXXX", "isBillable": false, "statusCode": 401 }
500Internal Server Error
  • data
    objectoptional
    No description.
  • messages
    array<string>optional
    No description.
    nullable
  • request_id
    stringoptional
    No description.
    nullable
  • success
    booleanoptional
    No description.
    default false
  • message
    stringoptional
    No description.
    nullabledefault XXXXX
  • isBillable
    booleanoptional
    No description.
  • statusCode
    integer (int32)optional
    No description.
    default 500
Example
{ "data": {}, "messages": [ "string" ], "request_id": "string", "success": false, "message": "XXXXX", "isBillable": false, "statusCode": 500 }
Code samplescurl · Node.js · Python
Stage: uat-ext.signcare.io
curl -X POST 'https://uat-ext.signcare.io/api/v1/FaceMatch' \ -H 'X-API-KEY: YOUR_API_KEY' \ -H 'X-API-APP-ID: YOUR_APP_ID' \ -H 'Content-Type: application/json' \ -d '{ "image1B64": "SGVsbG8gV29ybGQ=", "image2B64": "SGVsbG8gV29ybGQ=", "getNumberOfFaces": false }'
POST

/api/v1/FaceMatch/verify

#

Verify a person's identity by comparing an live photo against any documents photo

docs.signcare.io/core/api/biometric/face-match/#post-api-v1-facematch-verify

Compares the face in source_image with the face in target_image. Pass an optional similarity_threshold (0–100) to control match strictness. Defaults to 70 if not provided.

Possible Results (match field):

  • yes: Faces match above the threshold
  • no: Faces do not match
  • error: Image quality issue or no face detected

Error Messages:

  • No Face Detected: No detectable face found in one or both images
  • Low Image Quality: Image format is invalid or image is too large

Headers

  • X-API-KEY
    stringrequired
    Your secret API key for the environment you are calling (Stage and Live use different keys).
  • X-API-APP-ID
    stringrequired
    The App ID issued together with the key.
  • Content-Type
    stringrequired
    application/json

Body parameters

application/json
  • consent
    stringrequired
    Required. The end user's consent to this verification. Send `Y`.
    minLength 1default Y
  • consent_text
    stringrequired
    Required. The consent statement shown to the end user. Send the default text from the sample.
    minLength 1default I hear by declare my consent agreeme…
  • request_id
    stringoptional
    Optional. Your own id to correlate this call in your logs. A unique id is generated if you leave it out.
    nullable
  • source_image
    stringrequired
    Required. Base64-encoded source image, for example the photo from an ID document (JPEG or PNG). Send the raw Base64 string without a data: prefix.
    minLength 1
  • target_image
    stringrequired
    Required. Base64-encoded target image to compare with the source image, for example a live selfie (JPEG or PNG). Send the raw Base64 string without a data: prefix.
    minLength 1
  • similarity_threshold
    number (float)optional
    Optional. Minimum similarity score, from 0 to 100, for the faces to count as a match. Defaults to 70 when omitted.
    nullable
Sample request body
{ "consent": "Y", "consent_text": "I hear by declare my consent agreement for fetching my information via SignCare API", "source_image": "string", "target_image": "string" }

Responses

200OK
  • success
    booleanoptional
    No description.
  • statusCode
    integer (int32)optional
    No description.
    default 200
  • message
    stringoptional
    No description.
    nullabledefault XXXXX
  • data
    objectoptional
    No description.
    7 fields
    • match
      stringoptional
      "yes" if faces match above threshold, "no" otherwise
      nullable
    • matchScore
      number (float)optional
      Similarity score (0-100). Null when faces do not match or on error.
      nullable
    • reviewNeeded
      stringoptional
      "yes" if score is borderline close to threshold and manual review is advised, "no" otherwise
      nullable
    • confidence
      number (float)optional
      Face detection confidence (0-100). Available for both matched and unmatched cases.
      nullable
    • brightness
      number (float)optional
      Image brightness score (0-100). Null on error.
      nullable
    • sharpness
      number (float)optional
      Image sharpness score (0-100). Null on error.
      nullable
    • errorMessage
      stringoptional
      Error code for edge cases: "No Face Detected" | "Low Image Quality"
      nullable
  • messages
    array<string>optional
    No description.
    nullable
  • request_id
    stringoptional
    No description.
    nullable
  • isBillable
    booleanoptional
    Whether this request was charged: true if it was, false if not. Errors always show false. Flows that finish later (ITR Fetch, SHCIL eStamp, DigiLocker, eSign) show false here, because the charge is made when the result is ready. eSign charges each signer when they complete signing. DigiLocker deducts the credit when the link is created and refunds it automatically if the link expires before the user completes it.
Example
{ "success": false, "statusCode": 200, "message": "XXXXX", "data": { "match": "string", "matchScore": 0, "reviewNeeded": "string", "confidence": 0, "brightness": 0, "sharpness": 0, "errorMessage": "string" }, "messages": [ "string" ], "request_id": "string", "isBillable": false }
400Bad Request
  • data
    objectoptional
    No description.
  • messages
    array<string>optional
    No description.
    nullable
  • request_id
    stringoptional
    No description.
    nullable
  • success
    booleanoptional
    No description.
    default false
  • message
    stringoptional
    No description.
    nullabledefault XXXXX
  • isBillable
    booleanoptional
    No description.
  • statusCode
    integer (int32)optional
    No description.
    default 400
Example
{ "data": {}, "messages": [ "string" ], "request_id": "string", "success": false, "message": "XXXXX", "isBillable": false, "statusCode": 400 }
401Unauthorized
  • data
    objectoptional
    No description.
  • messages
    array<string>optional
    No description.
    nullable
  • request_id
    stringoptional
    No description.
    nullable
  • success
    booleanoptional
    No description.
    default false
  • message
    stringoptional
    No description.
    nullabledefault XXXXX
  • isBillable
    booleanoptional
    No description.
  • statusCode
    integer (int32)optional
    No description.
    default 401
Example
{ "data": {}, "messages": [ "string" ], "request_id": "string", "success": false, "message": "XXXXX", "isBillable": false, "statusCode": 401 }
500Internal Server Error
  • data
    objectoptional
    No description.
  • messages
    array<string>optional
    No description.
    nullable
  • request_id
    stringoptional
    No description.
    nullable
  • success
    booleanoptional
    No description.
    default false
  • message
    stringoptional
    No description.
    nullabledefault XXXXX
  • isBillable
    booleanoptional
    No description.
  • statusCode
    integer (int32)optional
    No description.
    default 500
Example
{ "data": {}, "messages": [ "string" ], "request_id": "string", "success": false, "message": "XXXXX", "isBillable": false, "statusCode": 500 }
Code samplescurl · Node.js · Python
Stage: uat-ext.signcare.io
curl -X POST 'https://uat-ext.signcare.io/api/v1/FaceMatch/verify' \ -H 'X-API-KEY: YOUR_API_KEY' \ -H 'X-API-APP-ID: YOUR_APP_ID' \ -H 'Content-Type: application/json' \ -d '{ "consent": "Y", "consent_text": "I hear by declare my consent agreement for fetching my information via SignCare API", "source_image": "string", "target_image": "string" }'