Интеграция с CRM через REST API
Notix предоставляет публичный REST API для интеграции с внешними системами: вашей CRM, парсером, ERP или собственным скриптом. Аутентификация — по Bearer-токену с префиксом ntx_live_ или ntx_test_. Этот API отделён от webhook'а и SDK: токены выпускаются отдельно, с TTL и scopes.
Когда использовать API-токен, а не webhook?
Webhook — это «наоборот»: вы отправляете уведомления в Notix по запросу с вашего сервера. API-токен — это вы забираете данные из Notix или заливаете клиентов: например, импорт базы из старой CRM, периодическая сверка, веб-скрапер.
Как получить токен
Откройте личный кабинет → раздел «Доступы» → вкладка «API-токены» → кнопка «+ Сгенерировать токен».
- Укажите название (например, «Парсер Avito»)
- Выберите среду: Test или Live (для боевых интеграций)
- Отметьте scopes — права, которые нужны вашему скрипту
- Выберите срок действия: месяц / полгода / год / бессрочно
- Нажмите «Создать». Сразу скопируйте токен — мы его больше не покажем
Plain token показывается ОДИН раз
После создания токен отображается в модальном окне с жёлтым предупреждением. Сохраните его в надёжном месте (секрет-менеджер, переменные окружения). Если потеряете — придётся перевыпустить.
Аутентификация
Токен передаётся в заголовке Authorization в формате Bearer:
Authorization: Bearer ntx_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxПрефикс ntx_live_ — боевой, ntx_test_ — тестовый (для разработки и отладки). Токены валидируются по hash в БД: даже при утечке prefix'а сам токен не восстановить.
Scopes (права)
Каждый токен выпускается с конкретным набором scopes — это минимальные права, которые нужны интеграции. Назначить лишний scope нельзя: если токен выдан с leads.bulk, он не сможет, например, читать ваши уведомления.
| Scope | Что разрешает |
|---|---|
| leads.bulk | Массовый импорт лидов через POST /api/v1/integration/leads/bulk (до 100 за запрос, идемпотентно по phone_hash). См. Импорт клиентов. |
| customers.merge | Слияние дублей клиентов по phone / email. Используйте при сверке с внешней CRM. |
Эндпоинты
1. Health check
GET /api/v1/integration/healthПроверка доступности сервиса. Bearer-токен не нужен — можно пинговать из мониторинга. Возвращает время сервера и версию бандла.
2. Импорт лидов
POST /api/v1/integration/leads/bulkМассовый импорт клиентов (до 100 за запрос). Идемпотентно по phone: повторный вызов с тем же телефоном обновит существующего клиента, а не создаст дубль. Подробный пример payload и ответов — на странице Импорт клиентов.
3. Проверка клиента
POST /api/v1/integration/customers/checkПроверить, есть ли клиент с указанным телефоном или email в вашей базе. Удобно перед импортом, чтобы не дублировать записи. Параметры: phone, email (хотя бы один).
Примеры
TOKEN='ntx_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
# Health (без токена)
curl https://notix-hub.ru/api/v1/integration/health
# Импорт одного лида
curl -X POST https://notix-hub.ru/api/v1/integration/leads/bulk \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"leads":[{"name":"Иван Петров","phone":"+7 917 000-00-00","email":"ivan@example.com"}]}'
# Проверка клиента по телефону
curl -X POST https://notix-hub.ru/api/v1/integration/customers/check \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"phone":"+7 917 000-00-00"}'<?php
$token = 'ntx_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
$base = 'https://notix-hub.ru/api/v1/integration';
$ch = curl_init($base . '/leads/bulk');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $token,
'Content-Type: application/json',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
'leads' => [
['name' => 'Иван Петров', 'phone' => '+7 917 000-00-00', 'email' => 'ivan@example.com'],
],
], JSON_UNESCAPED_UNICODE));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
print_r($data);import requests
token = "ntx_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
base = "https://notix-hub.ru/api/v1/integration"
headers = {
"Authorization": f"Bearer {token}",
"Content-Type": "application/json",
}
# Импорт одного лида
response = requests.post(
f"{base}/leads/bulk",
json={"leads": [
{"name": "Иван Петров", "phone": "+7 917 000-00-00", "email": "ivan@example.com"}
]},
headers=headers,
)
print(response.json())
# Проверка клиента
response = requests.post(
f"{base}/customers/check",
json={"phone": "+7 917 000-00-00"},
headers=headers,
)
print(response.json())TTL и ротация
Токен действует до выбранного TTL: месяц, полгода, год или бессрочно. По истечении срока API автоматически отклоняет запросы с кодом 401 Integration token expired. Не используйте токен вечно: регулярная ротация снижает риск утечки.
Best practices
- Используйте отдельные токены для разных интеграций. Если парсер Avito скомпрометирован — отзываете только его, остальные интеграции продолжают работать.
- Не встраивайте токен в публичный код. Токен — серверный секрет. Для браузера есть JS SDK с другим типом токена.
- Проверяйте статус перед критичными операциями. Если интеграция перестала работать — зайдите в раздел «API-токены» и проверьте, не истёк ли срок.
- Логируйте ошибки 401/403. Это почти всегда означает проблему с токеном: отозван, истёк или scope не выдан.
Коды ошибок
| Код | Когда |
|---|---|
| 201 Created | Лиды созданы/обновлены. В ответе — {processed, results: [{ok, client_id, created}]} |
| 200 OK | Health/check. {ok: true, found: bool, client?: {...}} |
| 401 Unauthorized | Токен невалиден, отозван или истёк. Проверьте раздел «API-токены» |
| 403 Forbidden | Scope не выдан этому токену. Создайте новый с нужным scope или добавьте scope к существующему |
| 422 Unprocessable | Невалидный payload (массив leads пуст или больше 100 элементов) |
Что дальше
- Импорт клиентов через leads/bulk — подробный пример payload, ответы, дедупликация, обработка ошибок
- Webhook API — обратный канал (вы → Notix). Для отправки уведомлений и лидов
- JS SDK — для сбора метрик и событий с сайта