Retour au blog
Engineering

Construire un pipeline de détection de fraude

Josselin Liebe
Josselin Liebe

Un signal suspect isolé raconte rarement toute l'histoire. Un email peut sembler normal seul, mais associé à une IP de datacenter et un domaine fraichement enregistré, le tableau change vite. Combiner plusieurs APIs Veille dans un pipeline offre une vue composite du risque pour chaque inscription.

Vue d'ensemble de l'architecture

Le principe est simple : valider l'email (/v1/intelligence/email), vérifier l'âge du domaine (/v1/intelligence/domain) et scorer l'IP (/v1/intelligence/ip). Trois appels, trois signaux, un score composite.

Intégration rapide

Python

import requests

API_KEY = "YOUR_API_KEY"
BASE_URL = "https://api.veille.io/v1"


def score_signup(email: str, ip: str) -> dict:
    headers = {"x-api-key": API_KEY}

    email_data = requests.get(
        f"{BASE_URL}/intelligence/email", params={"query": email}, headers=headers
    ).json()

    domain_data = requests.get(
        f"{BASE_URL}/intelligence/domain", params={"query": email_data["domain"]}, headers=headers
    ).json()

    ip_data = requests.get(
        f"{BASE_URL}/intelligence/ip", params={"query": ip}, headers=headers
    ).json()

    age = min(domain_data.get("domain_age_days", 365), 365)
    domain_risk = ((365 - age) / 365) * 100

    composite = (
        email_data["risk_score"] * 0.40
        + domain_risk * 0.35
        + ip_data["threat_score"] * 0.25
    )

    return {
        "composite_score": round(composite),
        "disposable_email": email_data["disposable"],
        "vpn_or_proxy": ip_data["is_vpn"] or ip_data["is_proxy"],
        "domain_age_days": domain_data.get("domain_age_days"),
    }

TypeScript

const API_KEY = "YOUR_API_KEY";
const BASE_URL = "https://api.veille.io/v1";
const headers = { "x-api-key": API_KEY };

async function scoreSignup(email: string, ip: string) {
  const [emailResponse, ipResponse] = await Promise.all([
    fetch(`${BASE_URL}/intelligence/email?query=${email}`, { headers }),
    fetch(`${BASE_URL}/intelligence/ip?query=${ip}`, { headers }),
  ]);
  const [emailData, ipData] = await Promise.all([
    emailResponse.json(),
    ipResponse.json(),
  ]);

  const domainResponse = await fetch(
    `${BASE_URL}/intelligence/domain?query=${emailData.domain}`,
    { headers }
  );
  const domainData = await domainResponse.json();

  const age = Math.min(domainData.domain_age_days ?? 365, 365);
  const domainRisk = ((365 - age) / 365) * 100;

  return {
    compositeScore: Math.round(
      emailData.risk_score * 0.4 + domainRisk * 0.35 + ipData.threat_score * 0.25
    ),
    disposableEmail: emailData.disposable,
    vpnOrProxy: ipData.is_vpn || ipData.is_proxy,
    domainAgeDays: domainData.domain_age_days,
  };
}

Pondérations recommandées

Signal Poids Pourquoi
Score de risque email 40 % Les emails jetables et de rôle sont l'indicateur de fraude le plus fiable
Risque lié à l'âge du domaine 35 % Les domaines récemment enregistrés sont fortement corrélés à la fraude
Score de menace IP 25 % Les VPN sont aussi utilisés par des utilisateurs légitimes soucieux de leur vie privée

5 cas d'utilisation

  1. Inscription utilisateur - calculer un score composite à l'inscription et rejeter automatiquement au-dessus d'un seuil.
  2. Vérification au checkout - exécuter le pipeline avant de traiter un paiement pour détecter les identités synthétiques.
  3. Onboarding de vendeurs marketplace - filtrer les nouveaux marchands en combinant les signaux email, domaine et IP.
  4. Modération de contenu - prioriser la revue des publications provenant de comptes à haut risque.
  5. Sécurité des webhooks - valider l'IP et le domaine d'origine des webhooks entrants avant de les traiter.