Build a KYC Workflow for European Businesses with One API
What KYC means for B2B platforms
Know Your Customer (KYC) in a B2B context means verifying that a business is real, active, and who they claim to be. For European businesses, this involves checking:
- Company identity: does this SIRET/SIREN exist? Is the company active?
- Tax status: is the VAT number valid? Is the company VAT-registered?
- Banking details: is the IBAN valid? Which bank? Is it SEPA-compatible?
Most platforms do this manually or with multiple services. The European Business API combines all three checks in one place.
The three-step verification
Step 1: Verify the company (SIRET)
For French businesses, validate the SIRET and retrieve company details:
import httpx
API_KEY = "your_api_key"
HEADERS = {"X-API-Key": API_KEY}
def verify_company(siret: str) -> dict:
r = httpx.get(
f"https://frenchbusinessapi.com/sirene/siret/{siret}",
headers=HEADERS
)
if r.status_code != 200:
return {"valid": False, "reason": "SIRET not found"}
data = r.json()
if not data.get("actif"):
return {"valid": False, "reason": "Company is inactive/closed"}
return {
"valid": True,
"name": data["denomination"],
"address": f"{data['adresse_ligne1']}, {data['code_postal']} {data['ville']}",
"naf": data["code_naf"],
"activity": data["libelle_naf"],
}
This immediately tells you if the company exists, is active, and what they do. See our SIRET lookup guide for more details.
Step 2: Validate VAT number
For intra-EU transactions, validate the VAT number via VIES:
def verify_vat(vat_number: str) -> dict:
r = httpx.get(
f"https://frenchbusinessapi.com/vat/validate/{vat_number}",
headers=HEADERS
)
data = r.json()
return {
"valid": data["valid"],
"vies_checked": data["vies_available"],
"company_name": data.get("company_name"),
"country": data["country_code"],
}
A valid VAT number confirms the business is VAT-registered and gives you their official name and address from VIES. See our VAT validation guide.
Step 3: Verify IBAN
Before setting up payment, validate the customer's bank details:
def verify_iban(iban: str) -> dict:
r = httpx.get(
f"https://frenchbusinessapi.com/iban/validate/{iban}",
headers=HEADERS
)
data = r.json()
return {
"valid": data["valid"],
"bank": data.get("bank_name"),
"bic": data.get("bic"),
"sepa": data.get("sepa_member"),
}
A valid IBAN with SEPA membership means you can process payments via SEPA credit transfer or direct debit. See our IBAN validation guide.
Putting it all together
A complete onboarding verification function:
def onboard_customer(siret: str, vat_number: str, iban: str) -> dict:
results = {
"company": verify_company(siret),
"vat": verify_vat(vat_number),
"iban": verify_iban(iban),
}
# Cross-check: company name from SIRET should match VIES
all_valid = all([
results["company"]["valid"],
results["vat"]["valid"],
results["iban"]["valid"],
])
results["status"] = "approved" if all_valid else "review_required"
return results
# Usage
result = onboard_customer(
siret="35600000000048",
vat_number="FR73356000000",
iban="FR7630006000011234567890189"
)
print(result["status"])
Three API calls, one status. The entire verification takes under 2 seconds.
Red flags to watch for
- SIRET active but VAT number invalid: the company exists but isn't VAT-registered. Could be a dormant entity.
- Company name mismatch: the name from SIRET doesn't match the name from VIES. Possible identity issue.
- IBAN in a different country than the company: a French company with a Romanian IBAN is unusual (not necessarily fraudulent, but worth flagging).
- SIRET recently created: a company created days ago trying to place a large order deserves extra scrutiny.
Automating the flow
For high-volume onboarding (marketplace sellers, supplier registration), wrap the verification in an async pipeline:
import asyncio
async def verify_batch(customers: list[dict]) -> list[dict]:
results = []
for c in customers:
result = onboard_customer(c["siret"], c["vat"], c["iban"])
results.append({"customer": c["name"], **result})
await asyncio.sleep(0.1) # Respect rate limits
return results
Beyond France
The VAT and IBAN endpoints cover all EU countries. For company lookup outside France, you'll need country-specific registries. But VAT + IBAN verification works across the entire EU with the same API calls.
Next steps
- Get your free API key, 100 requests/day
- API documentation
- Related: Business days calculator, Currency conversion
Ready to build for Europe?
One API for company lookup, VAT validation, IBAN verification, SEPA payments, and more.
Get your API key