Antifraud
Velocity-защита, блокировка клиентов, сегментация FTD/STD/TRUSTED/VIP, device fingerprinting и trust-based cascade routing
Antifraud
Syncra V2 включает многоуровневый antifraud-стек: ограничение скорости создания платежей (velocity), блокировка недобросовестных клиентов, автоматическую сегментацию игроков по уровням доверия, device fingerprinting и маршрутизацию каскадов по типу клиента. Эти механизмы работают на стороне бэкенда и прозрачно для мерчанта — но вы можете расширить их эффективность, передавая дополнительные заголовки при создании PayIn.
Обзор
Antifraud-функционал решает четыре задачи:
- Защита от спама платежей (velocity) — один
client_idне может создать более 10 PayIn в час. - Блокировка мошенников — администратор может заблокировать клиента навсегда или на срок.
- Сегментация по доверию — игроки автоматически продвигаются по уровням
FTD → STD → TRUSTEDпо мере успешных депозитов;VIP— ручное назначение. - Трекинг устройств — IP, User-Agent и SHA-256 fingerprint устройства сохраняются на записи клиента.
Эти данные также питают trust-based cascade routing: правила каскада могут
фильтровать команды по customer_type, направляя VIP-игроков к проверенным
трейдерам.
Velocity protection
Velocity-защита предотвращает DDoS-атаки через массовое создание PayIn одним
игроком. Лимит жёстко задан в домене: один client_id не может создать более
10 PayIn в течение скользящего 1-часового окна.
Как это работает
- Проверка выполняется до сохранения сделки в БД — отклонённый запрос не оставляет зомби-записей и не занимает слот трейдера.
- Лимит применяется только к известным клиентам (
client_idне пустой). Анонимные PayIn проходят без проверки. - Защита fail-open при ошибке БД: временный сбой хранилища не блокирует легитимные деньги — но инцидент логируется.
Что произойдёт при превышении
Запрос CreateMerchantPayIn вернёт ошибку (RFC 9457 problem+json):
HTTP/1.1 429 Too Many Requests
{
"type": "about:blank",
"title": "Too Many Requests",
"status": 429,
"detail": "client rate limit exceeded: velocity ceiling of 10 PayIn/hour reached",
"instance": "/api/v1/p2p/merchant/deals/payin"
}Что делать мерчанту
- Не ретратьте запрос сразу — клиент уже исчерпал лимит (см. Retry-матрицу).
- Покажите игроку сообщение «слишком много попыток, попробуйте позже».
- Лимит сбрасывается по скользящему окну — через час возможность вернётся.
Customer blocking
Администратор может заблокировать клиента (IsBlocked = true) с указанием срока
(BlockedUntil) или бессрочно. Заблокированный клиент не может создавать новые
платежи и открывать checkout.
Логика блокировки
Клиент считается заблокированным, если выполняется условие:
IsBlocked == true
AND (BlockedUntil == nil // бессрочная блокировка
OR BlockedUntil > now()) // срочная блокировка ещё активнаBlockedUntil == nil— блокировка навсегда (только ручное снятие).BlockedUntilв будущем — блокировка до указанной даты.BlockedUntilв прошлом — блокировка истекла, клиент снова активен.
Ошибка при попытке платежа
HTTP/1.1 403 Forbidden
{
"type": "about:blank",
"title": "Forbidden",
"status": 403,
"detail": "customer is blocked",
"instance": "/api/v1/p2p/merchant/deals/payin"
}Управление блокировкой
Блокировка управляется только через административную панель Syncra (раздел Customers). API для мерчантов не позволяет блокировать клиентов самостоятельно — это решение принимается командой поддержки на основе antifraud-аналитики.
Сегментация клиентов (FTD / STD / TRUSTED / VIP)
Каждый клиент имеет тип (customer_type), отражающий уровень доверия.
Сегментация используется для маршрутизации каскадов и аналитики.
Четыре уровня
| Тип | Расшифровка | Как получается |
|---|---|---|
FTD | First-Time Depositor | Тип по умолчанию для новых клиентов. |
STD | Standard Depositor | Автоматически после 3 депозитов. |
TRUSTED | Trusted | Автоматически после 10 депозитов. Верх автоматической лестницы. |
VIP | VIP | Только ручное назначение администратором. Никогда не меняется автоматически (ни вверх, ни вниз). |
Автоматическая сегментация
Когда PayIn-сделка достигает статуса COMPLETED, бэкенд инкрементирует счётчик
депозитов клиента и проверяет порог:
FTD → STD при DepositCount >= 3
STD → TRUSTED при DepositCount >= 10
TRUSTED / VIP — ручное управление, авто-продвижения нетПороги жёстко заданы в спецификации (Phase 5). TRUSTED — вершина
автоматической лестницы: дальше только ручное VIP. VIP никогда не
понижается автоматически — это явный административный оверрайд.
Пример: жизненный цикл клиента
Новый игрок → FTD (1 депозит)
→ FTD (2 депозита)
3-й успешный депозит → STD (авто-промоция)
...
10-й депозит → TRUSTED (авто-промоция)
...
Решение админа → VIP (ручной оверрайд)Device fingerprinting
Device fingerprint — это SHA-256 хэш характеристик устройства игрока,
отправляемый payform-SPA. Он сохраняется в поле LastFingerprint записи клиента
и используется для связывания сессий и antifraud-аналитики.
Fingerprint хранится только как SHA-256 хэш, без raw canvas/WebGL/personal данных. Это GDPR-compliant подход: хэш необратим и не позволяет восстановить персональную информацию.
Как передать fingerprint
Payform SPA отправляет fingerprint автоматически. Если вы используете собственный фронтенд, передавайте заголовок при создании PayIn или при открытии checkout:
X-Player-Fingerprint: a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1bЗаголовок читается бэкендом из gRPC metadata (x-player-fingerprint или
grpcgateway-x-player-fingerprint для REST-шлюза) и передаётся в UpdatePayer
провайдера, если адаптер поддерживает payer enrichment.
Player tracking (IP и User-Agent)
Помимо fingerprint, Syncra фиксирует сетевые атрибуты игрока для antifraud-аналитики:
| Поле клиента | Источник | Заголовок |
|---|---|---|
FirstIP / LastIP | IP-адрес игрока | X-Forwarded-For (fallback: X-Real-IP) |
LastUserAgent | Строка User-Agent браузера | User-Agent |
FirstSeen / LastSeen | Timestamps первого и последнего захода | Вычисляется бэкендом |
Эти поля обновляются при каждом касании клиента (создание PayIn, открытие checkout). IP и UA используются для выявления подозрительной активности (например, смена гео, эмуляторы).
Пример запроса с полным трекингом
curl -X POST https://api.syncra.money/api/v1/p2p/merchant/deals/payin \
-H "X-Merchant-Token: $TOKEN" \
-H "X-Timestamp: $TS" \
-H "X-Signature: t=$TS,v1=$SIG" \
-H "Content-Type: application/json" \
-H "X-Player-Fingerprint: a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b" \
-d '{
"amount": 150000,
"currency": "RUB",
"client_id": "player_9921",
"idempotency_key": "f3b8a1c2-4d5e-4f6a-9b0c-1d2e3f4a5b6c"
}'X-Forwarded-For и User-Agent обычно проставляются HTTP-шлюзом/браузером
автоматически — вам не нужно задавать их вручную. X-Player-Fingerprint —
единственный заголовок, который вы должны передавать явно (если используете
собственный фронтенд; payform SPA делает это сам).
Trust-based cascade routing
Правила каскада (CascadeRule) могут дополнительно фильтровать команды по типу
клиента (customer_type). Это позволяет направлять VIP-игроков к проверенным
командам трейдеров, а новых — к более широкой сети.
Логика матчинга
Поле customer_type в правиле каскада работает так:
customer_typeпустой/отсутствует — универсальное правило, матчит все типы клиентов. Обратно совместимо с правилами, созданными до введения сегментации.customer_type = "VIP"— правило применяется только к VIP-клиентам.- Неизвестный игрок (
client_idпустой, тип не определён) — матчится только с универсальными правилами.
Пример конфигурации каскада
| Приоритет | Merchant | PaymentMethod | Team | CustomerType | Назначение |
|---|---|---|---|---|---|
| 1 | Casino A | SBP | Team Gold | VIP | VIP → премиум-команда |
| 2 | Casino A | SBP | Team Beta | TRUSTED | Доверенные → опытная команда |
| 3 | Casino A | SBP | Team Pool | (пусто) | Все остальные → пул |
Каскадный маршрутизатор итерирует правила по приоритету ASC и выбирает первую
команду с eligible on-shift трейдерами и подходящим customer_type.
Настройка customer_type в правиле каскада выполняется через
административную панель (раздел Cascade Rules). API для мерчантов не
позволяет редактировать каскады — это конфигурация роутинга на уровне тенанта.
Сводка ошибок antifraud
| Ошибка | HTTP | Когда возникает | Retry? |
|---|---|---|---|
CLIENT_RATE_LIMITED | 429 | client_id превысил 10 PayIn/час | Да, с backoff |
CUSTOMER_BLOCKED | 403 | Клиент заблокирован (IsBlocked = true, блок не истёк) | Нет |
Полный справочник кодов и retry-стратегий — в Коды ошибок.
Связанные материалы
- Коды ошибок — полный справочник, включая
CLIENT_RATE_LIMITEDиCUSTOMER_BLOCKED. - Приём платежей (PayIn) — создание PayIn с заголовками трекинга.
- Hosted Checkout — payform автоматически отправляет fingerprint.
- Сделки — cascade routing и matching.