🛡️ 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:

  1. Search
    Use GET /persons or GET /businesses to search for a person or company. The response will return a list of candidates that best match your query.
  2. 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} or GET /businesses/{id}.

A profile lists the evidence behind its findings, each with a link to the source it was taken from. When that source is no longer available, there is an optional third step:

  1. Retrieve the evidence PDF
    Download the PDF copy of a single piece of evidence via GET /persons/{id}/evidences/copyrighted/{evidenceID} or GET /businesses/{id}/evidences/copyrighted/{evidenceID}. See Evidence PDFs below.


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

This 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 dateOfBirthRequired or countryRequired is set to false, 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 KeyDescription
PEPSearch all Politically Exposed Persons: current, former, and linked
PEP-CURRENTSearch only the current Politically Exposed Persons
PEP-FORMERSearch only the former Politically Exposed Persons
PEP-LINKEDSearch only the Politically Exposed Persons by association
SANSearch all Sanctions: current and former
SAN-CURRENTSearch only current Sanctions
SAN-FORMERSearch only for former Sanctions
RRESearch the Reputational Risk Exposure dataset
RELSearch the Regulatory Enforcement Lists
POISearch the Profiles of Interest dataset
DDSearch the Disqualified Directors dataset
INSSearch the Insolvency Register

Additional evidence classifications

In addition to the searchable datasets listed above, the datasets field within an evidence object may contain the following supporting classifications:

KeyDescription
IDIdentity evidence. The source supports or confirms identifying information associated with the profile.
CORPCorporate evidence. The source contains information about a business, corporate interest, corporate relationship, or other company-related details associated with the profile.

ID and CORP are evidence classifications, not searchable datasets. They can appear in profile evidence but cannot be used in the match[datasets] search parameter. These classifications do not independently indicate a compliance risk.

❗️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 PEP already includes both PEP-CURRENT and PEP-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

This 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 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 - The datasets to search through. Multiple datasets can be queried by separating them with commas. A list of available datasets and their descriptions is provided below.

  • threshold - The minimum matching score (between 75 and 100) required for a result to be returned. 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 to false, 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 the countryRequired field.


📚 Datasets for Businesses profile

Dataset KeyDescription
PEPSearch through all Politically Exposed Persons: current, former, and linked
PEP-LINKEDSearch only the Politically Exposed Persons by association
SANSearch through all Sanctions: current and former
SAN-CURRENTSearch only through current Sanctions
SAN-FORMERSearch only through former Sanctions
RRESearch through the Reputational Risk Exposure dataset
RELSearch through the Regulatory Enforcement Lists
POISearch through the Profiles of Interest dataset
INSSearch through the Insolvency Register
SOESearch through all State-Owned Enterprises: current and former
SOE-CURRENTSearch only through current State-Owned Enterprises
SOE-FORMERSearch 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}

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 /persons search 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}

This endpoint retrieves the complete compliance profile of a business entity

equest parameters

  • id – The unique identifier of the business whose detailed compliance profile you want to retrieve. This ID is returned by the GET /businesses search 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"
    }
  }
}

📄 Evidence PDFs

Each profile returned by GET /persons/{id} or GET /businesses/{id} contains an evidences list. Every item carries an originalURL pointing at the source the evidence was taken from, which is the first place to read it.

Those sources are public web pages, and they move or disappear over time. When an article is no longer available at its originalURL, a PDF copy can be retrieved instead:

  • GET /persons/{id}/evidences/copyrighted/{evidenceID}
  • GET /businesses/{id}/evidences/copyrighted/{evidenceID}
❗️

Read evidence in this order:

  1. At its originalURL.
  2. If that no longer works, at its assetURL, when it is set.
  3. Otherwise, with the endpoints above. This is always the case for evidence marked "isCopyrighted": true, which has no assetURL.

Request parameters

  • id – The unique identifier of the person or business the evidence belongs to. This is the same ID you used to retrieve the profile.
  • evidenceID – The evidenceID of an item in the profile's evidences list.

Given this evidence item from a profile response:

{
  "assetURL": "",
  "captureDateISO": "2000-01-01",
  "evidenceID": "24322945",
  "isCopyrighted": true,
  "originalURL": "https://website.com",
  "title": ""
}

the PDF copy is retrieved with the evidenceID 24322945.


Example request

curl --request GET \
     --url https://api.company.info/compliance/screening/persons/123456789/evidences/copyrighted/24322945 \
     --header 'X-API-KEY: *********************' \
     --header 'accept: application/pdf' \
     --output evidence.pdf

The /businesses endpoint works the same way:

curl --request GET \
     --url https://api.company.info/compliance/screening/businesses/123456789/evidences/copyrighted/24322945 \
     --header 'X-API-KEY: *********************' \
     --header 'accept: application/pdf' \
     --output evidence.pdf

Response

The response body is the PDF itself, not a JSON:API document. Note the following response headers:

  • Content-Type – Always application/pdf.
  • Content-Disposition – inline; filename={evidenceID}.pdf. The document is served for display rather than as a download; the file name applies when it is saved.
  • Content-Length – The size of the PDF in bytes. This header is absent when the size is not known up front, in which case the response is chunked.

A 404 means that no PDF copy of this evidence is available.


🔢 Pagination

The results are paginated, meaning they are delivered in batches (by default, 10 per response).
To access additional results, you can:

  • Increase the size parameter in your request to receive more results in a single response
  • Use the page parameter 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 is 20.

  • 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 CodeError MessageSolution
400failed to process provider request: Invalid {search parameter}Ensure your request includes all the required search parameters.
400failed to process request: invalid id formatThe 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.
400failed to process request: provider not foundThe provider parameter is missing. Add &provider=kyc_aml to your request.
404unable to find evidence by this id for this profileThe profile or evidence does not exist, or no PDF copy of this evidence is available.
500failed to process responseThis 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.


Did this page help you?