🛡️Compliance Screening
Purpose
The Compliance Screening API enables you to query Company.info’s compliance datasets using structured parameters. It allows you to screen both individuals and businesses, returning a comprehensive compliance profile for each entity.
This API is delivered over HTTPS, follows RESTful principles, and returns data in JSON format.
Compliance Screening
❗ These endpoints incur usage-based charges.
This API follows a two-step process:
- Search
Use
GET /personsorGET /businessesto search for a person or company. The response will return a list of candidates that best match your query. - Select & Retrieve Details
Once you’ve identified the correct person or business from the search results, use their id to request the full profile via
GET /persons/{id}orGET /businesses/{id}.
Base Path
All endpoints for this API are available under:
/compliance/screening
Append this to the base API URL to form the full endpoint path.
GET /persons
GET /personsThis endpoint allows you to search for a person using various search parameters. It returns a list of potential matches based on how closely the input aligns with available data.
Each result includes a score field that indicates the confidence level of the match, with 100 representing the highest possible score.
Note: The results contain only a basic profile. To retrieve the complete profile of a specific individual, use the GET /persons/{id} endpoint (see below for details).
Request parameters
- provider - The source of the compliance data. Currently supported value: kyc_aml
- name - The full name of the person to search for. For best results, use one of the following formats:
- "lastnames, firstnames middlenames" – recommended if you know the exact last name.
- "firstnames middlenames lastnames" – use this if you want the system to infer the last name automatically.
- datasets - Specifies which datasets to search. You can provide multiple datasets separated by commas. A full list of available datasets and their definitions is provided below.
- threshold - The minimum match score (between 75 and 100) required for a result to be returned. Defaults to 85.
- countries - Filters results by country. Accepts one or more two-letter country codes (ISO 3166-1 alpha-2). Returns profiles matching at least one of the specified countries.
- countryRequired - If set to true, profiles without a known country or nationality will be excluded from the results.
- dateOfBirth - The full date of birth of the person you are searching for.
- dateOfBirthMatching - Defines how strictly the provided date of birth must match (e.g., exact or approximate).
- dateOfBirthRequired - If set to true, profiles with an unknown date of birth will be excluded from the results.
- gender - Specifies the gender of the person being searched.
- matching - Determines the name-matching algorithm used for the search.
- Fuzzy (default): Applies advanced fuzzy matching to return the most relevant results, even if the name is not an exact match.
- Strict: Uses limited fuzzy logic, better suited when the exact name is known. This mode reduces false positives but may miss valid matches. Recommendation: Use Fuzzy for most use cases.
- pepTiers - When searching within the PEP dataset, this defines which tiers of politically exposed persons to include:
- Tier 1 – Senior roles
- Tier 2 – Middle-ranking officials
- Tier 3 – Junior officials If the PEP dataset is not part of the selected datasets, this filter is ignored. Notes:
- This filter does not apply to PEP-Linked profiles.
- When a parameter such as
dateOfBirthRequiredorcountryRequiredis set tofalse, profiles missing that specific value will still be included in the results. However, a minor score penalty will be applied to reflect the reduced confidence.
Available Datasets for Person Screening
| Dataset Key | Description |
|---|---|
| PEP | Search all Politically Exposed Persons: current, former, and linked |
| PEP-CURRENT | Search only the current Politically Exposed Persons |
| PEP-FORMER | Search only the former Politically Exposed Persons |
| PEP-LINKED | Search only the Politically Exposed Persons by association |
| SAN | Search all Sanctions: current and former |
| SAN-CURRENT | Search only current Sanctions |
| SAN-FORMER | Search only for former Sanctions |
| RRE | Search the Reputational Risk Exposure dataset |
| REL | Search the Regulatory Enforcement Lists |
| POI | Search the Profiles of Interest dataset |
| DD | Search the Disqualified Directors dataset |
| INS | Search the Insolvency Register |
❗️Dataset Combination Rule
You cannot mix CURRENT or FORMER dataset filters with their full parent dataset in the same request.
❌ Invalid Example
PEP-CURRENT,PEP
This is invalid because
PEPalready includes bothPEP-CURRENTandPEP-FORMER.
✅ Valid Example
PEP-CURRENT,PEP-FORMER
This is valid because it explicitly separates the two subsets.
Example request
All available parameters can also be found in our API reference
curl --request GET \
--url 'https://api.company.info/compliance/screening/persons?provider=kyc_aml&match[threshold]=85&match[countryRequired]=false&match[dateOfBirthMatching]=sameYear&match[dateOfBirthRequired]=false&match[matching]=fuzzy&match[name]=Mark%2C%20Rutte&match[datasets]=PEP&page[size]=10&page[number]=1' \
--header 'X-API-KEY: ***********************' \
--header 'accept: application/vnd.api+json'Example response
{
"data": [
{
"type": "persons",
"id": "123456789",
"attributes": {
"countries": [
"NL"
],
"datasets": [
"PEP-FORMER"
],
"datesOfBirth": [
"1967-02-14"
],
"gender": "Male",
"match": "Mark Rutte",
"monitoringID": "123456789",
"name": "Mark Rutte",
"pepTier": "PEP Tier 1",
"profileImage": "https://example.com/image.png",
"score": 100,
"version": 1720112978087
},
"links": {
"self": "/persons/123456789"
}
}
],
"links": {
"self": "/persons?match[countryRequired]=false&match[datasets]=PEP&match[dateOfBirthMatching]=sameYear&match[dateOfBirthRequired]=false&match[matching]=fuzzy&match[name]=Mark, Rutte&match[threshold]=85&provider=kyc_aml&page[size]=10&page[number]=1"
},
"meta": {
"totalPages": 1,
"totalResults": 1
}
}GET /businesses
GET /businessesThis endpoint allows you to search for a business using specific parameters and check whether it appears in one or more datasets. It returns a list of potential matches, each accompanied by a relevance score, where 100 indicates the highest level of certainty. The results include only a basic profile of each match.
To retrieve a full business profile, you can use the GET /businesses/{id} endpoint. More details on that can be found below.
Request parameters
-
provider - The provided of the compliance data (Currently supported:
kyc_aml) -
name - The full name of the person you are searching for. For optimal results, use the format:
- "lastnames, firstnames middlenames" — when the last name is explicitly known
- "firstnames middlenames lastnames" — when the system should determine the last name automatically
-
datasets - The datasets you want to search through. All of the available datasets and what they mean are down below. Can search through multiple datasets if you provide them with comma separation.
-
threshold - The minimum score you want the match to be before it returns a result. (min 75 to max 100. Defaults to 85)
-
countries - Filters results based on country of origin. Accepts one or more ISO 3166-1 alpha-2 country codes (e.g., NL, DE, US).
-
countryRequired - If set to true, profiles without a known country or nationality will be excluded from the results.
- If set to false (default), such profiles will still appear but with a lower score.
- If set to true, those profiles will be excluded from the results.
- If no country is specified in the query, this setting is ignored.
-
matching - Defines the name-matching algorithm to use:
- fuzzy (default) — uses a comprehensive set of fuzzy-matching techniques to maximize accuracy.
- strict — applies a more limited matching approach, suitable when the exact name is known and only a minimal set of matches is desired.
When a parameter is set tofalse, profiles missing that corresponding value will still appear in the results, but with a slight penalty applied to their score. This behavior applies, for example, to thecountryRequiredfield.
📚 Datasets for Businesses profile
| Dataset Key | Description |
|---|---|
| PEP | Search through all Politically Exposed Persons: current, former, and linked |
| PEP-LINKED | Search only the Politically Exposed Persons by association |
| SAN | Search through all Sanctions: current and former |
| SAN-CURRENT | Search only through current Sanctions |
| SAN-FORMER | Search only through former Sanctions |
| RRE | Search through the Reputational Risk Exposure dataset |
| REL | Search through the Regulatory Enforcement Lists |
| POI | Search through the Profiles of Interest dataset |
| INS | Search through the Insolvency Register |
| SOE | Search through all State-Owned Enterprises: current and former |
| SOE-CURRENT | Search only through current State-Owned Enterprises |
| SOE-FORMER | Search only through former State-Owned Enterprises |
Datasets with -CURRENT and -FORMER cannot be specified together with the full dataset key. For example: SAN-CURRENT,SAN is an invalid combination, while SAN-CURRENT,SAN-FORMER is valid.
Example request
All available parameters can also be found in our API reference
curl --request GET \
--url 'https://api.company.info/compliance/screening/businesses?provider=kyc_aml&match[threshold]=85&match[countryRequired]=false&match[matching]=fuzzy&match[name]=wagner&match[datasets]=REL&page[size]=10&page[number]=1' \
--header 'X-API-KEY: ***********************' \
--header 'accept: application/vnd.api+json'Example response
{
"data": [
{
"type": "businesses",
"id": "123456789",
"attributes": {
"countries": [
"RU"
],
"datasets": [
"PEP-LINKED",
"REL",
"SAN-CURRENT"
],
"match": "Wagner",
"monitoringID": "123456789",
"name": "The Wagner Group",
"score": 100,
"version": 1724761185610
},
"links": {
"self": "/businesses/123456789"
}
}
],
"links": {
"self": "/businesses?match[countryRequired]=false&match[datasets]=REL&match[matching]=fuzzy&match[name]=wagner&match[threshold]=85&provider=kyc_aml&page[size]=10&page[number]=1"
},
"meta": {
"totalPages": 1,
"totalResults": 1
}
}GET /persons/{id}
GET /persons/{id}This endpoint retrieves the complete compliance profile of an individual.
Request parameters
- id – The unique identifier of the person whose profile you want to retrieve. This ID is returned by the
GET /personssearch endpoint.
Example request
curl --request GET \
--url https://api.company.info/compliance/screening/persons/123456789 \
--header 'X-API-KEY: *********************' \
--header 'accept: application/vnd.api+json'Example response
{
"data": {
"type": "persons",
"id": "123456789",
"attributes": {
"addresses": [
{
"addressType": "Place of birth",
"city": "Cityname",
"countryISOCode": "NL",
"county": "Province",
"countyAbbreviation": "PV",
"line1": "",
"line2": "",
"postcode": ""
},
{
"addressType": "Business",
"city": "Cityname",
"countryISOCode": "NL",
"county": "Province",
"countyAbbreviation": "PV",
"line1": "Streetname 1",
"postcode": "1111"
}
],
"aliases": [
{
"firstName": "M.",
"lastName": "Rutte",
"type": "Shortened Name"
}
],
"businessLinks": [
{
"datasets": [
"PEP-LINKED"
],
"id": "123456789",
"individualLinks": [],
"monitoringID": "123456789",
"name": "name",
"ownershipPercentage": 0,
"relationship": "Relationship to the business"
}
],
"firstName": "Mark",
"gender": "Male",
"griEntries": [],
"identifiers": [],
"insEntries": [],
"isDeceased": false,
"isDeleted": false,
"lastName": "Rutte",
"middleName": "",
"monitoringID": "123456789",
"nationalitiesISOCodes": [
"NL"
],
"notes": [],
"pepByAssociationEntries": [],
"pepEntries": {
"pepTier": "PEP Tier 1",
"former": [
{
"countryISOCode": "NL",
"dateFromISO": "2022-01-10",
"dateToISO": "2024-07-02",
"evidenceIDs": [
"1234",
"5678",
"9012"
],
"position": "Prime Minister (Minister-President) | Government (Regering)",
"segment": "Executive Branch - Head and Members of Government and Deputies"
}
]
},
"poiEntries": [],
"profileImages": [
"https://example.com/image.png"
],
"relEntries": [],
"rreEntries": [],
"sanEntries": {},
"version": 1720112978087
},
"links": {
"self": "/persons/123456789"
}
}
}GET /businesses/{id}
GET /businesses/{id}This endpoint retrieves the complete compliance profile of a business entity
Request parameters
- id – The unique identifier of the business whose detailed compliance profile you want to retrieve. This ID is returned by the
GET /businessessearch endpoint.
Example request
curl --request GET \
--url https://api.company.info/compliance/screening/businesses/123456789 \
--header 'X-API-KEY: *************************' \
--header 'accept: application/vnd.api+json'Example response
{
"data": {
"type": "businesses",
"id": "123456789",
"attributes": {
"activities": [
"Private military company"
],
"addresses": [
{
"addressType": "Operating",
"city": "",
"countryISOCode": "RU",
"county": "",
"countyAbbreviation": "",
"line1": "",
"line2": "",
"postcode": ""
}
],
"aliases": [
{
"alias": "alias",
"type": "Name Spelling Variation"
}
],
"businessLinks": [
{
"datasets": [
"SAN-CURRENT"
],
"id": "123456789",
"monitoringID": "123456789",
"name": "Sanad Protection and Security Services",
"ownershipPercentage": 0,
"relationship": "relationship to business"
}
],
"businessTypes": [],
"contactEntries": [],
"datasets": [
"PEP-LINKED",
"REL",
"SAN-CURRENT"
],
"deletionReason": {},
"description": "description of business",
"evidences": [
{
"assetURL": "file.pdf",
"captureDateISO": "2000-01-01",
"credibility": "High",
"datasets": [
"SAN-CURRENT",
"CORP"
],
"evidenceID": "24322945",
"isCopyrighted": false,
"keywords": "",
"language": "eng",
"originalURL": "https://website.com",
"publicationDateISO": "2000-01-01",
"summary": "",
"title": ""
}
],
"individualLinks": [
{
"datasets": [
"SAN-CURRENT"
],
"firstName": "firstname",
"id": "123456789",
"lastName": "lastname",
"middleName": "middlename",
"monitoringID": "123456789",
"ownershipPercentage": 0,
"relationship": "relationship"
}
],
"insEntries": [],
"isDeleted": false,
"monitoringID": "123456789",
"name": "The Wagner Group",
"notes": [
{
"value": "notes"
}
],
"poiEntries": [],
"profileImages": [],
"relEntries": [
{
"category": "category",
"subcategory": "subcategory",
"events": [
{
"amount": 0,
"currencyCode": "",
"dateISO": "2000-01-01",
"evidenceIDs": [
"23594463"
],
"period": {},
"type": "Economic Restrictive Measure"
}
]
}
],
"rreEntries": [],
"sanEntries": {
"current": [
{
"events": [
{
"dateISO": "2024-07-03",
"evidenceIDs": [
"24322945"
],
"type": "Amended"
}
],
"measures": [
"Asset Freeze"
],
"regime": {
"body": "body",
"name": "name",
"origin": "origin country"
},
"sanctionID": "22543"
}
]
},
"soeEntry": null,
"version": 1724761185610
},
"links": {
"self": "/businesses/123456789"
}
}
}🔢 Pagination
The results are paginated, meaning they are delivered in batches (by default, 10 per response). To access additional results, you can:
- Increase the
sizeparameter in your request to receive more results in a single response - Use the
pageparameter to request the next batch (e.g.page=2,page=3, etc.)
The metadata section of the response will indicate the total number of results and how many pages are available.
-
size – Number of results to return per page. Default is
10, maximum is20. -
page – Page number to retrieve. Default is
1.
This API has a rate limit of 20 requests per second.
⚠️ Possible Errors & Unexpected Behavior
This list does not include error messages related to API Key issues. Please refer to this page to check if the error you’re encountering is documented there, in case it is not listed in the table below.
| Error Code | Error Message | Solution |
|---|---|---|
| 400 | failed to process provider request: Invalid {search parameter} | Ensure your request includes all the required search parameters. |
| 400 | failed to process request: invalid id format | The ID in the request is invalid. Double-check that you copied it correctly. For example, IDs containing an equals sign (=) may be truncated if copied improperly. |
| 400 | failed to process request: provider not found | The provider parameter is missing. Add &provider=kyc_aml to your request. |
| 500 | failed to process response | This can occur if the requested page number exceeds the total number of pages returned by the search. |
Example error response
{
"errors": [
{
"title": "Bad Request",
"detail": "failed to process provider request: Invalid name",
"status": "400",
"code": "400"
}
]
}🛠️ Try it yourself!
Ready to try it out? Head over to our API reference where you can easily test the API yourself.
🔎 Compliance Monitoring
Want to automate your screening process?Stay informed when a person or business profile changes. Explore our Monitoring API and more here.
🔤 Glossary
A person or business profile – A complete profile retrieved via the Screening API, including all available documents and details (e.g., the full compliance profile of John Doe).
❓ FAQ
Are all input parameters case-sensitive?
Yes, both Monitoring and Screening APIs are case-sensitive.I get an empty response, what’s going wrong?
An empty response does not indicate an error. It simply means that the searched person or entity was not found in the selected dataset(s). For instance, Willem Holleeder is not a PEP or sanctioned individual, so no result will appear. Try including the RRE (Reputational Risk Exposure) dataset to possibly retrieve a match.Why can’t we find the Mayor of Amsterdam or Cologne in the PEP dataset?
Mayors are only considered PEPs in jurisdictions where national AML regulations explicitly define them as such. Typically, only high-level officials qualify. To include such roles, add the POI and RRE datasets.What’s the difference between Fuzzy Matching and Strict Matching?
Fuzzy Matching
Fuzzy matching is tolerant of small variations, typos, and spelling errors.
It provides broader, more accurate search results when the exact name is not known.
Strict Matching
Strict matching is more restrictive. It requires names to closely match and returns fewer results.
Example:
Searching for "John Smith":
– Fuzzy: May return "Jon Smith", "John Smyth", "J. Smith"
– Strict: Returns only exact or near-exact matches like "John Smith"
Recommendation:
Use Fuzzy Matching when uncertain or when broader coverage is needed.
Use Strict Matching when confident of the exact name and you want fewer matches.
Updated 9 days ago
