Риэлторы и автоперекупы живут в CRM: лиды, сделки, касания. А объявления — во внешнем мире, и между «появилось объявление» и «менеджер позвонил» часто проходят часы. В этой статье — практическая схема, как доставлять новые объявления прямо в amoCRM/Bitrix24 через API и сократить это время до минут.
Классический сценарий для агентства:
Если объявления прилетают в карточку клиента автоматически, воронка меняется: менеджер получает подборку сразу и звонит первым. На конкурентном рынке скорость — единственное, что риэлтор может контролировать.
Тот же механизм работает для перекупов авто: новое объявление в валидации «ниже рынка» → задача/звонок в течение 5–10 минут, пока машину не купили.
1. Опрос API по таймеру (поллинг). Промежуточный скрипт раз в 30–60 секунд запрашивает у источника объявления за последние секунды/минуты и создаёт лиды в CRM. Ключевое условие — у API должен быть параметр «последние N минут» и сохранённая история, чтобы ни одно объявление не потерялось при сбое. При обновлении базы источника в реальном времени латентность такой схемы — меньше минуты.
2. Вебхуки. Источник сам присылает POST на ваш URL при появлении новых объявлений по фильтрам. Поддерживают их не все агрегаторы; если источник отдаёт данные только по запросу — вебхука нет, и поллинг из пункта 1 даёт почти ту же скорость.
Разница на практике: если ваш источник — pull-API (данные забирают запросом), не ищите в нём вебхуки — стройте поллер. Он предсказуем, отлаживается логом последнего окна выборки и не требует публичного HTTPS-эндпоинта.
Скрипт запускается cron'ом раз в минуту: забирает объявления за последние 2 минуты по фильтрам клиента, отсекает уже созданные по ID объявления, остаток превращает в лиды amoCRM. Имена полей ответа вашего источника сверяйте по тестовому доступу — в примере маппинг схематичный.
<?php
// poll_ads.php — запуск cron'ом каждую минуту
$seen = __DIR__ . '/seen_ids.json';
$seenIds = json_decode(file_get_contents($seen) ?: '[]', true);
// 1) Запрос к API объявлений: фильтр + окно «последние 2 минуты»
$url = 'https://rest-app.net/api/ads?' . http_build_query([
'login' => getenv('API_LOGIN'),
'token' => getenv('API_TOKEN'),
'category_id' => 9, // категория (9 — автомобили)
'region_id' => 621540, // регион
'price2' => 800000, // потолок цены в объявлении
'last_m' => 2, // последние 2 минуты
'format' => 'json',
]);
$items = json_decode(file_get_contents($url) ?: '[]', true) ?: [];
// 2) Дедупликация по ID + создание лидов
foreach ($items as $ad) {
$id = (string)($ad['id'] ?? '');
if ($id === '' || in_array($id, $seenIds, true)) continue;
$lead = [
'name' => mb_substr($ad['title'] ?? 'Новое объявление', 0, 60),
'price' => (int)($ad['price'] ?? 0),
'custom_fields_values' => [
['field_name' => 'Объявление', 'value' => $ad['url'] ?? ''],
['field_name' => 'Город', 'value' => $ad['city'] ?? ''],
],
];
$ch = curl_init('https://YOUR_SUBDOMAIN.amocrm.ru/api/v4/leads');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'Authorization: *** ' . getenv('AMO_TOKEN'),
],
CURLOPT_POSTFIELDS => json_encode(['leads' => [$lead]]),
]);
curl_exec($ch);
$seenIds[] = $id;
}
// 3) Храним виденные ID (с обрезкой, чтобы файл не рос вечно)
file_put_contents($seen, json_encode(array_slice($seenIds, -5000)));
Задачи на стороне источника данных: стабильный API с полными полями объявления (цена, город, ссылка, дата) и окном выборки «последние N минут/секунд».
В Битрикс24 создание лида — вызов crm.lead.add через входящий вебхук (/rest/{код}/crm.lead.add/). Тот же поллер вместо вызова amoCRM дёргает этот URL с маппингом полей на карточку лида или задачи. Полезный приём: в поле «Описание» задачи сразу отдавать 3–5 лучших объявлений по фильтру, а не одно — менеджеру есть из чего выбрать.
Из практики, минимально необходимый набор в выгрузке:
Если ваш источник данных не отдаёт часть полей — интеграция превратится в ручной добор информации, и менеджер быстро вернётся к ручному мониторингу.
date1/date2), а не «последние 2 минуты»: история хранится на стороне источника, объявления не теряются.API Rest-App отдаёт объявления Avito, Cian, Auto.ru, Drom, Youla и других площадок: фильтры по региону, городу, категории, цене; параметры last_s/last_m для выборки за последние секунды/минуты (база обновляется постоянно — запрос раз в минуту, и вы видите новые объявления почти в реальном времени); форматы JSON/XML/CSV; до 1000 объявлений за запрос. История в базе — пропущенное окно можно выбрать по датам. Подключение к amoCRM/Bitrix24 — час работы интегратора или 15 минут по инструкции выше. Тестовый доступ к API — 15 дней. Тарифы и тест API →
Нужен ли отдельный сервер для поллера? Хватит любой виртуалки или хостинга с cron'ом и PHP — тяжёлых вычислений в цепочке нет. Публичный HTTPS-эндпоинт, как для вебхуков, не требуется: соединения идут только наружу.
Можно ли обойтись без кода — только штатными средствами CRM? Частично: и amoCRM, и Bitrix24 умеют простые интеграции, но получать поток объявлений по фильтрам площадки без промежуточного слоя не получится — нужен хотя бы тонкий скрипт-маппер.
Как часто опрашивать API, чтобы не пропустить «свежак»? Окно выборки чуть больше интервала запуска: cron раз в минуту + last_m=2. Для массовых категорий этого достаточно; раньше конкурентов вас выведет не частота опроса, а скорость звонка менеджера.
Что если скрипт упадёт и пропустит объявления? Ничего не теряется: источник хранит историю, после восстановления запросите пропущенный интервал по датам и создайте только отсутствующие лиды (сверка по ID объявления).
Форма подбора и расчета стоимости онлайн