Как подтягивать объявления недвижимости и авто в amoCRM и Bitrix24 через API

Как подтягивать объявления недвижимости и авто в amoCRM и Bitrix24 через API

Схема: новые объявления — Rest-App API — поллер раз в минуту — лид в amoCRM или Bitrix24

Риэлторы и автоперекупы живут в CRM: лиды, сделки, касания. А объявления — во внешнем мире, и между «появилось объявление» и «менеджер позвонил» часто проходят часы. В этой статье — практическая схема, как доставлять новые объявления прямо в amoCRM/Bitrix24 через API и сократить это время до минут.

Зачем объявлениям место в CRM

Классический сценарий для агентства:

  1. Клиент оставил заявку: «ищу 2-комнатную в Южном Бутово до 12 млн».
  2. Менеджер вручную мониторит площадку и показывает варианты, когда «успеет зайти».
  3. К моменту показа половину вариантов уже сняли другие.

Если объявления прилетают в карточку клиента автоматически, воронка меняется: менеджер получает подборку сразу и звонит первым. На конкурентном рынке скорость — единственное, что риэлтор может контролировать.

Тот же механизм работает для перекупов авто: новое объявление в валидации «ниже рынка» → задача/звонок в течение 5–10 минут, пока машину не купили.

Архитектура: два рабочих подхода

1. Опрос API по таймеру (поллинг). Промежуточный скрипт раз в 30–60 секунд запрашивает у источника объявления за последние секунды/минуты и создаёт лиды в CRM. Ключевое условие — у API должен быть параметр «последние N минут» и сохранённая история, чтобы ни одно объявление не потерялось при сбое. При обновлении базы источника в реальном времени латентность такой схемы — меньше минуты.

2. Вебхуки. Источник сам присылает POST на ваш URL при появлении новых объявлений по фильтрам. Поддерживают их не все агрегаторы; если источник отдаёт данные только по запросу — вебхука нет, и поллинг из пункта 1 даёт почти ту же скорость.

Разница на практике: если ваш источник — pull-API (данные забирают запросом), не ищите в нём вебхуки — стройте поллер. Он предсказуем, отлаживается логом последнего окна выборки и не требует публичного HTTPS-эндпоинта.

Пример: PHP-поллер к API объявлений → лиды в amoCRM

Скрипт запускается 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 минут/секунд».

Bitrix24: создание лида через входящий вебхук

В Битрикс24 создание лида — вызов crm.lead.add через входящий вебхук (/rest/{код}/crm.lead.add/). Тот же поллер вместо вызова amoCRM дёргает этот URL с маппингом полей на карточку лида или задачи. Полезный приём: в поле «Описание» задачи сразу отдавать 3–5 лучших объявлений по фильтру, а не одно — менеджеру есть из чего выбрать.

Поля, без которых интеграция бессмысленна

Из практики, минимально необходимый набор в выгрузке:

  • ID объявления — чтобы не дублировать лиды при повторной доставке;
  • Ссылка на первоисточник — менеджер должен одним кликом открыть объявление;
  • Цена и дата подачи — скорость и «возраст» лида;
  • Гео (город, адрес, метро) — для маршрутизации между менеджерами/филиалами;
  • Фото — карточка без фото продаётся хуже, в прямом смысле.

Если ваш источник данных не отдаёт часть полей — интеграция превратится в ручной добор информации, и менеджер быстро вернётся к ручному мониторингу.

Подводные камни

  • Дубликаты. Одно объявление может пересоздаваться (повторная публикация, смена цены). Дедуплицируйте по ID объявления во внешнем поле CRM, иначе воронка утонет в мусоре.
  • Окна перекрываются, а не стыкуются. Поллер с окном 2 минуты при запуске раз в минуту имеет перекрытие — это нормально (страховка от сбоев), именно поэтому нужна дедупликация по ID.
  • Rate-лимиты CRM. Не создавайте лиды по одному запросу на каждое объявление в пике: группируйте и соблюдайте лимиты amoCRM/Битрикс24.
  • Простой поллера. Если скрипт упал на час — после восстановления запросите пропущенное окно по датам (date1/date2), а не «последние 2 минуты»: история хранится на стороне источника, объявления не теряются.
  • Эскалация просрочки. Если лид из объявления не взят в работу за 15 минут — автоэскалация руководителю. Скорость имеет смысл только с дисциплиной.

Готовая связка с Rest-App

API Rest-App отдаёт объявления Avito, Cian, Auto.ru, Drom, Youla и других площадок: фильтры по региону, городу, категории, цене; параметры last_s/last_m для выборки за последние секунды/минуты (база обновляется постоянно — запрос раз в минуту, и вы видите новые объявления почти в реальном времени); форматы JSON/XML/CSV; до 1000 объявлений за запрос. История в базе — пропущенное окно можно выбрать по датам. Подключение к amoCRM/Bitrix24 — час работы интегратора или 15 минут по инструкции выше. Тестовый доступ к API — 15 дней. Тарифы и тест API →

FAQ

Нужен ли отдельный сервер для поллера? Хватит любой виртуалки или хостинга с cron'ом и PHP — тяжёлых вычислений в цепочке нет. Публичный HTTPS-эндпоинт, как для вебхуков, не требуется: соединения идут только наружу.

Можно ли обойтись без кода — только штатными средствами CRM? Частично: и amoCRM, и Bitrix24 умеют простые интеграции, но получать поток объявлений по фильтрам площадки без промежуточного слоя не получится — нужен хотя бы тонкий скрипт-маппер.

Как часто опрашивать API, чтобы не пропустить «свежак»? Окно выборки чуть больше интервала запуска: cron раз в минуту + last_m=2. Для массовых категорий этого достаточно; раньше конкурентов вас выведет не частота опроса, а скорость звонка менеджера.

Что если скрипт упадёт и пропустит объявления? Ничего не теряется: источник хранит историю, после восстановления запросите пропущенный интервал по датам и создайте только отсутствующие лиды (сверка по ID объявления).

Форма подбора и расчета стоимости онлайн
Дата публикации: 26.10.2026
Если Вам требуется база или данные для аналитики, Вы всегда можете обратиться по телефонам: +7 (499) 991-71-61, +7 (926) 008-99-04 или по почте info@rest-app.net. Мы будем рады Вам помочь!