Интеграция Антифрода по API
Подключение антифрода KillBot через API осуществляется путем размещения JS-кода на сайте. Этот код собирает и отправляет данные браузера на сервер. Результаты проверки необходимо получать отдельным запросом к серверу с передачей номера сессии. В будущем планируется интеграция через DNS-проксирование, аналогично тому, как это реализовано у CloudFlare.

Для сбора данных необходимо подключить скрипт https://data.killbot.ru/js/c.js. Этот скрипт отправляет данные на сервер четырьмя запросами с общим объемом данных 5-15 КБ.

Результаты проверки и сопутствующие данные можно получить, отправив запрос на сервер по адресу https://data.killbot.ru/r/get.php. Поскольку точное время, когда все JS запросы с данными будут обработаны сервером, неизвестно, необходимо выполнять этот запрос с возможностью повторного выполнения: например, раз в секунду.
Подключение скрипта отправки данных c.js
Пример кода на JS, инициализирующий отправку данных на сервер KillBot.

        const kbKey = "SttzrYdjo"; /* Нужно получить в личном кабинете KillBot - находится в первой строчке кода для размещения на сайте. */        

        let kbUserID = Math.floor(Math.random()*900000000); // ID пользователя, сохраняется в базе данных KillBot, можно сохранять как долгожитвущую куку, тип - MySQL BigInt
        let kbSessionID = Math.floor(Math.random()*900000000); //ID сессии, сохраняется в базе данных KillBot, можно сохранять как куку с коротким временем жихни, тип - MySQL BigInt
	var kbB = null; //Эта переменная здесь не используется, но без неё скрипт выдаст ошибку. Пусть пока остаётся, в следующих версиях исправим.

        try{
            //Подключаем скрипт c.js который собирает и отправляет браузерные данные на сервер
            var kbTS = document.createElement("script"); 
            kbTS.type = "text/javascript"; 
            kbTS.async = true;
            kbTS.src = "https://data.killbot.ru/js/c.js?hash_str=" + kbKey + "&r="+ btoa(document.referrer)+"&url="+btoa(location.href)+"&c="+kbSessionID+"&kbUserID="+kbUserID;
            document.head.appendChild(kbTS);
        }
        catch(e){         
            let message = 'KB Error: ' + e.name + ":" + e.message;            
            console.log(message);    
            alert(message);
            die(message);
        }
Результат проверки можно получать средствами JS или на бекенде. При получении результата проверки средствами JS помните, что бот может имитировать наш сервер фейковым, поэтому, для надёжности, результирующий ответ можно получать и на бекенде.
Пример получения результата проверки на JS
Результат проверки нужно получать GET запросом с передачей параметра сессии, пример запроса: https://data.killbot.ru/r/get.php?c={{kbSessionID}} .
Ниже пример получения результата проверки на JS: если данные не получены, то скрипт делает запрос на сервер ещё раз.

        const kbTimeout = 2000; /* период через который делать запрос на сервер для получения результата. */
        const kbMaxRequests = 10; /* максимальное число запросов на сервер чтобы забрать результат. */	

        let response = null;
        let requestCount = 0;

        function makeRequest() {
            if (requestCount >= kbMaxRequests) {
                if (response){
                    complete(response);            
                }else{
                    fail();           
                }
                return;
            }

            requestCount++;
            const xhr = new XMLHttpRequest();
            xhr.open('GET', 'https://data.killbot.ru/r/get.php?c='+kbSessionID, true);
            xhr.timeout = 15000; 

            xhr.onreadystatechange = function () {
                    if (xhr.readyState === 4) { // 4 means the request is done.
                        if (xhr.status === 200) { // 200 means a successful return.
                            try {
                                response = JSON.parse(xhr.responseText);
                                
                                if (!response || response.hasOwnProperty("error")==true || response.l == false) {
                                    setTimeout(makeRequest, kbTimeout);
                                } else {
                                    complete(response); 
                                }
                            } catch (e) {
                                console.error('Error parsing JSON response:', e);
                                setTimeout(makeRequest, kbTimeout);
                            }
                        } else {
                            console.error('HTTP error: '+xhr.status+"; "+xhr.statusText);
                            setTimeout(makeRequest, kbTimeout);
                        }
                    }
                };

                xhr.send();
        }
        function complete(response){
            //Действия при успешном получении данных от сервера KillBot
        }

        function fail(){
            //Действия на ошибку, когда данные не получены
        }
Пример ответа cервера response на запрос https://data.killbot.ru/r/get.php

{
	"bot":false, //Результат проверки на бота по всей логике скрипта, выставелнной в настройках скрипта KillBot, fraud.true - то это бот
	"fraud":false, //То же самое что и параметр bot, если bot.true - то это бот
	"l":true, //Прогружен скрипт полностью или нет. Простые боты могут не прогружать скрипт полностью, так как они оптимизируют время своей работы. Но из-за интернет соединения в некоторых случаях для реального пользователя скрипт так же может не прогрузится. l.true - значит скрипn прогружен польностью без ошибок
	"d":false, //Параметр из настроек скрипта: запретить заход или нет. Если d.true, то для этого визита нужно запретить заход на сайт
	"snsht":2969538378, //Слепок браузера основной
	"snsht_d":2696850341, //Слепок браузера детализированный
	"ua":"Chrome", //Браузер витзита, для информации - берётся из user-agent
	"sess":"457868305", //Номер сессии: kbSessionID
	"UserID":"468073784", //ID пользователя: kbUserID
	"capt":false, //Параметр из настроек скрипта: показать капчу или нет. Если capt.true, то для этого визита нужно запретить показать капчу
	"bl":false, //Есть ли слепок браузера snsht в группе известных ботов.
	"wl":true, //Есть ли слепок браузера snsht в группе известных браузеров.
	"wld":false, //Есть ли детализированный слепок браузера snsht в группе известных браузеров.
	"bld":false, //Есть ли детализированный слепок браузера snsht_d в группе известных ботов.
	"ip":"51.158.237.65", //ip с которого произошел визит
	"inf":false, //Параметр из настроек скрипта: показать бесконечную капчу или нет. Если inf.true, то для этого визита нужно показать бесконечную капчу - капчу которую нельзя пройти
	"sc":true, //Системный параметр для внутреннего использования в KillBot - он не нужен
	"t":true, //Платный скрипт или нет, если t.true - значит скрипт работает в платном режиме без ограничений
	"utm":"bot" //Параметр из настроек скрипта: название http параметра в который нужно поместить результат проверки на бота.
	"url": ""; //Параметр из настроек скрипта: url страницы на который нужно совершить редирект для этого визита
}
Пример ответа с содержанием ошибки

{
	"error_code":100, //Код ошибки. error_code=100: ID сессии (kbSessionID) не существует, error_code=200: любая другая ошибка - смотрите описание
	"error":true, //это значит что произошла ошибка
	"m":"KillBot session does not exist kbSessionID=255483105" //текст ошибки
}
Пример рабочего HTML кода с демонстрацией работы API KillBot
https://killbot.ru/snpsht.html - это пример страницы, которая отправляет данные браузера на сервер и получает результат проверки на фрод.

Смотрите код этой страницы, копируйте себе, и на её основании создавайте свои приложения.

<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Слепок браузера</title>	
	<style>
        .spinner {
            border: 16px solid #f3f3f3; /* Light grey */
            border-top: 16px solid #3498db; /* Blue */
            border-radius: 50%;
            width: 60px;
            height: 60px;
            animation: spin 2s linear infinite;
            display: inline-block;
        }

        @keyframes spin {
            0% { transform: rotate(0deg); }
            100% { transform: rotate(360deg); }
        }

        .hidden {
            display: none;
        }
    </style>
</head>
<body>
    <div id="warning"></div>
    <div id="result"><div id="spinner" class="spinner"></div></div>
    <div id="desc"></div>

    
    <script>
        
         // Проверка протокола
        if (location.protocol !== 'https:') {
            let message = '<b>WARNING:</b> Для стабильной работы, KillBot нужно запускать скрипт через HTTPS.';                        
            document.getElementById('warning').innerHTML = message;            
        }    
        
        const kbKey = "SttzrYdjo"; /* Нужно получить в личном кабинете KillBot - находится в первой строчке кода для размещения на сайте. */
        const kbTimeout = 2000; /* период через который делать запрос на сервер для получения результата. */
        const kbMaxRequests = 10; /* максимальное число запросов на сервер чтобы забрать результат. */	
        

        let kbUserID = Math.floor(Math.random()*900000000); // ID пользователя, сохраняется в базе данных KillBot, можно сохранять как долгожитвущую куку, тип - MySQL BigInt
        let kbSessionID = Math.floor(Math.random()*900000000); //ID сессии, сохраняется в базе данных KillBot, можно сохранять как куку с коротким временем жихни, тип - MySQL BigInt
	var kbB = null; //Эта переменная здесь не используется, но без неё скрипт выдаст ошибку. Пусть пока остаётся, в следующих версиях исправим.

        try{
            //Подключаем скрипт c.js который собирает и отправляет браузерные данные на сервер
            var kbTS = document.createElement("script"); 
            kbTS.type = "text/javascript"; 
            kbTS.async = true;
            kbTS.src = "https://data.killbot.ru/js/c.js?hash_str=" + kbKey + "&r="+ btoa(document.referrer)+"&url="+btoa(location.href)+"&c="+kbSessionID+"&kbUserID="+kbUserID;
            document.head.appendChild(kbTS);
        }
        catch(e){         
            let message = 'KB Error: ' + e.name + ":" + e.message;            
            console.log(message);    
            alert(message);
            die(message);
        }

        let response = null;
        let requestCount = 0;

        function makeRequest() {
            if (requestCount >= kbMaxRequests) {
                if (response){
                    complete(response);            
                }else{
                    fail();           
                }
                return;
            }

            requestCount++;
            const xhr = new XMLHttpRequest();
            xhr.open('GET', 'https://data.killbot.ru/r/get.php?c='+kbSessionID, true);
            xhr.timeout = 15000; 

            xhr.onreadystatechange = function () {
                    if (xhr.readyState === 4) { // 4 means the request is done.
                        if (xhr.status === 200) { // 200 means a successful return.
                            try {
                                response = JSON.parse(xhr.responseText);
                                
                                if (!response || response.hasOwnProperty("error")==true || response.l == false) {
                                    setTimeout(makeRequest, kbTimeout);
                                } else {
                                    complete(response); 
                                }
                            } catch (e) {
                                console.error('Error parsing JSON response:', e);
                                setTimeout(makeRequest, kbTimeout);
                            }
                        } else {
                            console.error('HTTP error: '+xhr.status+"; "+xhr.statusText);
                            setTimeout(makeRequest, kbTimeout);
                        }
                    }
                };

                xhr.send();
        }

        function complete(response){
            document.getElementById('result').innerHTML = 'Слепок браузера: <b>' + response.snsht+'</b>';
            if (response.wl==true) document.getElementById('result').innerHTML += " <span style = 'color:green'>[Есть в списках настоящих браузеров]</span>";
            document.getElementById('result').innerHTML += '<br>';
            document.getElementById('result').innerHTML += 'Код прогружен полностью: <b>' + (response.l?'ДА':'НЕТ')+'</b>';

            document.getElementById('desc').innerHTML = '<ul>';
            document.getElementById('desc').innerHTML += '<li>Слепок браузера может варьироваться в зависимости от версии браузера, версии OC и установленных расширений. Слепок бота в абсолютном большинстве случаев будет отличаться от слепка настоящего браузера. Даже если бот повторит какой-либо слепок, то визиты только за этим слепком можно обрабатывать подругому.';
            document.getElementById('desc').innerHTML += '</ul>';
        }

        function fail(){
            document.getElementById('result').innerText = 'Ошибка: таймаут, слепок браузера не получен.';
        }

        setTimeout(makeRequest, kbTimeout);

    </script>
</body>
</html>