Инструкция для разработчиков, которым нужно программно отправлять заявки (лиды) в нашу CRM «Сделки» — со своего сайта, лендинга (Tilda и т. п.), формы обратной связи или внешней системы.

Во всех примерах https://<ваш-домен> — это домен API нашего сервиса (тот же, на котором открывается личный кабинет). Подставьте реальный адрес, который вам выдали.

1. Что это и когда использовать

Inbound API принимает входящие заявки и кладёт их во внутреннюю CRM «Сделки». Каждая принятая заявка превращается в лид → сделку в той воронке, к которой привязан ваш API-ключ. Дубли по номеру телефона автоматически объединяются — повторная отправка того же телефона не создаёт вторую сделку.

Используйте Inbound API, когда нужно:

  • принимать заявки с собственного сайта или конструктора (Tilda, Webflow, самописная форма);
  • переносить заявки из внешней системы (другая CRM, чат-бот, колл-центр);
  • интегрировать любой источник, который умеет делать HTTP-запрос.

Требуется активная подписка CRM «Сделки». После истечения подписки приём продолжает работать ещё 12 дней (grace-период), затем останавливается, пока подписку не продлят (ответ 403).

2. Получение API-ключа

API-ключ создаётся в личном кабинете: раздел Интеграции → Входящий API → создать ключ.

Ключ строго привязан к одному проекту и одной воронке — заявки по нему попадают только в эту воронку. «Глобальных» ключей на все проекты не бывает.

Формат ключа: dlv_live_ + 32 шестнадцатеричных символа (всего 41 символ), например dlv_live_8f3aabcd1234567890abcdef12345678.

⚠️ Секрет показывается только один раз — в момент создания (поле plaintext_key в ответе). Сохраните его сразу в надёжном месте. Если ключ потерян — его нельзя посмотреть повторно, нужно перевыпустить (regenerate). На сервере хранится только SHA-256-хэш ключа; в интерфейсе виден лишь префикс вида dlv_live_8f3a.

Операции над ключами доступны в личном кабинете:

ОперацияЧто делает
СоздатьВыпускает новый ключ для проекта + воронки, показывает секрет один раз
ПереименоватьМеняет отображаемое имя ключа
Перевыпустить (regenerate)Выдаёт новый секрет; старый сразу перестаёт работать
ОтозватьОтключает один ключ
Отозвать всеОтключает все ключи разом (выключает Входящий API целиком)

3. Аутентификация

Передавайте ключ в заголовке запроса — любым из двух способов:

Authorization: Bearer dlv_live_...

или

X-Api-Key: dlv_live_...

Все запросы выполняются по HTTPS. Тело запроса — JSON, заголовок Content-Type: application/json.

🔒 Храните ключ только на сервере. Не вставляйте его в JavaScript на публичной странице — иначе любой посетитель сможет его прочитать. При компрометации немедленно перевыпустите или отзовите ключ в личном кабинете.

4. Отправка заявки — POST /api/v1/inbound/leads

Основной эндпоинт. Принимает данные заявки и создаёт лид/сделку.

Поля тела запроса

ПолеТипОгр.Обяз.Описание
namestring | null≤ 255см. нижеИмя клиента
phonestring | null≤ 50см. нижеТелефон (формат не проверяется)
emailstring | null≤ 255см. нижеEmail (формат не проверяется)
messagestring | null≤ 5000нетКомментарий / текст обращения
sourcestring | null≤ 120нетИсточник заявки (например tilda, landing-contact). Показывается в карточке сделки
stageIdstring | null≤ 64нетЭтап воронки, куда положить сделку. Не указан / неизвестен → «Неразобранное»
utmobject (string→string)нетUTM-метки ({"source":"google","medium":"cpc"})
fieldsobject (string→string)нетКастомные поля воронки по их key (см. §5)
extraobjectнетПроизвольные дополнительные данные
positionsarray≤ 100нетСостав заказа (позиции). Попадают в карточку сделки
amountFromProductsbool | nullнетСчитать сумму сделки по позициям. null = как настроено в воронке

Обязательное правило: должно быть заполнено хотя бы одно из phone, email, name. Иначе — ответ 422 с сообщением Нужно указать хотя бы одно из: phone, email, name.

Поля позиции (positions[])

ПолеТипОгр.По умолч.Описание
namestring≤ 255""Название позиции
qtyinteger≥ 11Количество
priceinteger≥ 00Цена за единицу в рублях (целое)
catalogIdstring | null≤ 64nullСсылка на элемент каталога воронки. Если указан, name/price можно не передавать — подтянутся из каталога

Поля принимаются в обоих написаниях — camelCase и snake_case: stageId/stage_id, catalogId/catalog_id, amountFromProducts/amount_from_products.

Ответы

КодКогдаТело
201Новая заявка принята{"id": <lead_id>, "status": "created"}
200Дубль по телефону (объединён){"id": <lead_id>, "status": "repeat"}

При 201 запускается обработка: уведомления (email/Telegram) и создание сделки в CRM. При 200 заявка распознана как повтор — в обработку повторно не уходит (защита от дублей в CRM).

Пример: полный запрос

curl -X POST https://<ваш-домен>/api/v1/inbound/leads \
  -H "Authorization: Bearer dlv_live_8f3aabcd1234567890abcdef12345678" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Иван Петров",
    "phone": "+79991234567",
    "email": "ivan@example.com",
    "message": "Интересует премиум-пакет",
    "source": "tilda-contact",
    "stageId": "qualified",
    "utm": {"source": "google", "medium": "cpc", "campaign": "summer"},
    "fields": {"promo": "SUMMER50", "city": "Москва"},
    "positions": [
      {"name": "Премиум-пакет", "qty": 1, "price": 99000}
    ],
    "amountFromProducts": true
  }'

Ответ:

{ "id": 12345, "status": "created" }

Пример: минимальный запрос

curl -X POST https://<ваш-домен>/api/v1/inbound/leads \
  -H "X-Api-Key: dlv_live_8f3aabcd1234567890abcdef12345678" \
  -H "Content-Type: application/json" \
  -d '{ "phone": "+79991234567" }'

Повторная отправка того же телефона вернёт уже существующую сделку:

{ "id": 12345, "status": "repeat" }

5. Какие поля принимает воронка — GET /api/v1/inbound/fields

Вспомогательный эндпоинт для discovery: показывает, какая воронка привязана к ключу, какие этапы (stageId) доступны и какие кастомные поля можно передавать в fields.

Возвращаются только кастом-поля, которые настроены на заполнение через API (режим api или both); поля «только вручную» в список не попадают.

curl -X GET https://<ваш-домен>/api/v1/inbound/fields \
  -H "Authorization: Bearer dlv_live_8f3aabcd1234567890abcdef12345678"

Пример ответа:

{
  "standard": ["name", "phone", "email", "message"],
  "pipeline": { "id": "sales", "name": "Продажи" },
  "stages": [
    { "id": "unsorted", "label": "Неразобранное", "type": "unsorted" },
    { "id": "qualified", "label": "Квалифицирован", "type": "qualified" }
  ],
  "fields": [
    { "id": "f1", "key": "promo", "label": "Промокод", "type": "text", "required": false },
    { "id": "f2", "key": "city",  "label": "Город",    "type": "text", "required": true }
  ]
}

Как это связано с отправкой заявки:

  • значение stageId в POST — это один из stages[].id;
  • ключи объекта fields в POST — это значения fields[].key отсюда.

6. Ограничения и лимиты

  • Частота запросов: не более 60 запросов в минуту (суммарно на оба эндпоинта). При превышении — ответ 429.
  • Длины полей — см. таблицу в §4.
  • Позиции — не более 100 в одной заявке.

7. Коды ошибок

КодТело {"detail": ...}Причина и что делать
401API-ключ не передан.Заголовок с ключом отсутствует. Добавьте Authorization: Bearer … или X-Api-Key.
401Неверный API-ключ.Ключ невалиден или отозван. Проверьте/перевыпустите ключ.
400Ключ не привязан к проекту. Пересоздайте ключ, указав проект и воронку.Старый ключ без привязки. Создайте новый ключ с проектом и воронкой.
403Подписка CRM неактивна — приём заявок по API остановлен. Продлите подписку CRM «Сделки».Подписка истекла (grace-период прошёл). Продлите подписку.
422детали валидацииОшибка в теле запроса (в т. ч. правило «хотя бы один из phone/email/name»).
429Превышен лимит частоты (60/мин). Снизьте темп запросов.

8. Типовой сценарий интеграции

  1. В личном кабинете создайте API-ключ для нужного проекта и воронки. Сразу сохраните plaintext_key — он показывается один раз.
  2. (Опционально) Вызовите GET /api/v1/inbound/fields, чтобы узнать доступные stageId и ключи кастомных полей.
  3. На своём сервере / в обработчике формы отправляйте POST /api/v1/inbound/leads с ключом в заголовке.
  4. Обрабатывайте ответ: 201 created — новая заявка, 200 repeat — повтор; ошибки — по таблице §7.
  5. Храните ключ только на стороне сервера. При компрометации — перевыпустите или отзовите ключ в личном кабинете.