--- title: Fraud Prevention — Рекламный фрод --- # Рекламный фрод Это **руководство по сценарию**. Базовая интеграция неизменна — вы загружаете [Web SDK](../web-sdk), читаете [вердикт](../verdict-reference) и получаете данные из [Data API](../data-api) ровно так, как описано на тех страницах. Эта страница добавляет лишь ту немногую специфику, которая нужна только сценарию рекламного фрода. Защита от рекламного фрода отфильтровывает ботов и недействительный трафик из платных кампаний, чтобы рекламодатели и рекламные площадки платили за подлинные клики и показы, а не за фейковый объём. От остальных сценариев применения её отличает то, что **посетителя доставляет третья сторона**, и обеим сторонам нужно сойтись на независимом выводе «человек / бот» по каждому клику. ## Блокировка в реальном времени у источника Fraud Prevention работает inline в точке входа и возвращает вердикт в реальном времени — это не отчёт постфактум. Тот, кому принадлежит страница, на которую попадает посетитель, может действовать по этому вердикту немедленно: - **Рекламодатели** запускают SDK на лендинге: недействительный трафик распознаётся — и при желании ему предъявляется challenge — в момент прибытия, прежде чем он попадёт в воронку или исказит отчётность. - **Трафик-платформы** запускают SDK на собственной pre-lander или странице редиректа: клик проверяется *до* того, как он будет перенаправлен, поэтому боты останавливаются на входе и никогда не превращаются в доставленный трафик. Единственное требование — страница, способная запустить SDK: вердикту нужны сигналы браузера, поэтому у чистого серверного 302 нет места, чтобы их собрать — добавьте лёгкую промежуточную страницу, и применится та же блокировка в реальном времени. Подписанный click-токен и Data API стоят сверху для сверки между обеими сторонами; inline-блокировка в реальном времени — основной механизм, а постфактумная очистка через API — запасной вариант для трафика без промежуточной страницы. ## Две роли - **Рекламодатель (Advertiser)** — владеет лендингом, на который попадает посетитель. Запускает Web SDK на этой странице, чтобы получить вердикт для каждого приходящего визита, и получает вердикты из Data API, чтобы сверить то, за что ему выставили счёт. - **Провайдер (Provider, источник трафика / рекламы)** — доставляет клик. Ему нужно **доказать качество того, что он отправил**, поэтому он выпускает click-токен на каждый клик, а затем сопоставляет свой отчёт о доставке с независимыми вердиктами. Обе стороны аутентифицируются в [Data API](../data-api) собственными учётными данными приложения и читают один и тот же вердикт по каждому клику — именно это позволяет им сверяться, не доверяя сырым логам друг друга. ## Сквозной поток Приведённая ниже последовательность показывает, как один клик проходит путь от доставки провайдером, через посетителя и лендинг рекламодателя, до единого вердикта, который **оба аккаунта затем читают каждый со своей стороны**. ```mermaid sequenceDiagram autonumber participant P as Провайдер (аккаунт B) participant V as Посетитель participant A as Страница рекламодателя + SDK participant F as Fraud Prevention API P->>P: Подписать click_token (bot_kid + secret, несёт pkid) P->>V: Доставить ссылку с ?_ctk=click_token V->>A: Клик → переход на страницу рекламодателя (URL несёт _ctk) A->>A: SDK читает _ctk из URL A->>F: Зашифрованный POST /bot/verify
(app_key = рекламодатель, click_token = подписан провайдером) F->>F: app_key → advertiser_app_id,
проверить pkid → provider_app_id, вынести вердикт,
записать одну строку с обоими app_id F-->>A: verdict → onVerdict A->>A: Обработать по verdict.action (запись / блок / challenge) Note over P,F: Сверка (между аккаунтами) A->>F: GET /v1/bot с App-Key рекламодателя F-->>A: Та же строка (сопоставлена по advertiser_app_id) P->>F: GET /v1/bot с App-Key провайдера F-->>P: Та же строка (сопоставлена по provider_app_id) ``` Решающее свойство: **оба app_id живут в одной строке.** Рекламодатель читает её по совпадению `advertiser_app_id`, провайдер читает её по совпадению `provider_app_id` — два разных аккаунта, каждый запрашивает со своим собственным App-Key, и оба приходят к одному и тому же независимому вердикту. Ни одной из сторон не нужно раскрывать или доверять сырым логам другой, чтобы согласиться о том, что произошло по данному клику. ## Click-токены **Click-токен (click token)** связывает доставленный провайдером клик с вердиктом, который в итоге получает визит. Это идентификатор по каждому клику, на котором сходятся обе стороны. Остальным сценариям применения Fraud Prevention click-токены не нужны — они сверяют вердикты и без них. Поток: 1. **Выпуск** — провайдер получает подписанный click-токен (по одному на клик), когда направляет посетителя на лендинг рекламодателя. 2. **Перенос на целевой URL** — добавьте выпущенный токен к лендинговому URL как query-параметр: ``` https://advertiser.example/lp?click_token=ct_xxxxxxxx ``` 3. **Чтение на странице** — [Web SDK](../web-sdk) автоматически читает токен из URL. Если вы используете другое имя параметра, задайте `tokenParam`: ```js BotSignal.init({ appKey: 'YOUR_APP_KEY', tokenParam: 'click_token' }); ``` 4. **Сверка** — позже найдите клик через Data API и сопоставьте его обратно с отчётом провайдера о доставке. ::: info Токен уже подписан, когда выдаётся вам, — вам нужно лишь **донести его до лендингового URL**. Ничего подписывать или вычислять на вашей стороне не требуется. ::: ### Опция `tokenParam` В этом сценарии Web SDK получает одну дополнительную опцию: | Опция | Тип | По умолчанию | Описание | | --- | --- | --- | --- | | `tokenParam` | string | автоопределение | Имя query-параметра URL, который несёт click-токен провайдера (например, `click_token`). SDK читает его из URL страницы и связывает вердикт с этим кликом. Оставьте без изменений, если вы не используете click-токены. | ## Сверка и взаиморасчёт Как только визиты несут click-токен, обе стороны рассчитываются на основе одних и тех же независимых вердиктов: - **Получить вердикт одного клика** — например, чтобы оспорить или подтвердить один клик: ```bash GET /v1/bot/verdict?click_token=ct_xxx X-App-Key: YOUR_APP_KEY X-App-Secret: YOUR_APP_SECRET ``` - **Экспортировать строки по каждому клику** — получите период времени и сопоставьте `click_token` каждой строки обратно со своими логами кликов: ```bash GET /v1/bot/export?from=2026-06-01&to=2026-06-30&format=csv X-App-Key: YOUR_APP_KEY X-App-Secret: YOUR_APP_SECRET ``` Каждая строка несёт `click_token` визита (когда он присутствует), временную метку и поля вердикта (`is_bot`, `score`, `level`, `action`). Рекламодатель исключает помеченные и ботовые клики из того, за что он платит; провайдер сверяет свой отчёт о доставке с теми же выводами. Поскольку обе стороны читают **один и тот же независимый вердикт**, взаиморасчёт не зависит от сырых логов ни одной из сторон. ## Модель безопасности `cid` и click-токен передаются в URL, поэтому относитесь к ним как к идентификаторам, а не как к учётным данным: - **Чтение вердикта требует App-Key + App-Secret.** Data API аутентифицирует каждый вызов вашим app secret (сравнение за постоянное время) и возвращает только строки, где ваше приложение является advertiser или provider. Сама по себе `cid` ничего не извлекает — третья сторона, скопировавшая её из URL, не имеет secret и не является участником этой строки. - **provider связан подписью.** Click-токен подписан по HMAC секретом provider и несёт `pkid` provider; его нельзя подделать, а одну `cid` можно заявить только один раз (защита от повтора). - **Опционально привяжите и advertiser.** Подпишите `app_key` целевого advertiser в токен как `aud`. Тогда проверка требует, чтобы app_key страницы совпадал с `aud`, поэтому токен, выпущенный для advertiser A, не сможет приписать вердикт advertiser B. Опустите `aud` — и любая страница advertiser сможет принять токен. Итоговый эффект: вердикт по `cid` доступен для чтения только двум привязанным к нему приложениям — advertiser, чья страница запустила SDK, и provider, чей токен был предъявлен, — каждое из которых аутентифицируется собственным App-Secret. ## Дальнейшие шаги - [Web SDK](../web-sdk) — собирайте вердикты на лендинге - [Справочник по вердиктам](../verdict-reference) — каждое поле и как на него реагировать - [Data API](../data-api) — получение и сверка вердиктов на стороне сервера