Volver al blog
Ingenieria

Construir un pipeline de deteccion de fraude

Josselin Liebe
Josselin Liebe

Una sola senal sospechosa rara vez cuenta toda la historia. Un email puede parecer normal por si solo, pero combinado con una IP de datacenter y un dominio recien registrado, el panorama cambia rapido. Combinar varias APIs de Veille en un pipeline ofrece una vista compuesta del riesgo de cada registro.

Vista general de la arquitectura

El principio es simple: validar el email (/v1/intelligence/email), comprobar la antiguedad del dominio (/v1/intelligence/domain) y puntuar la IP (/v1/intelligence/ip). Tres llamadas, tres senales, un score compuesto.

Integracion rapida

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,
  };
}

Ponderaciones recomendadas

Senal Peso Por que
Puntuacion de riesgo del email 40 % Los emails desechables y de rol son el indicador de fraude mas fiable
Riesgo por antiguedad del dominio 35 % Los dominios recien registrados estan fuertemente correlacionados con el fraude
Puntuacion de amenaza IP 25 % Las VPN tambien son usadas por usuarios legitimos preocupados por su privacidad

5 casos de uso

  1. Registro de usuario : calcular una puntuacion compuesta en el registro y rechazar automaticamente por encima de un umbral.
  2. Verificacion en el checkout : ejecutar el pipeline antes de procesar un pago para detectar identidades sinteticas.
  3. Onboarding de vendedores en marketplace : filtrar nuevos comerciantes combinando senales de email, dominio e IP.
  4. Moderacion de contenido : priorizar la revision de publicaciones de cuentas de alto riesgo.
  5. Seguridad de webhooks : validar la IP y el dominio de origen de los webhooks entrantes antes de procesarlos.