# Recette 2. KYC pour une ouverture de compte : formulaire de demande + pièce d'identité + votre propre contrôle de doublon.
import os
import requests
BASE = "https://app.sahlfinancial.com/api"
HEADERS = {"Authorization": f"Bearer {os.environ['SAHL_API_KEY']}"}
REFERENCE = "acct-0001"
form = { # ce que le client a saisi dans votre formulaire
"first_name": "Test", "last_name": "Client", "date_of_birth": "1988-04-12", "citizenship": "MA",
"street1": "10 Rue Exemple", "city": "Casablanca", "province": "Casablanca-Settat", "postal_code": "20000", "country": "MA",
"phone": "+212600000000", "email": "test.client@example.com",
"occupation": "Analyst", "employer_name": "Test Employer SARL", "annual_income": "84000",
"net_liquid_assets": "20000", "total_net_worth": "60000", "source_of_funds": "Employment income",
"objective": "Balanced", "horizon": "5-10 years", "investment_knowledge": "Good", "investment_experience": "< 5 years",
"account_type": "Individual", "third_party": "no", "pep": "no",
}
def is_duplicate_in_my_database(values): # votre propre recherche
return False
with open("cin-test.jpg", "rb") as f:
res = requests.post(
f"{BASE}/v1/kyc/extract", headers=HEADERS, timeout=120,
files=[("files", ("cin-test.jpg", f, "image/jpeg"))],
data={"doc_type": "national_id", "step_key": "photo_id", "reference": REFERENCE,
"environment": "sandbox", "kind": "individual"},
)
res.raise_for_status()
id_read = res.json()
if id_read["reader_unavailable"]:
raise SystemExit("The ID was not read. Retry later.")
# La pièce d'identité lue fait foi pour les champs d'identité.
identity_keys = ["first_name", "last_name", "date_of_birth", "id_type", "id_number", "id_expiry"]
values = {**form, **{k: id_read["fields"][k] for k in identity_keys if id_read["fields"].get(k)}}
duplicate = is_duplicate_in_my_database(values)
res = requests.post(
f"{BASE}/v1/kyc/verify", headers=HEADERS, timeout=60,
json={
"reference": REFERENCE, "environment": "sandbox",
"subject": f"{values['first_name']} {values['last_name']}", "kind": "individual",
"values": values,
"documents": id_read["documents"],
"extra_checks": [{
"id": "internal:duplicate_client", "label": "No duplicate client in our database",
"severity": "critical", "passed": not duplicate,
"detail": "matches an existing client" if duplicate else "",
}],
},
)
res.raise_for_status()
verdict = res.json()
print("passed:", verdict["passed"], "| completeness:", f"{verdict['completeness']['percent']}%")
print("critical:", [c["id"] for c in verdict["critical_failures"]])
print("flags:", [c["id"] for c in verdict["flags"]])
print("refused switches:", verdict["policy"]["overrides_refused"])
print("store case_id:", verdict["case_id"])