Интеграция RocketProfit с Keitaro: API и постбэк
Как отправлять лиды в RocketProfit по API conversion/new со своего лендинга и настроить постбэк в Keitaro: поля запроса, коды ответов, статусы, ошибки…

RocketProfit принимает заявки по API одним POST-запросом на https://tracker.rocketprofit.com/conversion/new. Обязательные поля: ID потока, IP покупателя, имя, телефон и код страны, а subid клика Keitaro передаётся в метке sid1. Обратно статусы приходят глобальным постбэком со значениями pending, approved, rejected и trash.
Сеть жива: на главной она называет себя международной товарной сетью, которая работает с 2014 года, с COD-офферами на Европу, Африку и ЛатАм. Ниже настройка по документации из кабинета RocketProfit и Keitaro на октябрь 2026 года.
- Что даёт интеграция по API
- Где взять campaign_id
- Форма на лендинге
- Обработчик api.php для RocketProfit
- Постбэк RocketProfit в Keitaro
- Шаг 1. Партнёрская сеть в Keitaro
- Шаг 2. Глобальный постбэк в RocketProfit
- Статусы RocketProfit и Keitaro
- Ошибки и где их искать
- Частые вопросы
- Нужен ли API-ключ RocketProfit?
- Можно ли передавать subid в sid5?
- Каким методом RocketProfit отправляет постбэк?
- Что делать, если трекер лежал и постбэки потерялись?
- Почему тестовая заявка не дошла до Keitaro?
Что даёт интеграция по API
- Свой лендинг или прелендинг вместо промо сети, при этом лид уходит в RocketProfit сразу с сервера.
- Каждый апрув, отмена и треш привязаны к клику в Keitaro. Видно, какие креативы и площадки дают выкупаемые заявки.
- Можно отсекать мусор до отправки в сеть: пустые имена, короткие номера, повторные заявки.
Где взять campaign_id
Ключа API у RocketProfit нет: заявку к вашему аккаунту привязывает ID потока. Создайте поток на странице оффера и возьмите его номер, в документации это поле campaign_id (пример из кабинета: 500401).

Поля запроса по странице «Приём заказов через RocketProfit» в кабинете:
| Поле | Обязательное | Что передавать |
|---|---|---|
campaign_id | да | ID потока |
ip | да | IP покупателя. Если не передать, сеть возьмёт IP сервера, который делает запрос |
country_code | да | двухбуквенный код страны, например CZ |
name, phone | да | имя и телефон покупателя |
sid1…sid5 | нет | свои метки, одна из них под subid Keitaro |
extra_phone, address, mail, street, house, room, zip, city, comment | нет | доп. телефон, адрес, почта, комментарий |
redirect_url | нет | куда отправить покупателя после приёма заказа |
Форма на лендинге
Если лендинг загружен в Keitaro архивом, трекер сам заменит {subid} на ID клика, так устроен локальный лендинг. Страну задайте скрытым полем.
<form action="api.php" method="post">
<input type="text" name="name" placeholder="Jméno" required>
<input type="tel" name="phone" placeholder="+420 777 123 456" required>
<input type="hidden" name="country_code" value="CZ">
<input type="hidden" name="subid" value="{subid}">
<button type="submit">Objednat</button>
</form>Для лендинга на своём хостинге добавьте к его адресу в Keitaro ?subid={subid} и выводите значение в форму через htmlspecialchars($_GET['subid'] ?? '', ENT_QUOTES) в файле index.php.
Обработчик api.php для RocketProfit
<?php
// api.php: принимает заявку с лендинга и отправляет её в RocketProfit
const API_URL = 'https://tracker.rocketprofit.com/conversion/new';
const CAMPAIGN_ID = 0; // ОБЯЗАТЕЛЬНО замените на ID своего потока из кабинета RocketProfit
const BEHIND_CF = false; // true, если домен лендинга за Cloudflare
const TIMEOUT = 3; // секунды: лимит Keitaro для локальных лендингов
const LOG_FILE = __DIR__ . '/rp-leads.log';
if (($_SERVER['REQUEST_METHOD'] ?? '') !== 'POST') {
http_response_code(405);
exit;
}
$name = trim((string)($_POST['name'] ?? ''));
$phone = preg_replace('/\D+/', '', (string)($_POST['phone'] ?? ''));
$country = strtoupper(preg_replace('/[^A-Za-z]/', '', (string)($_POST['country_code'] ?? '')));
$subid = preg_replace('/[^A-Za-z0-9_-]/', '', (string)($_POST['subid'] ?? ''));
if ($name === '' || strlen($phone) < 7 || strlen($country) !== 2) {
header('Location: error.php');
exit;
}
$ip = $_SERVER['REMOTE_ADDR'] ?? '';
if (BEHIND_CF && !empty($_SERVER['HTTP_CF_CONNECTING_IP'])) {
$ip = $_SERVER['HTTP_CF_CONNECTING_IP'];
}
$order = [
'campaign_id' => CAMPAIGN_ID,
'ip' => $ip,
'country_code' => $country,
'name' => $name,
'phone' => $phone,
'sid1' => $subid, // subid клика Keitaro
'sid2' => (string)($_POST['sid2'] ?? ''),
];
$ch = curl_init(API_URL);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query($order),
CURLOPT_HTTPHEADER => ['Content-Type: application/x-www-form-urlencoded'],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CONNECTTIMEOUT => TIMEOUT,
CURLOPT_TIMEOUT => TIMEOUT,
]);
$body = curl_exec($ch);
$code = (int)curl_getinfo($ch, CURLINFO_HTTP_CODE);
// 200: лид принят (в ответе есть id), 302: принят с redirect_url,
// 400: ошибки валидации, 401: нет campaign_id, 403: запрещённое ГЕО
$ok = in_array($code, [200, 302], true);
file_put_contents(LOG_FILE, date('c') . " http=$code subid=$subid "
. substr((string)$body, 0, 300) . "\n", FILE_APPEND | LOCK_EX);
header('Location: ' . ($ok ? 'success.php' : 'error.php'));
exit;До теста замените CAMPAIGN_ID на номер своего потока. Храните журнал вне публичной папки и маскируйте персональные данные в ответе API. Включение BEHIND_CF безопасно только при проверке, что запрос пришёл через доверенный прокси, а не просто содержит похожий заголовок.
Что важно в коде:
- Заголовок
Content-Type: application/x-www-form-urlencodedобязателен по документации сети, тело собирается черезhttp_build_query. - Успех определяется по коду ответа. 200 означает, что лид принят (в ответе приходит его id), 302 бывает, если вы передали
redirect_url. Любой другой код ведёт наerror.php, а тело ответа пишется в лог. - IP берётся из
REMOTE_ADDR. В официальном примере RocketProfit IP читается изX-Forwarded-Forи похожих заголовков, но без прокси перед сайтом их легко подделать. ВключайтеBEHIND_CFтолько если домен действительно за Cloudflare. - Таймаут 3 секунды: это лимит Keitaro для PHP-лендингов, загруженных в трекер. На своём хостинге можно поставить 10.
Страница success.php должна показывать понятное «Спасибо»: можно взять готовую мультиязычную страницу благодарности. Чтобы на обзвон не уходили номера с опечатками, добавьте на форму маску поля телефона.
Постбэк RocketProfit в Keitaro
Шаг 1. Партнёрская сеть в Keitaro
- «Партнерские сети» → «Создать», шаблон Rocketprofit.com.
- В «Параметрах для оффера» шаблон ставит
sid1={subid}. Это нужно для офферов, подключённых редиректом, при API-отправке subid кладёт вsid1самapi.php. - Проверьте Postback URL. В нашем трекере шаблон собирал ссылку с параметром
sub_id={sid1}, а в документации Keitaro обязательный параметр называетсяsubid. Используйте вариант из документации.

https://ВАШ_ТРЕКЕР/POSTBACK_KEY/postback?subid={sid1}&status={status}&payout={payout}¤cy={currency}&tid={id}&lead_status=pending&sale_status=approved&rejected_status=rejected&trash_status=trash&from=rocketprofitАдрес трекера и ключ возьмите в «Настройки» → «Postback URL». tid={id} передаёт ID конверсии RocketProfit, поэтому два заказа с одного клика не перезапишут друг друга.
Шаг 2. Глобальный постбэк в RocketProfit
- Откройте «Потоки» → «Глобальный постбэк», вкладка «Настройки».
- Вставьте ссылку в поле «Постбэк URL». Запрос уйдёт методом GET, другого метода сеть не предлагает.
- Отметьте «Постбэк при смене статуса»: так трекер получит каждый переход pending, approved, rejected и trash.
- Если треш в Keitaro не нужен, добавьте «Не слать постбэк по лидам со статусом trash». Опция работает в связке с первой.
- Сохраните. Локальный постбэк в потоке главнее глобального, в глобальном можно указать две ссылки.

На вкладке «Переотправка постбека» можно повторно отправить конверсии за выбранный поток и даты, если трекер был недоступен.
Макросы RocketProfit для ссылки: {id} (ID конверсии), {date} (время в UTC+0), {campaign_id}, {offer_id}, {country_code}, {ip}, {traffic_type}, {sid1}…{sid5}, {status}, {payout}, {currency}, {type} (cpa или cancellations), {campaign_country_code} и {reason} (причина отмены).
Статусы RocketProfit и Keitaro
| Статус RocketProfit | Что значит | Тип в Keitaro | Обучение |
|---|---|---|---|
| pending | ожидает обработки | Lead | lead_status=pending |
| approved | подтверждён | Sale | sale_status=approved |
| rejected | отклонён | Rejected | rejected_status=rejected |
| trash | невалидный | Trash | trash_status=trash |
Если удобнее считать треш вместе с отменами, поставьте rejected_status=rejected,trash и уберите trash_status. Апрув и CR по этим данным удобно считать в калькуляторе арбитражника.
Ошибки и где их искать
| Код или сообщение | Причина | Что сделать |
|---|---|---|
| 400 | данные заказа не прошли проверку, список ошибок в теле ответа | откройте rp-leads.log: в ответе сети перечислены поля с ошибками |
| 401 | нет campaign_id или он не распознан | проверьте константу CAMPAIGN_ID, нужен числовой ID потока |
| 403 | ГЕО покупателя запрещено в оффере | сверьте страну трафика с ограничениями оффера |
| 404, «No campaign found for passed params» | потока с таким ID нет | проверьте номер потока в кабинете |
| 423 | в официальном примере это непройденная проверка незавершённого заказа, покупателя возвращают на лендинг | уточните причину у менеджера сети |
| Keitaro: Click for subid REPLACE not found | в постбэке не та метка | subid={sid1} в ссылке и sid1 в api.php должны совпадать |
| Keitaro: Conversion type not found | статус без обучения | проверьте lead_status, sale_status, rejected_status, trash_status |
Ошибки трекера смотрите в «Обслуживание» → «Логи» → «Postbacks», расшифровка есть в разделе Keitaro про устранение проблем с postback. Отправленные сетью запросы видны на вкладке «Глобальный постбэк лог».
Частые вопросы
Нужен ли API-ключ RocketProfit?
Нет. Заявка привязывается к вашему аккаунту через campaign_id, то есть ID потока. Поэтому номер потока не стоит светить в коде страницы, держите его в PHP.
Можно ли передавать subid в sid5?
Можно, главное одинаково в обработчике и постбэке. В кабинете сказано, что при выгрузке промо из потока метка sid5 занимается автоматически для Keitaro, поэтому со своим лендингом мы используем sid1, как в шаблоне трекера.
Каким методом RocketProfit отправляет постбэк?
Только GET. Макросы в фигурных скобках заменяются значениями в момент отправки.
Что делать, если трекер лежал и постбэки потерялись?
Откройте «Глобальный постбэк» → «Переотправка постбека», выберите поток, конверсии и даты и отправьте их заново.
Почему тестовая заявка не дошла до Keitaro?
Проверьте, что в заявке был реальный subid клика: партнёрские сети в тестовых постбэках его не передают, это отдельно оговорено в документации Keitaro.



