Интеграция с 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-токены» → кнопка «+ Сгенерировать токен».

  1. Укажите название (например, «Парсер Avito»)
  2. Выберите среду: Test или Live (для боевых интеграций)
  3. Отметьте scopes — права, которые нужны вашему скрипту
  4. Выберите срок действия: месяц / полгода / год / бессрочно
  5. Нажмите «Создать». Сразу скопируйте токен — мы его больше не покажем

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 OKHealth/check. {ok: true, found: bool, client?: {...}}
401 UnauthorizedТокен невалиден, отозван или истёк. Проверьте раздел «API-токены»
403 ForbiddenScope не выдан этому токену. Создайте новый с нужным scope или добавьте scope к существующему
422 UnprocessableНевалидный payload (массив leads пуст или больше 100 элементов)

Что дальше