Matching API quick start
Screen one person against every list in a single request, then follow the result to the full record.
The matching API works by example: you describe the party you want to check, and it returns the records that resemble that description, best first. You can run the same check with a form on Screening.
Before you start. No key is needed today. Use the API within our terms of use; screening in a business process needs a commercial licence.
Your first request
Send one query, q1, describing a person by name, year of birth and nationality, to the default collection:
curl -X POST "https://api.crownintelligence.net/api/match/default?limit=3" \
-H "Content-Type: application/json" \
-d '{"queries":{"q1":{"schema":"Person","properties":{"name":["Igor Putin"],"birthDate":["1953"],"nationality":["ru"]}}}}'import requests
BASE = "https://api.crownintelligence.net"
query = {
"schema": "Person",
"properties": {"name": ["Igor Putin"], "birthDate": ["1953"], "nationality": ["ru"]},
}
r = requests.post(f"{BASE}/api/match/default", params={"limit": 3}, json={"queries": {"q1": query}}, timeout=60)
r.raise_for_status()
for hit in r.json()["responses"]["q1"]["results"]:
print(hit["score"], hit["match"], hit["caption"], hit["datasets"], hit["id"])const BASE = "https://api.crownintelligence.net";
const res = await fetch(`${BASE}/api/match/default?limit=3`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ queries: { q1: { schema: "Person",
properties: { name: ["Igor Putin"], birthDate: ["1953"], nationality: ["ru"] } } } }),
});
const data = await res.json();
for (const hit of data.responses.q1.results) console.log(hit.score, hit.match, hit.caption, hit.datasets, hit.id);{"queries":{"q1":{"schema":"Person","properties":{"name":["Igor Putin"],"birthDate":["1953"],"nationality":["ru"]}}}}
Use a list for every property: a party can have several names, birth dates or nationalities. More on composing queries in The request.
Reading the response
The answer has one entry under responses for each query you sent. A shortened example:
{
"collection": "default",
"algorithm": "standard",
"threshold": 0.75,
"limit": 3,
"responses": {
"q1": {
"status": 200,
"query": {
"schema": "Person",
"name": [
"Igor Putin"
],
"birthDate": [
"1953"
],
"nationality": [
"ru"
],
"imo": []
},
"total": 1503,
"results": [
{
"id": 379937151,
"caption": "PUTIN IGOR ALEXANDROVICH",
"schema": "Person",
"score": 1,
"match": true,
"features": [
{
"feature": "name_match",
"explanation": "'IGOR'≈'IGOR' exact 1.00 · 'PUTIN'≈'PUTIN' exact 1.00 · 'ALEXANDROVICH' not in query",
"score": 0.9
},
{
"feature": "dob_match",
"explanation": "query 1953 · record 1953-03-30 · match",
"score": 0.1
}
],
"datasets": [
"ACF War Enablers — Anti-Corruption Foundation list"
],
"topics": [
"debarment"
],
"programme": "Individuals involved in corruption",
"merged_entity": "ce7e35f9-f4b5-4d30-95f0-ab7385538b78",
"url": "/estate/record.html?id=379937151"
}
]
}
},
"checked_at": "2026-10-04T01:38:23.856Z"
}
ididentifies the record. Store it with your decision and use it with the entities API.scoreruns from 0 to 1 andmatchis true when the score reaches the threshold. A score measures resemblance, not risk.featuresexplain the score: which words aligned, and whether birth date, country, IMO number and entity type agreed.topics,datasetsandprogrammetell you why the record matters: which kind of list, which register, which programme.merged_entityis present when the same party appears on several registers.
Each record is one register's entry, so the same party can come back several times from different registers. Field by field: The response.
Taking it further: the entities endpoint
Match results are kept short. To see a record in full, with its listings and the other registers that name the same party, fetch it from the entities API:
curl "https://api.crownintelligence.net/api/entity/379781867"
import requests
BASE = "https://api.crownintelligence.net"
record = requests.get(f"{BASE}/api/entity/379781867", timeout=60).json()
for listing in record["listings"]:
print(listing["register"], listing["programme"], listing["list_type"])
if record.get("entity_id"):
merged = requests.get(f"https://api.crownintelligence.net/api/entity/{record['entity_id']}", timeout=60).json()
print(merged["caption"], merged["datasets"], merged["properties"]["birthDate"])Every record also has a page on this site, linked by url in the result, for example record 379781867.
Last updated 2026-10-03