Counterparty Check API: KYB checklist from official registers
On Apify StoreCan I do business with this company? One call checks a supplier, customer or partner against official sources and returns a checklist: pass, fail, review or unverified per check, each with its source link and time. Built for AI agents doing KYB, vendor onboarding or "may I pay this party?" checks, and for people who want a fast, sourced first screen. To screen a vendor list, pass up to 10 companies in companies: one checklist per company, same price each.
Pricing (pay per event): $0.05 per company checked, on Apify and on the HTTP API, MCP and x402. An ambiguous name returns the candidates to pick from and costs nothing; so does a company no source knows.
How it compares with a model that uses web search, on 25 companies: benchmark.
Where to get it
The same data and the same rows on every channel; pick the one your agent or code already uses.
| Channel | How | Pay |
|---|---|---|
| Apify Store | apify.com/bosco_labs/counterparty-check: run it in the Apify Console, by the Apify API or from Apify's MCP server (https://mcp.apify.com?tools=bosco_labs/counterparty-check) | $0.05 per company checked, billed to your Apify account |
| HTTP API | POST https://api.boscolabs.dev/v1/counterparty-check with your key (get a key, $5.00 free trial) | $0.05 per company checked; an ambiguous name (candidates) is free, prepaid credits |
| MCP | https://api.boscolabs.dev/mcp (remote, same key) or https://api.boscolabs.dev/mcp/free (no key: find and plan) · setup | $0.05 per company checked; an ambiguous name (candidates) is free, prepaid credits |
| x402 | POST https://api.boscolabs.dev/v1/counterparty-check without a key: pay per call, no account (how) | $0.05 per company checked; an ambiguous name (candidates) is free, in USDC on Base |
Questions agents ask
Example
Input
{ "query": "24256790", "country": "DK", "vatNumber": "DK24256790", "iban": "DK5000400440116243" }Output
{
"schema_version": "1",
"query": "24256790",
"status": "checked",
"company": {
"legal_name": "NOVO NORDISK A/S",
"country": "DK",
"registration_number": "24256790",
"register": "Erhvervsstyrelsen (CVR)",
"lei": "549300DAQ1CVT6CXN342",
"lei_status": "ISSUED",
"status": "active",
"legal_form": "Aktieselskab",
"registered_address": "Novo Alle 1, 2880 Bagsværd, DK"
},
"checks": [
{
"check": "register_status",
"status": "pass",
"detail": "Register status: active.",
"source": "GLEIF",
"source_url": "https://api.gleif.org/api/v1/lei-records/549300DAQ1CVT6CXN342",
"checked_at": "2026-11-08T04:12:24+00:00"
},
{
"check": "lei_status",
"status": "pass",
"detail": "LEI 549300DAQ1CVT6CXN342 is ISSUED.",
"source": "GLEIF",
"source_url": "https://search.gleif.org/#/record/549300DAQ1CVT6CXN342",
"checked_at": "2026-11-08T04:12:24+00:00"
},
{
"check": "insolvency",
"status": "unverified",
"detail": "Insolvency covers the UK, Poland, France, Germany and the Netherlands (insolvency registers) and Norway, Finland and Estonia (register status).",
"source": null,
"source_url": null,
"checked_at": "2026-11-08T04:12:24+00:00"
},
{
"check": "accounts_recent",
"status": "pass",
"detail": "Newest annual accounts: year ending 2025-12-31 (11 months ago).",
"source": "filings.xbrl.org",
"source_url": "https://filings.xbrl.org/549300DAQ1CVT6CXN342/2025-12-31/ESEF/DK/0/NOVO-2025-12-31-1-en.json",
"checked_at": "2026-11-08T04:12:24+00:00"
},
{
"check": "sanctions_entity",
"status": "pass",
"detail": "No match. Checked: OFAC Consolidated (non-SDN) List 2026-11-04, UN Security Council Consolidated List 2026-11-08, UK Sanctions List 2026-11-03, EU Consolidated Financial Sanctions List 2026-10-23, US Consolidated Screening List (Commerce, State) 2026-11-08, OFAC SDN List 2026-11-06.",
"source": "OFAC, UN, UK, EU and US export lists",
"source_url": null,
"checked_at": "2026-11-08T04:12:24+00:00"
},
{
"check": "sanctions_people",
"status": "unverified",
"detail": "No officer or owner names known (UK and Polish registers list them; Polish names are masked).",
"source": null,
"source_url": null,
"checked_at": "2026-11-08T04:12:24+00:00"
},
{
"check": "vat_number",
"status": "unverified",
"detail": "VIES is not answering (SERVICE_UNAVAILABLE); try again later",
"source": "VIES (European Commission), answered by the national tax administration",
"source_url": "https://ec.europa.eu/taxation_customs/vies/#/vat-validation",
"checked_at": "2026-11-08T04:12:24+00:00"
},
{
"check": "iban",
"status": "pass",
"detail": "DK5000400440116243: structure and check digits valid. Bank code 0040; no bank was contacted.",
"source": "ISO 13616 check digits (mod 97) and the SWIFT IBAN Registry formats",
"source_url": "https://www.swift.com/standards/data-standards/iban-international-bank-account-number",
"checked_at": "2026-11-08T04:12:24+00:00"
},
{
"check": "iban_country_match",
"status": "pass",
"detail": "expected DK, number is DK",
"source": "ISO 13616 check digits (mod 97) and the SWIFT IBAN Registry formats",
"source_url": "https://www.swift.com/standards/data-standards/iban-international-bank-account-number",
"checked_at": "2026-11-08T04:12:24+00:00"
}
],
"summary": {
"pass": 6,
"fail": 0,
"review": 0,
"unverified": 3,
"needs_attention": [],
"unverified_checks": [
"insolvency",
"sanctions_people",
"vat_number"
]
},
"notice": "Screening aid built from official sources, not a compliance, credit or legal determination. 'unverified' means not checked, never 'safe'. Review every 'fail' and 'review' against the linked source before acting.",
"latest_financials": {
"basis": "Consolidated annual report of a listed company (ESEF, IFRS figures).",
"source": "filings.xbrl.org",
"period_end": "2025-12-31",
"currency": "DKK",
"revenue": 309064000000,
"net_income": 102434000000,
"total_assets": 542902000000,
"source_url": "https://filings.xbrl.org/549300DAQ1CVT6CXN342/2025-12-31/ESEF/DK/0/NOVO-2025-12-31-1-en.json"
},
"sanctions": {
"entity": {
"query": "NOVO NORDISK A/S",
"match_found": false,
"best_score": null,
"complete": true,
"summary": "No match >= 85 for 'NOVO NORDISK A/S'. Checked: OFAC Consolidated (non-SDN) List 2026-11-04, UN Security Council Consolidated List 2026-11-08, UK Sanctions List 2026-11-03, EU Consolidated Financial Sanctions List 2026-10-23, US Consolidated Screening List (Commerce, State) 2026-11-08, OFAC SDN List 2026-11-06."
},
"people_with_matches": [],
"people_screened": 0
},
"vat": {
"number": "DK24256790",
"status": "unverified",
"valid": null,
"registered_name": null,
"name_match": null,
"country_match": null,
"source_url": "https://ec.europa.eu/taxation_customs/vies/#/vat-validation"
},
"iban": {
"number": "DK5000400440116243",
"status": "pass",
"valid": true,
"bank_code": "0040",
"country_match": true,
"source": "ISO 13616 check digits (mod 97) and the SWIFT IBAN Registry formats"
},
"wallets": [],
"warnings": [
"EU Consolidated Financial Sanctions List: download failed (HTTP 500); used the copy fetched 2026-11-07T01:57 UTC (list dated 2026-10-23)."
],
"source_url": "https://api.gleif.org/api/v1/lei-records/549300DAQ1CVT6CXN342",
"retrieved_at": "2026-11-08T04:12:24+00:00",
"duration_seconds": 28.5
}What you get
| Field | Type | Meaning |
|---|---|---|
query | string | The input as given. |
status | string | checked, or ambiguous (candidates returned, nothing charged). |
company | object | null | Identity from the register and GLEIF, with a source URL per value. |
checks | array | The checklist: check, status (pass, fail, review, unverified), detail, source, source_url, checked_at. |
summary | object | Counts per status, needs_attention (fail and review checks) and unverified_checks. |
notice | string | Screening aid, not a compliance, credit or legal determination. |
latest_financials | object | null | Newest fiscal year's key figures with basis and source. |
people | object | null | UK officers and PSCs, or Polish board, proxies and shareholders. |
insolvency | object | null | UK Gazette notices or Polish KRS proceedings. |
us_listing | object | null | SEC registrant data when the company files with the SEC. |
sanctions | object | entity (the company's screening row; identifier_matches: listings that carry the company's own registration number or LEI), people_with_matches, people_screened. |
vat | object | null | VIES result for the VAT number. |
iban | object | null | IBAN structure and country result. |
wallets | array | Wallet address screening rows. |
candidates | array | Only when status is ambiguous: companies that fit the name. |
warnings | array | Sources that failed or were partly read. |
source_url | string | null | The main identity source. |
retrieved_at | string | When the check ran (UTC). |
Use with AI agents (MCP)
Add this URL to your MCP client (Claude, Cursor, VS Code, ...) to load the Actor as a tool through the Apify hosted MCP server. It signs you in with OAuth or accepts Authorization: Bearer <APIFY_TOKEN>.
https://mcp.apify.com?tools=bosco_labs/counterparty-check
For “Before we pay them: check supplier Novo Nordisk A/S (CVR 24256790), their VAT number DK24256790 and IBAN DK5000400440116243.” the agent passes:
{"query": "24256790", "country": "DK", "vatNumber": "DK24256790", "iban": "DK5000400440116243"}
one row (typically 10-20 KB) with stable snake_case fields; read summary.needs_attention and checks first. Usually 5-30 seconds (VIES and UK officer lookups are the slow parts). Cost: $0.05 per company checked, billed to the Apify account the MCP server is signed in with.
Or call the Apify API: POST https://api.apify.com/v2/acts/bosco_labs~counterparty-check/run-sync-get-dataset-items with the input as JSON body. Cost: $0.05 per company checked.
HTTP API
Also on the Bosco Labs HTTP API (beta): same input and same rows as the Actor, $0.05 per company checked; an ambiguous name (candidates) is free from prepaid credits (max 10 companies (companies) per call). Get a key with a $5.00 free trial; see prices and limits.
curl https://api.boscolabs.dev/v1/counterparty-check \
-H "Authorization: Bearer $BOSCO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "24256790", "country": "DK", "vatNumber": "DK24256790", "iban": "DK5000400440116243"}'
Input fields
| Field | Type | Meaning |
|---|---|---|
query | string | The counterparty to check: a name (e.g. "Novo Nordisk") or an identifier: LEI (20 characters, e.g. "724500Y6DUVHQD6OXN27"), UK company number ("00445790", "SC123456"), Danish CVR ("24256790"), Norwegian org number ("923609016"), French SIREN (9 digits, "552032534") or SIRET (14 digits, "55203253400703"), Finnish Business ID with its dash ("0112038-9"), Estonian registry code (8 digits, "12417834"), US ticker in capitals or with $ ("AAPL", "$brk.b"; foreign companies listed in the US resolve to their home country), SEC CIK ("320193"). The type is detected from format and check digits; an 8-digit number valid in several registers (UK, Danish CVR, Estonian) is settled by asking them, and country decides when given. Required, unless you give a companies list instead. |
country | string | ISO 3166 alpha-2 country code to disambiguate, e.g. "DK", "GB", "NO", "FR", "FI", "EE", "NL", "US". With a name it limits the search to that country and, for NO, FR, FI and EE, also searches the national register (most companies there have no LEI); with a number it says which register the number belongs to (e.g. "GB" for a UK number without a leading zero, "EE" for an Estonian registry code, "FI" for a Business ID typed without its dash). Empty = detect from the query. |
vatNumber | string | The VAT number the counterparty gave you, with its country prefix, e.g. "DK24256790". Checked live in VIES (valid or not, registered name) and matched against the register's name and country. Empty = the VAT number the register lists, if any (Estonia, Poland); otherwise the VAT check is unverified. |
iban | string | The bank account the counterparty wants to be paid on, e.g. "DK5000400440116243". Checked offline: length, layout and ISO 13616 check digits, bank code, and whether its country matches the company's. No bank is contacted, so it does not prove who holds the account. |
walletAddresses | array | Wallet addresses the counterparty wants to be paid on, e.g. ["0x7FF9cFad3877F21d41Da833E2F775dB0569eE3D9"]. Each is matched exactly against the addresses OFAC lists. At most 10. |
companies | array | Check a list of companies in one run instead of query: up to 10 companies, each a name or number ("Tesco PLC") or an object with the fields above, e.g. ["Tesco PLC", {"query": "Novo Nordisk A/S", "country": "DK", "vatNumber": "DK24256790"}, {"query": "00445790", "country": "GB"}]. One row per company, priced like a single check ($0.05 per company checked); an ambiguous name, or a company no source knows or that does not answer in time, is a row that costs nothing. Leave query empty when you use this. |
Sources, licence and limits
Is this a compliance decision? No. It is a screening aid built from official sources. Fuzzy name matching gives false positives (namesakes) and can miss a name written another way. Review every fail and review against the linked source, and use your own judgement or counsel for decisions.
Why is a check unverified? The source does not cover that country (see the coverage table), the source did not answer in time, or the input to check is missing (no VAT number). The detail says which.
Does the IBAN check prove who holds the account? No. It checks that the number is well formed and in the expected country; no bank is contacted.
How fresh is it? Registers, GLEIF and VIES are read live. Sanctions lists are at most about an hour old (each list's own date is in the detail). UK insolvency notices come from a nightly copy of The Gazette.
Personal data? Officer and owner names come from the public registers and are screened only against sanctions lists, for this check. Nothing about the people is stored. See LEGAL.md.