Привет, друзья! Сегодня рассмотрим, как написать API для передачи лидов с наших сайтов в партнерку kma.biz. Также настроим постбеки в Кейтаро и партнерской программе (ПП). Детально разберем, как работает API партнерки, и поделюсь некоторыми полезными советами, такими как настройка пикселя Facebook и отсечение дубликатов лидов.
kma.biz в целом довольно адекватная партнерка. У них отлично организован вывод средств: без запросов и прочей волокиты, достаточно нажать две кнопки в кабинете ПП, и в 19:00 выплата у вас на кошельке. Они имеют свои инхаус офферы, которые обычно идут с гарантом. Однако, ставки иногда приходится выбивать, возможно, они задумаются над этим вопросом.
- Начнем настройку api для kma.biz и написания постбеков
- Настройка постбеков для ПП kma.biz
- Первый этап настройки завершен
- Интеграция API на лендинге
- Разбор файла api.php для ПП kma.biz
- Объявление переменных и функций
- 2. Функция для проверки дублирования лидов
- 3. Функция для очистки номера телефона
- 5. Подготовка данных для отправки на API
- 6. Отправка данных с помощью cURL
- 7. Обработка ответа от API
- Полный код api для партнекрки кма выглядит следующим образом:
Начнем настройку api для kma.biz и написания постбеков
Настройка постбеков для ПП kma.biz
В Кейтаро уже есть встроенный шаблон для kma.biz. Если вы используете другой трекер или по каким-то причинам шаблона нет, вот настройка:
- Название: Kma.biz
- Параметры для оффера: subid={subid}
Postback URL: ВАШ_Домен/postback?subid={data1}&payout={sum}&status={status}&stream={stream}&orderid={orderid}&bannerid={bannerid}&campaignid={campaignid}¤cy={currency}&lead_status=P&sale_status=A&rejected_status=D,F&from=kma.biz

Теперь перейдем в партнерскую программу:
- Идем в ПП → Инструменты → Глобальный Postback.
- Метод передачи: GET
- Ставим галочки: Создание заказа, Подтверждение заказа, Отмена заказа
- Метод — POST
- Статус — Отмечаем все статусы
- Чекбокс — Отправлять комиссию только со статусом Апрув — оставляем не отмеченным!
- В поле postbackURL вписываем наш постбек: ВАШ_Домен/postback?subid={data1}&payout={sum}&status={status}&stream={stream}&orderid={orderid}&bannerid={bannerid}&campaignid={campaignid}¤cy={currency}&lead_status=P&sale_status=A&rejected_status=D,F&from=kma.biz
После этого нажимаем кнопку «Применить».
Первый этап настройки завершен
Постбеки в партнерской сети kma.biz и Кейтаро настроены. Теперь приступим к самой интеграции.

Интеграция API на лендинге
Заходим на наш лендинг и находим форму. По традиции уже, в форму вставляем макрос с sub_id для корректной работы постбеков:
<input type="hidden" name="sub1" value="{subid}">
Пример формы:
<form action="api.php" method="POST"> <input class="wheel_input" name="name" placeholder="Nombre" type="text" required> <input class="wheel_input" name="phone" placeholder="Numero de telefono" type="tel" required> <button class="main-link">КУПИТЬ</button> <input type="hidden" name="sub1" value="{subid}"> <input type='hidden' name='pxl' value="<?php echo $_GET['pxl']; ?>" /> </form>
На примере показана довольно обычная стандартная форма, в которую мы добавили сабайди и код пикселя, который приходит на лендинг в ссылке, в параметре: pxl
Разбор файла api.php для ПП kma.biz
Теперь разберем файл api.php
, на который ссылается наша форма, для отправки лидов в ПП. Этот скрипт написан на PHP и выполняет следующие основные функции:
Объявление переменных и функций
$apiToken = 'Апи токен кма';
$apiToken
— это токен для авторизации при обращении к внешнему API.
2. Функция для проверки дублирования лидов
function isDuplicateLead($phone) { $file = 'leads.txt'; if (!file_exists($file)) { file_put_contents($file, ''); } $leads = file_get_contents($file); $escapedPhone = preg_quote($phone, '/'); $phonePattern = '/' . $escapedPhone . "\n/"; if (preg_match($phonePattern, $leads)) { return true; } else { file_put_contents($file, $phone . "\n", FILE_APPEND); return false; } }
Эта функция проверяет, был ли данный номер телефона уже записан в файл leads.txt
. Если номер уже существует, функция возвращает true
, в противном случае она добавляет номер в файл и возвращает false
.
3. Функция для очистки номера телефона
$cleanedPhone = cleanPhoneNumber($_POST['phone']); if (isDuplicateLead($cleanedPhone)) { header('Location: error.php'); exit; }
Здесь номер телефона очищается, и проверяется на дублирование. Если номер уже существует, происходит редирект на страницу ошибки error.php
.
5. Подготовка данных для отправки на API
$url = 'https://api.kma.biz/lead/add'; $ip = $_SERVER['REMOTE_ADDR']; $referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : 'direct'; $language = isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2) : 'unknown'; $data = [ 'channel' => $_POST['flow'], 'name' => $_POST['name'], 'phone' => $_POST['phone'], 'ip' => $ip, 'country' => $_POST['country'], 'referer' => $referer, 'data1' => $_POST['sub1'], 'data2' => $_POST['sub2'], 'data3' => $_POST['sub3'], 'data4' => $_POST['sub4'], 'data5' => $_POST['sub5'], 'language' => $language, 'is_mobile' => isset($_POST['is_mobile']) ? $_POST['is_mobile'] : null, 'ua' => $_SERVER['HTTP_USER_AGENT'] ]; $postFields = http_build_query($data);
Данные формы подготавливаются для отправки на внешний API.
6. Отправка данных с помощью cURL
$process = curl_init(); curl_setopt($process, CURLOPT_URL, $url); curl_setopt($process, CURLOPT_RETURNTRANSFER, true); curl_setopt($process, CURLOPT_POST, true); curl_setopt($process, CURLOPT_POSTFIELDS, $postFields); curl_setopt($process, CURLOPT_HTTPHEADER, [ 'Authorization: Bearer ' . $apiToken, 'Content-Type: application/x-www-form-urlencoded', 'User-Agent: ' . $_SERVER['HTTP_USER_AGENT'], 'X-Host-Url: ' . (isset($_SERVER['HTTPS']) ? "https" : "http") . '://' . $_SERVER['HTTP_HOST'] ]); curl_setopt($process, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($process, CURLOPT_FOLLOWLOCATION, false); curl_setopt($process, CURLOPT_TIMEOUT, 20); $response = curl_exec($process); if (curl_errno($process)) { echo 'Curl error: ' . curl_error($process); curl_close($process); exit; } curl_close($process);
Здесь происходит инициализация и настройка cURL запроса для отправки данных на внешний API. Если возникает ошибка, она выводится на экран.
7. Обработка ответа от API
$responseArr = json_decode($response, true); if ($responseArr && $responseArr['code'] == 0) { header('Location: thankyou.php?name=' . $_POST['name'] . '&phone=' . $_POST['phone'] . '&pxl=' . $_POST['subid6']); } else { echo isset($responseArr['message']) ? $responseArr['message'] : 'Unknown error'; }
Ответ от API декодируется из JSON. Если код ответа 0
, происходит редирект на страницу благодарности thankyou.php
. В противном случае выводится сообщение об ошибке.
Этот скрипт выполняет следующие задачи:
- Проверяет и предотвращает дублирование лидов.
- Очищает и обрабатывает данные формы.
- Отправляет данные на внешний API.
- Обрабатывает ответ от API и выполняет соответствующие действия в зависимости от результата.
Полный код api для партнекрки кма выглядит следующим образом:
<?php $apiToken = 'Ваш апи токен'; function isDuplicateLead($phone) { $file = 'leads.txt'; if (!file_exists($file)) { file_put_contents($file, ''); } $leads = file_get_contents($file); $escapedPhone = preg_quote($phone, '/'); $phonePattern = '/' . $escapedPhone . "\n/"; if (preg_match($phonePattern, $leads)) { return true; } else { file_put_contents($file, $phone . "\n", FILE_APPEND); return false; } } function cleanPhoneNumber($phoneNumber) { return preg_replace('/[^0-9]/', '', $phoneNumber); } $cleanedPhone = cleanPhoneNumber($_POST['phone']); if (isDuplicateLead($cleanedPhone)) { header('Location: error.php'); exit; } $url = 'https://api.kma.biz/lead/add'; $ip = $_SERVER['REMOTE_ADDR']; $referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : 'direct'; $language = isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2) : 'unknown'; $data = [ 'channel' => $_POST['flow'], 'name' => $_POST['name'], 'phone' => $_POST['phone'], 'ip' => $ip, 'country' => $_POST['country'], 'referer' => $referer, 'data1' => $_POST['sub1'], 'data2' => $_POST['sub2'], 'data3' => $_POST['sub3'], 'data4' => $_POST['sub4'], 'data5' => $_POST['sub5'], 'language' => $language, 'is_mobile' => isset($_POST['is_mobile']) ? $_POST['is_mobile'] : null, 'ua' => $_SERVER['HTTP_USER_AGENT'] ]; $postFields = http_build_query($data); $process = curl_init(); curl_setopt($process, CURLOPT_URL, $url); curl_setopt($process, CURLOPT_RETURNTRANSFER, true); curl_setopt($process, CURLOPT_POST, true); curl_setopt($process, CURLOPT_POSTFIELDS, $postFields); curl_setopt($process, CURLOPT_HTTPHEADER, [ 'Authorization: Bearer ' . $apiToken, 'Content-Type: application/x-www-form-urlencoded', 'User-Agent: ' . $_SERVER['HTTP_USER_AGENT'], 'X-Host-Url: ' . (isset($_SERVER['HTTPS']) ? "https" : "http") . '://' . $_SERVER['HTTP_HOST'] ]); curl_setopt($process, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($process, CURLOPT_FOLLOWLOCATION, false); curl_setopt($process, CURLOPT_TIMEOUT, 20); $response = curl_exec($process); if (curl_errno($process)) { echo 'Curl error: ' . curl_error($process); curl_close($process); exit; } curl_close($process); $responseArr = json_decode($response, true); if ($responseArr && $responseArr['code'] == 0) { header('Location: thankyou.php?name=' . $_POST['name'] . '&phone=' . $_POST['phone'] . '&pxl=' . $_POST['subid6']); } else { echo isset($responseArr['message']) ? $responseArr['message'] : 'Unknown error'; } ?>
Для корректной работы лендингов и пикселя, обязательно добавляйте в свои проклы файлы error.php и thankyou.php — ссылки кликабельные, тут можно скачать мультиязычные универсальные страницы.
Скачать файл api.php для cpa сети kma.biz можно по ссылке ниже
Так же бонусом выкладываю проклу, которую мы долгое время лили на кма, потенция — Бангладеш. Прокла показывала очень хороший конверт!
Кому была полезна статья, заходите в наш телеграмм канал, стараюсь публиковать полезные вещи как можно чаще. Ну и как говориться — всем больших, зеленых ROI