curl --request POST \
--url https://api.limitguard.ai/v1/entity/deep-check \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"entity_name": "<string>",
"country": "<string>",
"kvk_number": "<string>"
}
'import requests
url = "https://api.limitguard.ai/v1/entity/deep-check"
payload = {
"entity_name": "<string>",
"country": "<string>",
"kvk_number": "<string>"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({entity_name: '<string>', country: '<string>', kvk_number: '<string>'})
};
fetch('https://api.limitguard.ai/v1/entity/deep-check', 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://api.limitguard.ai/v1/entity/deep-check",
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([
'entity_name' => '<string>',
'country' => '<string>',
'kvk_number' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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://api.limitguard.ai/v1/entity/deep-check"
payload := strings.NewReader("{\n \"entity_name\": \"<string>\",\n \"country\": \"<string>\",\n \"kvk_number\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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://api.limitguard.ai/v1/entity/deep-check")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"entity_name\": \"<string>\",\n \"country\": \"<string>\",\n \"kvk_number\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.limitguard.ai/v1/entity/deep-check")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"entity_name\": \"<string>\",\n \"country\": \"<string>\",\n \"kvk_number\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"entity_name": "<string>",
"country": "<string>",
"sources_returned": [
"<string>"
],
"pep_extended": {
"screened": true,
"pep_exposure": true,
"match_count": 1,
"retrieved_at": "<string>",
"matches": [
{
"caption": "<string>",
"schema_type": "<string>",
"topics": [
"<string>"
],
"score": 0.5,
"datasets": [
"<string>"
],
"countries": [
"<string>"
],
"birth_date": "<string>"
}
],
"truncated": false
},
"processing_time_ms": 1,
"quality": "deep",
"adverse_media": {
"screened": true,
"adverse_media_found": true,
"match_count": 1,
"retrieved_at": "<string>",
"category_hits": {},
"articles": [
{
"headline": "<string>",
"source_link": "<string>",
"category": "<string>",
"published_at": "<string>",
"language": "<string>",
"snippet": "<string>"
}
],
"truncated": false
},
"insolvency_records": {
"screened": true,
"applicable": true,
"found": true,
"truncated": true,
"retrieved_at": "<string>",
"jurisdiction": "NL",
"query_by": "<string>",
"match_count": 1,
"records": [
{
"publication_id": "<string>",
"insolvency_number": "<string>",
"court": "<string>",
"subject_type": "<string>",
"latest_publication": {
"code": "<string>",
"description": "<string>",
"date": "<string>"
}
}
]
},
"credit_report": {
"screened": true,
"risk_score": "<string>",
"risk_band_available": true,
"provider": "<string>",
"country": "<string>",
"retrieved_at": "<string>",
"organization_name": "<string>",
"identifier_type": "<string>"
},
"disclaimers": [
"<string>"
],
"sandbox": false,
"version": "1.0"
}{
"title": "<string>",
"status": 123,
"type": "about:blank",
"detail": "<string>",
"instance": "<string>"
}{
"title": "<string>",
"status": 123,
"type": "about:blank",
"detail": "<string>",
"instance": "<string>"
}Entity Deep Check
Deep check: extended PEP/RCA exposure screening (#396), the Dutch insolvency register on every tier (#403), adverse media on the extended tier (#402).
pep_extended is the source the base check does not return. /v1/entity/check
queries the same OpenSanctions collection but filters to sanctions/enforcement
datasets and reduces the answer to a boolean (app/services/sanctions.py); the
role.pep/role.rca detail is fetched and discarded. This endpoint keeps it.
insolvency_records is the Centraal Insolventieregister (NL only; for any other
country the field says applicable: false). It is queried by kvk_number when
the body carries one (exact), else by entity_name (trade-name search).
Two tiers, resolved from X-Response-Quality by the x402 middleware:
fresh (default; the deep tier, 0.75)returnspepextendedandinsolvencyrecords;‘enhanced‘(the‘extended‘tier,1.50) adds
adverse_media from dilisense. There is no cache-only branch, so cached is
quoted, charged and served as fresh. If a source of the requested tier cannot
be reached the answer is a 503 (pep_source_unavailable,
insolvency_source_unavailable or adverse_media_source_unavailable), never
a fabricated clean screen, and the x402 gate settles only on a 2xx so the call
is not charged.
curl --request POST \
--url https://api.limitguard.ai/v1/entity/deep-check \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"entity_name": "<string>",
"country": "<string>",
"kvk_number": "<string>"
}
'import requests
url = "https://api.limitguard.ai/v1/entity/deep-check"
payload = {
"entity_name": "<string>",
"country": "<string>",
"kvk_number": "<string>"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({entity_name: '<string>', country: '<string>', kvk_number: '<string>'})
};
fetch('https://api.limitguard.ai/v1/entity/deep-check', 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://api.limitguard.ai/v1/entity/deep-check",
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([
'entity_name' => '<string>',
'country' => '<string>',
'kvk_number' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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://api.limitguard.ai/v1/entity/deep-check"
payload := strings.NewReader("{\n \"entity_name\": \"<string>\",\n \"country\": \"<string>\",\n \"kvk_number\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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://api.limitguard.ai/v1/entity/deep-check")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"entity_name\": \"<string>\",\n \"country\": \"<string>\",\n \"kvk_number\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.limitguard.ai/v1/entity/deep-check")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"entity_name\": \"<string>\",\n \"country\": \"<string>\",\n \"kvk_number\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"entity_name": "<string>",
"country": "<string>",
"sources_returned": [
"<string>"
],
"pep_extended": {
"screened": true,
"pep_exposure": true,
"match_count": 1,
"retrieved_at": "<string>",
"matches": [
{
"caption": "<string>",
"schema_type": "<string>",
"topics": [
"<string>"
],
"score": 0.5,
"datasets": [
"<string>"
],
"countries": [
"<string>"
],
"birth_date": "<string>"
}
],
"truncated": false
},
"processing_time_ms": 1,
"quality": "deep",
"adverse_media": {
"screened": true,
"adverse_media_found": true,
"match_count": 1,
"retrieved_at": "<string>",
"category_hits": {},
"articles": [
{
"headline": "<string>",
"source_link": "<string>",
"category": "<string>",
"published_at": "<string>",
"language": "<string>",
"snippet": "<string>"
}
],
"truncated": false
},
"insolvency_records": {
"screened": true,
"applicable": true,
"found": true,
"truncated": true,
"retrieved_at": "<string>",
"jurisdiction": "NL",
"query_by": "<string>",
"match_count": 1,
"records": [
{
"publication_id": "<string>",
"insolvency_number": "<string>",
"court": "<string>",
"subject_type": "<string>",
"latest_publication": {
"code": "<string>",
"description": "<string>",
"date": "<string>"
}
}
]
},
"credit_report": {
"screened": true,
"risk_score": "<string>",
"risk_band_available": true,
"provider": "<string>",
"country": "<string>",
"retrieved_at": "<string>",
"organization_name": "<string>",
"identifier_type": "<string>"
},
"disclaimers": [
"<string>"
],
"sandbox": false,
"version": "1.0"
}{
"title": "<string>",
"status": 123,
"type": "about:blank",
"detail": "<string>",
"instance": "<string>"
}{
"title": "<string>",
"status": 123,
"type": "about:blank",
"detail": "<string>",
"instance": "<string>"
}Authorizations
Body
Request for POST /v1/entity/deep-check (#396, #403).
Takes entity fields rather than an entity_id from a prior check: the audit
trail is keyed by sha256(entity_name) and is one-way, so an id could not be
resolved back to the name the screens have to query. kvk_number is optional
and only consulted by the insolvency source (#403): the Centraal
Insolventieregister keys searchUndertaking on the KvK number, which is an
exact lookup where a trade-name search is a fuzzy one.
Response
Successful Response
Response from /v1/entity/deep-check (#396, #402, #403).
sources_returned is built from payment.DEEP_CHECK_TIER_ADDS[tier] -- the same
table enhanced_check_hint advertises -- so what was promised and what was delivered
are one value. A name may only join that table together with the field that fills
it on that tier.
Sources actually run; equals EnhancedCheckHint.adds
Result of the pep_extended source. screened is never False on a 200.
There is no code path that returns this model without having queried OpenSanctions: app/services/pep.py raises rather than fabricating a clean screen, and the router turns that into a 503 so the payment is never settled (#284, #396).
Show child attributes
Show child attributes
x >= 0deep (fresh) or extended (enhanced); see DEEP_CHECK_TIER_NAMES
Populated only on a tier whose adds include adverse_media. None means the tier did not include it -- never that a screen ran and found nothing.
Show child attributes
Show child attributes
Dutch Centraal Insolventieregister screen; on every tier since #403. applicable: false (never null) when country is not NL.
Show child attributes
Show child attributes
Populated only on a tier whose adds include credit_report, and only for a country with a registered provider. None means the tier did not include it -- never that a screen ran and found no credit risk.
Show child attributes
Show child attributes