Здарова, мои хорошие! Давайте сегодня настроим 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. Помоему это вечный оффер, на него мы сейчас активно льем, и на эту проклу в том числе.
Спасибо за прочтение! Жду тебя в своем ТГ канале и искренне желаю больших рои!




