ブログに戻る
エンジニアリング

不正検出パイプラインの構築

Josselin Liebe
Josselin Liebe

単一の疑わしいシグナルだけでは全体像を伝えることはほとんどありません。メール自体は問題なく見えるかもしれませんが、データセンターIPと新規登録ドメインと組み合わさると、状況が急変します。複数のVeille APIをパイプラインに組み合わせると、すべてのサインアップに対する複合リスクビューが得られます。

アーキテクチャの概要

最もシンプルな形では:メールを検証し(/v1/intelligence/email)、ドメイン年齢を確認し(/v1/intelligence/domain)、IPをスコアリングします(/v1/intelligence/ip)。3回の呼び出し、3つのシグナル、1つの複合スコアです。

クイック統合

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

推奨ウェイト

シグナル ウェイト 理由
メールリスクスコア 40% 使い捨て/ロールアカウントは最も強力な不正指標です
ドメイン年齢リスク 35% 新規登録ドメインは不正と強く相関します
IP脅威スコア 25% VPNはプライバシー意識の高い正当なユーザーも使用します

5つのユースケース

  1. ユーザー登録 - サインアップ時に複合スコアを計算し、閾値を超えた場合は自動拒否します。
  2. チェックアウト検証 - 支払い処理前にパイプラインを実行して合成IDを検出します。
  3. マーケットプレイス出品者のオンボーディング - メール、ドメイン、IPシグナルを組み合わせて新規販売者をスクリーニングします。
  4. コンテンツモデレーション - 高リスクアカウントからの投稿のレビューを優先します。
  5. Webセキュリティ - 受信Webhookの元のIPとドメインを処理前に検証します。

関連記事