Identity Match
curl --request POST \
--url https://cra.pr.snh-ai.com/complianceEngine/identity-match \
--header 'Content-Type: application/json' \
--data '
{
"candidate_to_verify": {
"first_name": "<string>",
"middle_name": "<string>",
"last_name": "<string>",
"date_of_birth": "<string>",
"ssn": "<string>",
"state": "<string>",
"annual_salary": 123,
"aliases": [
{
"first_name": "<string>",
"middle_name": "<string>",
"last_name": "<string>"
}
],
"addresses": [
{
"street_one": "<string>",
"street_two": "<string>",
"city": "<string>",
"state_or_province": "<string>",
"postal_code": "<string>",
"country": "<string>",
"address_type": "<string>",
"start_date": "<string>",
"end_date": "<string>"
}
]
},
"candidate_in_record": {}
}
'import requests
url = "https://cra.pr.snh-ai.com/complianceEngine/identity-match"
payload = {
"candidate_to_verify": {
"first_name": "<string>",
"middle_name": "<string>",
"last_name": "<string>",
"date_of_birth": "<string>",
"ssn": "<string>",
"state": "<string>",
"annual_salary": 123,
"aliases": [
{
"first_name": "<string>",
"middle_name": "<string>",
"last_name": "<string>"
}
],
"addresses": [
{
"street_one": "<string>",
"street_two": "<string>",
"city": "<string>",
"state_or_province": "<string>",
"postal_code": "<string>",
"country": "<string>",
"address_type": "<string>",
"start_date": "<string>",
"end_date": "<string>"
}
]
},
"candidate_in_record": {}
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
candidate_to_verify: {
first_name: '<string>',
middle_name: '<string>',
last_name: '<string>',
date_of_birth: '<string>',
ssn: '<string>',
state: '<string>',
annual_salary: 123,
aliases: [{first_name: '<string>', middle_name: '<string>', last_name: '<string>'}],
addresses: [
{
street_one: '<string>',
street_two: '<string>',
city: '<string>',
state_or_province: '<string>',
postal_code: '<string>',
country: '<string>',
address_type: '<string>',
start_date: '<string>',
end_date: '<string>'
}
]
},
candidate_in_record: {}
})
};
fetch('https://cra.pr.snh-ai.com/complianceEngine/identity-match', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://cra.pr.snh-ai.com/complianceEngine/identity-match",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'candidate_to_verify' => [
'first_name' => '<string>',
'middle_name' => '<string>',
'last_name' => '<string>',
'date_of_birth' => '<string>',
'ssn' => '<string>',
'state' => '<string>',
'annual_salary' => 123,
'aliases' => [
[
'first_name' => '<string>',
'middle_name' => '<string>',
'last_name' => '<string>'
]
],
'addresses' => [
[
'street_one' => '<string>',
'street_two' => '<string>',
'city' => '<string>',
'state_or_province' => '<string>',
'postal_code' => '<string>',
'country' => '<string>',
'address_type' => '<string>',
'start_date' => '<string>',
'end_date' => '<string>'
]
]
],
'candidate_in_record' => [
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://cra.pr.snh-ai.com/complianceEngine/identity-match"
payload := strings.NewReader("{\n \"candidate_to_verify\": {\n \"first_name\": \"<string>\",\n \"middle_name\": \"<string>\",\n \"last_name\": \"<string>\",\n \"date_of_birth\": \"<string>\",\n \"ssn\": \"<string>\",\n \"state\": \"<string>\",\n \"annual_salary\": 123,\n \"aliases\": [\n {\n \"first_name\": \"<string>\",\n \"middle_name\": \"<string>\",\n \"last_name\": \"<string>\"\n }\n ],\n \"addresses\": [\n {\n \"street_one\": \"<string>\",\n \"street_two\": \"<string>\",\n \"city\": \"<string>\",\n \"state_or_province\": \"<string>\",\n \"postal_code\": \"<string>\",\n \"country\": \"<string>\",\n \"address_type\": \"<string>\",\n \"start_date\": \"<string>\",\n \"end_date\": \"<string>\"\n }\n ]\n },\n \"candidate_in_record\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://cra.pr.snh-ai.com/complianceEngine/identity-match")
.header("Content-Type", "application/json")
.body("{\n \"candidate_to_verify\": {\n \"first_name\": \"<string>\",\n \"middle_name\": \"<string>\",\n \"last_name\": \"<string>\",\n \"date_of_birth\": \"<string>\",\n \"ssn\": \"<string>\",\n \"state\": \"<string>\",\n \"annual_salary\": 123,\n \"aliases\": [\n {\n \"first_name\": \"<string>\",\n \"middle_name\": \"<string>\",\n \"last_name\": \"<string>\"\n }\n ],\n \"addresses\": [\n {\n \"street_one\": \"<string>\",\n \"street_two\": \"<string>\",\n \"city\": \"<string>\",\n \"state_or_province\": \"<string>\",\n \"postal_code\": \"<string>\",\n \"country\": \"<string>\",\n \"address_type\": \"<string>\",\n \"start_date\": \"<string>\",\n \"end_date\": \"<string>\"\n }\n ]\n },\n \"candidate_in_record\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://cra.pr.snh-ai.com/complianceEngine/identity-match")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"candidate_to_verify\": {\n \"first_name\": \"<string>\",\n \"middle_name\": \"<string>\",\n \"last_name\": \"<string>\",\n \"date_of_birth\": \"<string>\",\n \"ssn\": \"<string>\",\n \"state\": \"<string>\",\n \"annual_salary\": 123,\n \"aliases\": [\n {\n \"first_name\": \"<string>\",\n \"middle_name\": \"<string>\",\n \"last_name\": \"<string>\"\n }\n ],\n \"addresses\": [\n {\n \"street_one\": \"<string>\",\n \"street_two\": \"<string>\",\n \"city\": \"<string>\",\n \"state_or_province\": \"<string>\",\n \"postal_code\": \"<string>\",\n \"country\": \"<string>\",\n \"address_type\": \"<string>\",\n \"start_date\": \"<string>\",\n \"end_date\": \"<string>\"\n }\n ]\n },\n \"candidate_in_record\": {}\n}"
response = http.request(request)
puts response.read_body{
"ssn_score": 123,
"ssn_match_desc": "<string>",
"dob_score": 123,
"dob_match_desc": "<string>",
"name_score": 123,
"name_match_desc": "<string>",
"address_score": 123,
"address_match_desc": "<string>",
"match_score": 123,
"is_match": true,
"details": "<string>"
}Endpoints
Identity Match
Compare two identity records to determine if they match
POST
/
complianceEngine
/
identity-match
Identity Match
curl --request POST \
--url https://cra.pr.snh-ai.com/complianceEngine/identity-match \
--header 'Content-Type: application/json' \
--data '
{
"candidate_to_verify": {
"first_name": "<string>",
"middle_name": "<string>",
"last_name": "<string>",
"date_of_birth": "<string>",
"ssn": "<string>",
"state": "<string>",
"annual_salary": 123,
"aliases": [
{
"first_name": "<string>",
"middle_name": "<string>",
"last_name": "<string>"
}
],
"addresses": [
{
"street_one": "<string>",
"street_two": "<string>",
"city": "<string>",
"state_or_province": "<string>",
"postal_code": "<string>",
"country": "<string>",
"address_type": "<string>",
"start_date": "<string>",
"end_date": "<string>"
}
]
},
"candidate_in_record": {}
}
'import requests
url = "https://cra.pr.snh-ai.com/complianceEngine/identity-match"
payload = {
"candidate_to_verify": {
"first_name": "<string>",
"middle_name": "<string>",
"last_name": "<string>",
"date_of_birth": "<string>",
"ssn": "<string>",
"state": "<string>",
"annual_salary": 123,
"aliases": [
{
"first_name": "<string>",
"middle_name": "<string>",
"last_name": "<string>"
}
],
"addresses": [
{
"street_one": "<string>",
"street_two": "<string>",
"city": "<string>",
"state_or_province": "<string>",
"postal_code": "<string>",
"country": "<string>",
"address_type": "<string>",
"start_date": "<string>",
"end_date": "<string>"
}
]
},
"candidate_in_record": {}
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
candidate_to_verify: {
first_name: '<string>',
middle_name: '<string>',
last_name: '<string>',
date_of_birth: '<string>',
ssn: '<string>',
state: '<string>',
annual_salary: 123,
aliases: [{first_name: '<string>', middle_name: '<string>', last_name: '<string>'}],
addresses: [
{
street_one: '<string>',
street_two: '<string>',
city: '<string>',
state_or_province: '<string>',
postal_code: '<string>',
country: '<string>',
address_type: '<string>',
start_date: '<string>',
end_date: '<string>'
}
]
},
candidate_in_record: {}
})
};
fetch('https://cra.pr.snh-ai.com/complianceEngine/identity-match', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://cra.pr.snh-ai.com/complianceEngine/identity-match",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'candidate_to_verify' => [
'first_name' => '<string>',
'middle_name' => '<string>',
'last_name' => '<string>',
'date_of_birth' => '<string>',
'ssn' => '<string>',
'state' => '<string>',
'annual_salary' => 123,
'aliases' => [
[
'first_name' => '<string>',
'middle_name' => '<string>',
'last_name' => '<string>'
]
],
'addresses' => [
[
'street_one' => '<string>',
'street_two' => '<string>',
'city' => '<string>',
'state_or_province' => '<string>',
'postal_code' => '<string>',
'country' => '<string>',
'address_type' => '<string>',
'start_date' => '<string>',
'end_date' => '<string>'
]
]
],
'candidate_in_record' => [
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://cra.pr.snh-ai.com/complianceEngine/identity-match"
payload := strings.NewReader("{\n \"candidate_to_verify\": {\n \"first_name\": \"<string>\",\n \"middle_name\": \"<string>\",\n \"last_name\": \"<string>\",\n \"date_of_birth\": \"<string>\",\n \"ssn\": \"<string>\",\n \"state\": \"<string>\",\n \"annual_salary\": 123,\n \"aliases\": [\n {\n \"first_name\": \"<string>\",\n \"middle_name\": \"<string>\",\n \"last_name\": \"<string>\"\n }\n ],\n \"addresses\": [\n {\n \"street_one\": \"<string>\",\n \"street_two\": \"<string>\",\n \"city\": \"<string>\",\n \"state_or_province\": \"<string>\",\n \"postal_code\": \"<string>\",\n \"country\": \"<string>\",\n \"address_type\": \"<string>\",\n \"start_date\": \"<string>\",\n \"end_date\": \"<string>\"\n }\n ]\n },\n \"candidate_in_record\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://cra.pr.snh-ai.com/complianceEngine/identity-match")
.header("Content-Type", "application/json")
.body("{\n \"candidate_to_verify\": {\n \"first_name\": \"<string>\",\n \"middle_name\": \"<string>\",\n \"last_name\": \"<string>\",\n \"date_of_birth\": \"<string>\",\n \"ssn\": \"<string>\",\n \"state\": \"<string>\",\n \"annual_salary\": 123,\n \"aliases\": [\n {\n \"first_name\": \"<string>\",\n \"middle_name\": \"<string>\",\n \"last_name\": \"<string>\"\n }\n ],\n \"addresses\": [\n {\n \"street_one\": \"<string>\",\n \"street_two\": \"<string>\",\n \"city\": \"<string>\",\n \"state_or_province\": \"<string>\",\n \"postal_code\": \"<string>\",\n \"country\": \"<string>\",\n \"address_type\": \"<string>\",\n \"start_date\": \"<string>\",\n \"end_date\": \"<string>\"\n }\n ]\n },\n \"candidate_in_record\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://cra.pr.snh-ai.com/complianceEngine/identity-match")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"candidate_to_verify\": {\n \"first_name\": \"<string>\",\n \"middle_name\": \"<string>\",\n \"last_name\": \"<string>\",\n \"date_of_birth\": \"<string>\",\n \"ssn\": \"<string>\",\n \"state\": \"<string>\",\n \"annual_salary\": 123,\n \"aliases\": [\n {\n \"first_name\": \"<string>\",\n \"middle_name\": \"<string>\",\n \"last_name\": \"<string>\"\n }\n ],\n \"addresses\": [\n {\n \"street_one\": \"<string>\",\n \"street_two\": \"<string>\",\n \"city\": \"<string>\",\n \"state_or_province\": \"<string>\",\n \"postal_code\": \"<string>\",\n \"country\": \"<string>\",\n \"address_type\": \"<string>\",\n \"start_date\": \"<string>\",\n \"end_date\": \"<string>\"\n }\n ]\n },\n \"candidate_in_record\": {}\n}"
response = http.request(request)
puts response.read_body{
"ssn_score": 123,
"ssn_match_desc": "<string>",
"dob_score": 123,
"dob_match_desc": "<string>",
"name_score": 123,
"name_match_desc": "<string>",
"address_score": 123,
"address_match_desc": "<string>",
"match_score": 123,
"is_match": true,
"details": "<string>"
}Compare candidate information against a criminal record subject to determine identity match probability. No authentication required.
Request and response bodies use snake_case field names (
candidate_to_verify, is_match, address_match_desc, …). CamelCase (candidateToVerify, isMatch, …) is not accepted and returns HTTP 400.Request
object
required
Candidate identity to verify (the person being checked).
Show Candidate Properties
Show Candidate Properties
string
First name (uppercase recommended)
string
Middle name
string
Last name
string
Date of birth in
YYYY-MM-DD formatstring
Social Security Number (empty string if unavailable)
string
Two-letter state abbreviation
number
Annual salary (used for salary-based compliance rules)
array
array
List of address objects
Show Address Properties
Show Address Properties
object
required
Candidate identity found in the criminal record (the person in the record). Same structure as
candidate_to_verify.Response
number
SSN match score (0–1)
string
Description of SSN match result
number
Date of birth match score (0–1)
string
Description of DOB match result
number
Name match score (0–1)
string
Description of name match result (e.g.,
"Exact Name Match")number
Address match score (0–1)
string
Description of address match result
number
Overall weighted match score (0–1)
boolean
Whether the match threshold is met.
true = positive match.string
Detailed breakdown of match scores with weights for each component
Code Examples
Full Request Body (JSON)
Full Request Body (JSON)
Copy and modify this JSON payload:
{
"candidate_to_verify": {
"first_name": "EDGAR",
"middle_name": "",
"last_name": "LINARES",
"date_of_birth": "1997-05-05",
"ssn": "",
"state": "TX",
"annual_salary": 55000.0,
"aliases": [
{ "first_name": "ED", "middle_name": "", "last_name": "LINARES" }
],
"addresses": [
{
"street_one": "200 AVANT ST APT C1 DEL RIO, TX 78840",
"street_two": "",
"city": "DEL RIO",
"state_or_province": "TX",
"postal_code": "78840",
"country": "US",
"address_type": "DOMESTIC",
"start_date": "2020-01-01",
"end_date": ""
}
]
},
"candidate_in_record": {
"first_name": "EDGAR",
"middle_name": "",
"last_name": "LINARES",
"date_of_birth": "1997-05-05",
"ssn": "",
"state": "TX",
"annual_salary": null,
"aliases": [],
"addresses": [
{
"street_one": "200 AVANT ST APT C1 DEL RIO, TX 78840",
"street_two": "",
"city": "",
"state_or_province": "",
"postal_code": "",
"country": "US",
"address_type": "DOMESTIC",
"start_date": "",
"end_date": ""
}
]
}
}
Example Request (cURL / Python / JavaScript)
Example Request (cURL / Python / JavaScript)
curl -X POST "https://cra.pr.snh-ai.com/complianceEngine/identity-match" \
-H "Content-Type: application/json" \
-d '{
"candidate_to_verify": {
"first_name": "EDGAR",
"middle_name": "",
"last_name": "LINARES",
"date_of_birth": "1997-05-05",
"ssn": "",
"state": "TX",
"annual_salary": 55000.0,
"aliases": [
{
"first_name": "ED",
"middle_name": "",
"last_name": "LINARES"
}
],
"addresses": [
{
"street_one": "200 AVANT ST APT C1 DEL RIO, TX 78840",
"street_two": "",
"city": "DEL RIO",
"state_or_province": "TX",
"postal_code": "78840",
"country": "US",
"address_type": "DOMESTIC",
"start_date": "2020-01-01",
"end_date": ""
}
]
},
"candidate_in_record": {
"first_name": "EDGAR",
"middle_name": "",
"last_name": "LINARES",
"date_of_birth": "1997-05-05",
"ssn": "",
"state": "TX",
"annual_salary": null,
"aliases": [],
"addresses": [
{
"street_one": "200 AVANT ST APT C1 DEL RIO, TX 78840",
"street_two": "",
"city": "",
"state_or_province": "",
"postal_code": "",
"country": "US",
"address_type": "DOMESTIC",
"start_date": "",
"end_date": ""
}
]
}
}'
import requests
response = requests.post(
"https://cra.pr.snh-ai.com/complianceEngine/identity-match",
headers={"Content-Type": "application/json"},
json={
"candidate_to_verify": {
"first_name": "EDGAR",
"last_name": "LINARES",
"date_of_birth": "1997-05-05",
"ssn": "",
"state": "TX",
"aliases": [{"first_name": "ED", "last_name": "LINARES"}],
"addresses": [{
"street_one": "200 AVANT ST APT C1 DEL RIO, TX 78840",
"country": "US",
"address_type": "DOMESTIC"
}]
},
"candidate_in_record": {
"first_name": "EDGAR",
"last_name": "LINARES",
"date_of_birth": "1997-05-05",
"ssn": "",
"state": "TX",
"aliases": [],
"addresses": [{
"street_one": "200 AVANT ST APT C1 DEL RIO, TX 78840",
"country": "US",
"address_type": "DOMESTIC"
}]
}
}
)
print(response.json())
const response = await fetch("https://cra.pr.snh-ai.com/complianceEngine/identity-match", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
candidate_to_verify: {
first_name: "EDGAR",
last_name: "LINARES",
date_of_birth: "1997-05-05",
ssn: "",
state: "TX",
aliases: [{ first_name: "ED", last_name: "LINARES" }],
addresses: [{
street_one: "200 AVANT ST APT C1 DEL RIO, TX 78840",
country: "US",
address_type: "DOMESTIC"
}]
},
candidate_in_record: {
first_name: "EDGAR",
last_name: "LINARES",
date_of_birth: "1997-05-05",
ssn: "",
state: "TX",
aliases: [],
addresses: [{
street_one: "200 AVANT ST APT C1 DEL RIO, TX 78840",
country: "US",
address_type: "DOMESTIC"
}]
}
})
});
const data = await response.json();
console.log(data);
Example Response — Match Found
Example Response — Match Found
{
"ssn_score": 0,
"ssn_match_desc": "Invalid/Empty SSN(s)",
"dob_score": 1.0,
"dob_match_desc": "Exact DOB Match",
"name_score": 1.0,
"name_match_desc": "Exact Name Match",
"address_score": 1.0,
"address_match_desc": "Exact Address Match",
"match_score": 0.90,
"is_match": true,
"details": "Name/Alias Score: 100 % (Weight: 45 %)\nDOB Score: 100 % (Weight: 40 %)\nSSN Score: 0 % (Weight: 10 %)\nAddress Score: 100 % (Weight: 5 %)\nOverall Score: 90.0 % (Qualify: 85 %)"
}
Error Responses (400)
Error Responses (400)
CamelCase / missing required fields (ASP.NET model binding):Send snake_case keys (
{
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"errors": {
"CandidateToVerify": ["The CandidateToVerify field is required."],
"CandidateInRecord": ["The CandidateInRecord field is required."]
}
}
candidate_to_verify, candidate_in_record) instead.Match Scoring
The identity match algorithm uses a weighted scoring system:| Component | Weight | Method |
|---|---|---|
| Name/Alias | 45% | Fuzzy matching across name and aliases |
| Date of Birth | 40% | Date comparison |
| SSN | 10% | Exact match when available |
| Address | 5% | Standardized address comparison |
Maximum score is 1.00 when SSN, DOB, name, and address all match exactly: (45% x 1.0) + (40% x 1.0) + (10% x 1.0) + (5% x 1.0) = 1.00. Records with SSN + DOB + exact name typically score 0.95+. Without SSN (most common), the practical maximum is 0.90 (name + DOB + address).
