Здарова, мои хорошие! Давайте сегодня настроим API интеграцию наших лендингов с партнерской сетью Affstar. Настроим постбеки в Кейтаро, напишем API для сайта и разберем его работу.
Пару слов про Affstar – это весомая CPA сеть на рынке с хорошей историей и репутацией. Всё грамотно организовано и настроено для эффективной работы. Адекватные менеджеры, топовые офферы, разнообразные гео. Выплаты без задержек. Простое подключение новых вебов и быстрое введение их в курс дела.
Что не нравится:
- Довольно низкие ставки на старте.
- Сложности согласования гарантов.
- Долгое решение вопросов, связанных с прямыми рекламами.
- Длительные согласования всего.
В целом, рекомендую работать с Affstar. Благодаря разнообразию офферов, все минусы так или иначе перекрываются.
- Настройка API и постбеков в Кейтаро для CPA сети Affstar.com
- Начнем с настройки постбеков в Кейтаро.
- Первый этап настройки завершен
- Интеграция API на лендинге
- Разбор файла api.php для ПП Affstar.com
- 1. Функция isDuplicateLead($phone)
- 2. Функция cleanPhoneNumber($phoneNumber)
- 3. Класс LeadSender
- 4. Основной блок
- Полный код api для передачи лидов в ПП Affstar:
Настройка API и постбеков в Кейтаро для CPA сети Affstar.com
Начнем с настройки постбеков в Кейтаро.
В Кейтаро уже есть встроенный шаблон для Affstar. Если вы используете другой трекер или по каким-то причинам шаблона нет, вот настройки:
- Название: Affstar.com
- Параметры для оффера: sub_id1={subid}
Postback URL: ВАШ_Домен/postback?subid={sub_id1}&payout={amount}¤cy={currency}&status={status}&lead_status=new&sale_status=approved&rejected_status=rejected,trash&from=Affstar.com

Теперь перейдем в партнерскую программу:
- Идем в ПП → Инструменты → Постбеки.
- Создать постбек.
- Метод запроса: GET
- Ставим галочки: Новый, Подтвержденный, Отклонен, Треш.
- Названия статусов — Новый: new, Подтвержденный: approved, Отклонен: rejected, Трэш: trash
- В поле URL вписываем наш постбек: ВАШ_Домен/postback?subid={sub_id1}&payout={amount}¤cy={currency}&status={status}&lead_status=new&sale_status=approved&rejected_status=rejected,trash&from=Affstar.com
После этого нажимаем кнопку «Сохранить».

Первый этап настройки завершен
Постбеки в партнерской сети Affstar.com и Кейтаро настроены. Теперь приступим к самой интеграции.
Интеграция 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 для ПП Affstar.com
Теперь разберем файл api.php
, на который ссылается наша форма, для отправки лидов в ПП. Этот скрипт написан на PHP и выполняет следующие основные функции
1. Функция isDuplicateLead($phone)
Эта функция проверяет, является ли переданный номер телефона дубликатом.
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
не существует, он создается. - Чтение содержимого файла: Содержимое файла считывается в переменную
$leads
. - Экранирование номера телефона: Номер телефона экранируется для использования в регулярном выражении.
- Проверка на совпадение: Если номер уже есть в файле, возвращается
true
, иначе номер добавляется в файл и функция возвращаетfalse
.
2. Функция cleanPhoneNumber($phoneNumber)
Эта функция очищает номер телефона, оставляя только цифры.
function cleanPhoneNumber($phoneNumber) { return preg_replace('/[^0-9]/', '', $phoneNumber); }
- Очистка номера: Все символы, кроме цифр, удаляются из строки.
3. Класс LeadSender
Класс для отправки лидов.
3.1 Метод getRequestParams()
Собирает параметры запроса из POST данных и серверных переменных.
php
private function getRequestParams() { return [ 'flow_uuid' => $_POST['flow'] ?? '', 'name' => $_POST['name'] ?? '', 'phone' => $_POST['phone'] ?? '', 'country_code' => $_POST['country'] ?? '', 'ip' => $_SERVER['REMOTE_ADDR'] ?? '', 'referer' => $_SERVER['HTTP_REFERER'] ?? '', 'user_agent' => $_SERVER['HTTP_USER_AGENT'] ?? '', 'sub_id1' => $_POST['sub1'] ?? '', 'sub_id2' => $_POST['sub2'] ?? '', 'sub_id3' => $_POST['sub3'] ?? '', 'utm_source' => $_POST['utm_source'] ?? '', 'utm_content' => $_POST['utm_content'] ?? '', 'utm_campaign' => $_POST['utm_campaign'] ?? '', 'utm_term' => $_POST['utm_term'] ?? '', 'utm_medium' => $_POST['utm_medium'] ?? '', 'pxl' => $_POST['pxl'] ?? '', ]; }
- Сбор параметров: Собираются параметры из POST данных и серверных переменных.
3.2 Метод send()
Отправляет запрос и обрабатывает ответ.
public function send() { $params = $this->getRequestParams(); $output = $this->request($params); $response = json_decode($output, true); if (empty($response) || !isset($response['success'])) { header('Location: error.php'); exit; } if ($response['success']) { header('Location: thankyou.php?name=' . $_POST['name'] . '&phone=' . $_POST['phone'] . '&pxl=' . $_POST['pxl']); exit; } else { header('Location: error.php'); exit; } }
- Запрос: Параметры отправляются методом
request()
. - Обработка ответа: В зависимости от ответа API пользователь перенаправляется на страницу благодарности или ошибку.
3.3 Метод request($params)
Отправляет данные через API с помощью cURL.
private function request($params) { $url = 'https://api.affstar.com/api/lead/create/publisher?api_key=' . API_KEY; $headers = ["ApiKey:" . API_KEY, 'Content-Type: application/json']; $json_str = json_encode($params); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POSTFIELDS, $json_str); $output = curl_exec($ch); curl_close($ch); return $output; }
- cURL запрос: Отправка POST запроса с заголовками и параметрами в формате JSON.
4. Основной блок
if ($_SERVER['REQUEST_METHOD'] === 'POST') { (new LeadSender())->send(); } else { echo 'error'; }
- Обработка POST запроса: Если запрос является POST, создается экземпляр класса
LeadSender
и вызывается методsend()
, иначе выводится сообщение об ошибке.
Полный код api для передачи лидов в ПП Affstar:
<?php 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; } const API_KEY = 'апи_ключ_из_ПП'; class LeadSender { private function getRequestParams() { return [ 'flow_uuid' => $_POST['flow'] ?? '', 'name' => $_POST['name'] ?? '', 'phone' => $_POST['phone'] ?? '', 'country_code' => $_POST['country'] ?? '', 'ip' => $_SERVER['REMOTE_ADDR'] ?? '', 'referer' => $_SERVER['HTTP_REFERER'] ?? '', 'user_agent' => $_SERVER['HTTP_USER_AGENT'] ?? '', 'sub_id1' => $_POST['sub1'] ?? '', 'sub_id2' => $_POST['sub2'] ?? '', 'sub_id3' => isset($_POST['sub3']) ? $_POST['sub3'] : "", 'utm_source' => isset($_POST['utm_source']) ? $_POST['utm_source'] : "", 'utm_content' => isset($_POST['utm_content']) ? $_POST['utm_content'] : "", 'utm_campaign' => isset($_POST['utm_campaign']) ? $_POST['utm_campaign'] : "", 'utm_term' => isset($_POST['utm_term']) ? $_POST['utm_term'] : "", 'utm_medium' => isset($_POST['utm_medium']) ? $_POST['utm_medium'] : "", 'pxl' => isset($_POST['pxl']) ? $_POST['pxl'] : "", ]; } public function send() { $params = $this->getRequestParams(); $output = $this->request($params); $response = json_decode($output, true); if (empty($response) || !isset($response['success'])) { header('Location: error.php'); exit; } if ($response['success']) { header('Location: thankyou.php?name=' . $_POST['name'] . '&phone=' . $_POST['phone'] . '&pxl=' . $_POST['pxl']); exit; } else { header('Location: error.php'); exit; } } private function request($params) { $url = 'https://api.affstar.com/api/lead/create/publisher?api_key=' . API_KEY; $headers = ["ApiKey:" . API_KEY, 'Content-Type: application/json']; $json_str = json_encode($params); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POSTFIELDS, $json_str); $output = curl_exec($ch); curl_close($ch); return $output; } } if ($_SERVER['REQUEST_METHOD'] === 'POST') { (new LeadSender())->send(); } else { echo 'error'; }
Для правильной работы лендингов и пикселя, не забываем добавлять на свои сайты страницы error.php и thankyou.php — ссылки кликабельные, тут можно скачать мультиязычные универсальные страницы.
Скачать файл api.php для cpa сети Affstar можно по ссылке ниже
Так же делюсь CPA кейстом Keto-Matcha ES. Помоему это вечный оффер, на него мы сейчас активно льем, и на эту проклу в том числе.
Спасибо за прочтение! Жду тебя в своем ТГ канале и искренне желаю больших рои!