Fraud rules engine для B2B 2026: velocity rules, BIN scoring, device fingerprinting
B2B-фрод в цифровых товарах отличается от B2C: меньше количество транзакций, но средний чек $200–2000, и chargeback означает потерю не только продукта, но и interchange fee. Эта статья — план построения fraud-rules-движка в вашей системе, который ловит 70%+ fraud с false-positive < 0.5%.
1. Velocity rules — фундамент
Velocity = частота действий на единицу времени. Базовый набор:
type FraudSignal = { rule: string; score: number; reason: string };
async function checkVelocity(order: Order): Promise<FraudSignal[]> {
const signals: FraudSignal[] = [];
const ipCount = await redis.zcount(`vel:ip:${order.ip}`, Date.now() - 600_000, '+inf');
if (ipCount > 5) signals.push({ rule: 'ip_velocity', score: 80, reason: '>5 orders/10min' });
const cards = await redis.scard(`vel:cards:${order.userId}:24h`);
if (cards > 3) signals.push({ rule: 'multi_card', score: 60, reason: '>3 cards/24h' });
return signals;
}
Хранение — Redis sorted sets с TTL = window. Запись: ZADD vel:ip:1.2.3.4 NOW order_id + EXPIRE 600.
2. BIN risk scoring
Первые 6–8 цифр номера карты (BIN) идентифицируют issuing bank. Большинство fraud-vendor предоставляют BIN-таблицу с risk-score:
const binRisk = await binLookup(card.bin); // 0..100
if (binRisk > 70) flags.push({ rule: 'high_risk_bin', score: 50, reason: `BIN ${card.bin}` });
if (binRisk === 100) return reject('blocked_bin'); // prepaid mass-issuance cards
Высокорискованные BIN — prepaid cards (особенно mass-issuance non-bank), карты из санкционных юрисдикций, BIN-серии, замеченные в недавних fraud-кампаниях. Обновляйте таблицу еженедельно.
3. Device fingerprinting
Cookie-less fingerprint (fpjs, ClientJS):
import FingerprintJS from '@fingerprintjs/fingerprintjs-pro';
const fp = await FingerprintJS.load({ apiKey: process.env.FPJS_KEY });
const result = await fp.get();
// result.visitorId — стабильный hash, ~99% accuracy
const fpHistory = await db.fingerprints.find({ visitorId: result.visitorId });
if (fpHistory.chargebackCount > 0) flag.score += 90;
Это даёт привязку «один реальный девайс — много аккаунтов» — ловит mass-account-creation fraud.
4. Интеграция с FoxReload: проверка статуса заказа
При построении своего fraud-pipeline важно правильно интегрировать FoxReload. Поскольку FoxReload не поддерживает вебхуки, статус выполнения заказа получается опросом:
async function createAndCheckOrder(items: OrderItem[]): Promise<Order> {
// Проверка fraud-сигналов до создания заказа
const signals = await checkFraud(currentRequest);
if (signals.totalScore > 80) throw new Error('fraud_blocked');
// Создание заказа через FoxReload API
const resp = await fetch('https://public-api.foxreload.com/api/orders', {
method: 'POST',
headers: {
'X-API-Key': process.env.FOXRELOAD_KEY!,
'Content-Type': 'application/json',
},
body: JSON.stringify({ items, isMock: false }),
});
const order = await resp.json();
// Опрос статуса — webhooks не поддерживаются
return pollUntilDone(order.id);
}
async function pollUntilDone(orderId: string): Promise<Order> {
for (let i = 0; i < 20; i++) {
await sleep(Math.min(1000 * Math.pow(2, i), 15000));
const r = await fetch(`https://public-api.foxreload.com/api/orders/${orderId}`, {
headers: { 'X-API-Key': process.env.FOXRELOAD_KEY! },
});
const o = await r.json();
if (['completed', 'cancelled', 'failed'].includes(o.status)) return o;
}
throw new Error('poll timeout');
}
5. Сравнение: Sift, Sumsub, in-house
| Provider | Type | Cost/transaction | Setup | Accuracy |
|---|---|---|---|---|
| In-house JSON rules | Rules | $0 | 1–2 weeks | 60–70% |
| Sift | ML-as-service | $0.04 | 1 day | 85–92% |
| Sumsub | KYC + fraud | $0.50–1.50 | 3 days | 80–88% |
| Riskified | Chargeback guarantee | 0.8–1.2% volume | 2 weeks | 90%+ |
| Stripe Radar | Built-in to payments | 0.5%/decision | 0 | 75–85% |
Recommendation для FoxReload-партнёров: до $500k/мес — in-house rules + Stripe Radar. От $500k/мес — добавить Sift или Riskified. Sumsub берите только если параллельно нужен KYC.
CTA
Стройте fraud-pipeline в своей системе, используйте FoxReload API для фулфилмента: POST /api/orders для создания заказа, GET /api/orders/{id} для получения результата. Получите доступ.
