DialogCRM · API

Webhook для приёма лидов

Принимает заявки с ваших форм, лендингов, Tilda и сторонних сервисов и автоматически создаёт лиды в DialogCRM.

POST https://dialogsystems.ru/api/webhooks/lead

Авторизация

Каждый запрос должен содержать заголовок X-API-KEY с вашим личным ключом. Ключ находится в кабинете DialogCRM: Настройки → Интеграции → Public API & Webhooks.

Поддерживаются два типа ключей:

Не публикуйте ключ в открытом коде (HTML формы, фронтенд JS). Запросы должны уходить с серверной стороны или из защищённой среды. Ключ даёт полный доступ к созданию лидов в вашей CRM.

Тело запроса (JSON)

ПолеТипОписание
name обязательноstringИмя клиента
phone phone или emailstringТелефон в любом формате
email phone или emailstringEmail клиента
city опц.stringГород
budget опц.numberБюджет (целое число)
source опц.stringИсточник, например Tilda, Лендинг
comment опц.stringПроизвольный комментарий, сохранится в активити лида

Примеры

Замените YOUR_API_KEY на ваш ключ из кабинета.

curl -X POST https://dialogsystems.ru/api/webhooks/lead \
  -H "Content-Type: application/json" \
  -H "X-API-KEY: YOUR_API_KEY" \
  -d '{
    "name":   "Иван Иванов",
    "phone":  "+79991234567",
    "email":  "ivan@example.com",
    "city":   "Москва",
    "budget": 100000,
    "source": "Лендинг",
    "comment":"Интересует тариф Pro"
  }'
// Браузерный fetch — только для серверных скриптов или защищённого окружения!
const response = await fetch('https://dialogsystems.ru/api/webhooks/lead', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'X-API-KEY': 'YOUR_API_KEY'
  },
  body: JSON.stringify({
    name: 'Иван Иванов',
    phone: '+79991234567',
    email: 'ivan@example.com',
    source: 'Лендинг'
  })
});

const data = await response.json();
console.log(data);
import fetch from 'node-fetch'; // или встроенный fetch в Node 18+

const res = await fetch('https://dialogsystems.ru/api/webhooks/lead', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'X-API-KEY': process.env.DIALOGCRM_API_KEY
  },
  body: JSON.stringify({
    name: 'Иван Иванов',
    phone: '+79991234567',
    source: 'Tilda'
  })
});

console.log(res.status, await res.json());
<?php
$ch = curl_init('https://dialogsystems.ru/api/webhooks/lead');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type: application/json',
    'X-API-KEY: YOUR_API_KEY',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
    'name'   => 'Иван Иванов',
    'phone'  => '+79991234567',
    'email'  => 'ivan@example.com',
    'source' => 'Лендинг',
]));

$response = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

echo "HTTP $code\n$response";
import requests

r = requests.post(
    'https://dialogsystems.ru/api/webhooks/lead',
    headers={
        'Content-Type': 'application/json',
        'X-API-KEY': 'YOUR_API_KEY',
    },
    json={
        'name': 'Иван Иванов',
        'phone': '+79991234567',
        'email': 'ivan@example.com',
        'source': 'Лендинг',
    },
    timeout=10,
)

print(r.status_code, r.json())

В Tilda откройте Настройки сайта → Формы → Webhook и добавьте новый Webhook:

В форме настройте имена полей: name, phone, email — именно так Tilda их и отправит. Дополнительно можно добавить hidden-поле source со значением, например, Tilda · landing-name.

Если Tilda не позволяет указать кастомный заголовок, используйте промежуточный сервис (Albato, Make, n8n) или передавайте ключ как поле X-API-KEY в теле — тогда нужен серверный прокси.

Ответы

201 Created — создан новый лид

{
  "success": true,
  "message": "Lead created successfully",
  "leadId":  "8f3c1b1e-3a4d-4f2e-9c1d-7b8a2f0d4e21"
}

200 OK — найден дубль, новый лид НЕ создан

Если в вашей компании уже есть лид с таким же телефоном или email, новый лид не создаётся. Вместо этого самый свежий существующий лид «оживляется» — возвращается на первый этап своей воронки, менеджеру добавляется заметка о повторной заявке. В leadId приходит id этого существующего лида.

{
  "success": true,
  "deduped": true,
  "message": "Duplicate detected — existing lead revived",
  "leadId":  "8f3c1b1e-3a4d-4f2e-9c1d-7b8a2f0d4e21"
}
Обрабатывайте 200 deduped как успех. Различайте случаи по HTTP-коду, а не по наличию leadId — он есть в обоих ответах. Ретраи безопасны: повторная отправка тех же контактов не плодит дубли.

Ошибки

HTTPТелоКогда
400{"error":"Missing required fields: name AND (phone OR email)."}Не передан name либо нет ни phone, ни email
400{"error":"Cannot process webhook: Company has no configured funnels."}В компании ещё не настроена ни одна воронка
401{"error":"API Key missing. Use X-API-KEY header."}Не передан заголовок X-API-KEY
403{"error":"Invalid API Key."}Ключ не найден или был перевыпущен
403{"error":"HTTPS required for API Key authentication."}Запрос отправлен по HTTP, а не HTTPS
429{"error":"Too many webhook requests..."}Превышен лимит — см. ниже
500{"error":"Internal Server Error"}Внутренняя ошибка сервера. Если повторяется — напишите в поддержку

Лимиты и правила

Что делать, если ключ скомпрометирован

Откройте Настройки → Интеграции → Public API & Webhooks и нажмите «Обновить». Старый ключ перестанет работать сразу, новый нужно прописать во всех ваших интеграциях.

Booking API — онлайн-запись (v1)

Открытый API модуля «Онлайн-запись»: показывайте услуги, свободные слоты и записывайте клиентов из своего сайта или приложения.

Авторизация не требуется: адресом служит публичный slug опубликованной страницы записи (вкладка «Витрина» в CRM). Все ответы — JSON с полем ok.

GET/api/public/booking/v1/{slug}

Витрина: страница (название, оформление, таймзона, правила записи), категории, услуги (id, name, durationMin, priceMode, price, isOnline, staffIds) и мастера (id, name, jobTitle, photo).

GET/api/public/booking/v1/{slug}/slots?serviceId=…&date=YYYY-MM-DD[&staffId=…]

Свободные слоты дня в таймзоне страницы: [{ time: "10:00", startsAt: "…ISO…", staffIds: [...] }]. Без staffId — объединение по всем мастерам услуги («любой мастер»).

POST/api/public/booking/v1/{slug}/book

Создать запись. Тело: serviceId, startsAt (ISO из слота), name, phone, consent: true (согласие 152-ФЗ — обязательно), опционально staffId, email, comment, src (метка канала для отчёта «Откуда записываются»). Ответ 201: booking.token — ссылка клиента на управление записью: /book/{slug}?m={token}.

Поддерживается заголовок Idempotency-Key (до 80 символов): повтор запроса с тем же ключом вернёт 200 с той же записью — безопасные ретраи.

GET/api/public/booking/v1/manage/{token}
POST/api/public/booking/v1/manage/{token}/cancel

Просмотр и отмена записи по клиентскому токену (отмена доступна до дедлайна, заданного компанией).

Коды ошибок

Готовый виджет вместо интеграции: кнопку «Записаться» или форму записи можно встроить на сайт одной строкой — код в CRM: Онлайн-запись → Витрина → «Где разместить ссылку».

REST API v1 — лиды (модуль «Публичный API»)

Полноценный доступ к лидам вашей CRM для собственных интеграций: чтение и создание по токену.

Подключите модуль «Публичный API и вебхуки» в Маркетплейсе, затем в Центре интеграций выпустите токен (карточка модуля → «API и вебхуки»). Токен показывается один раз — сохраните его сразу. Права задаются на выпуске: leads:read (чтение), leads:write (создание).

Авторизация — заголовком: Authorization: Bearer dcrm_…. Лимит: 120 запросов в минуту на токен. Отзыв токена в CRM закрывает доступ немедленно.

GET/api/v1/leads?limit=50&offset=0[&funnelId=…][&stageId=…]

Список лидов (новые первыми): { total, limit, offset, leads: [{ id, name, phone, email, budget, paidAmount, funnelId, stageId, managerId, tags, source, createdAt }] }. Максимум 100 за запрос.

GET/api/v1/leads/{id}

Один лид тем же составом полей. Чужой или несуществующий id — 404.

POST/api/v1/leads

Создать лида. Тело: name (обязательно), опционально phone, email, city, budget, source, utmSource, tags, funnelId (по умолчанию — первая воронка). Лид попадает на первый этап без ответственного — распределение выполняют ваши автоматизации (событие «Лид создан»). Ответ 201 — созданный лид.

Исходящие вебхуки

Мы сами уведомим ваш сервер о событиях сделок — без поллинга.

Подписки создаются там же («API и вебхуки»): укажите https-адрес приёмника и события — lead.created, lead.stage_changed, lead.assigned, lead.won, lead.lost, task.completed, lead.payment_received. При создании выдаётся секрет whsec_… (показывается один раз).

На событие приходит POST с JSON { event, companyId, occurredAt, lead: {…} } и заголовками X-DialogCRM-Event, X-DialogCRM-Delivery (id доставки — для дедупликации) и X-DialogCRM-Signature — HMAC-SHA256 тела запроса вашим секретом (hex). Проверяйте подпись и отвечайте 2xx в пределах 10 секунд.

Недоставленные события ретраятся через 1 мин / 5 мин / 30 мин / 2 часа. После 20 неудачных доставок подряд подписка автоматически выключается (админы получат уведомление) — включите её заново после починки приёмника; лог доставок виден в CRM.