Documentation · Screening API

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);

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"
}
  • id identifies the record. Store it with your decision and use it with the entities API.
  • score runs from 0 to 1 and match is true when the score reaches the threshold. A score measures resemblance, not risk.
  • features explain the score: which words aligned, and whether birth date, country, IMO number and entity type agreed.
  • topics, datasets and programme tell you why the record matters: which kind of list, which register, which programme.
  • merged_entity is 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