REST API v1Production-readyZero-config Ingest

Спецификация REST API и вебхуков

Нативный протокол приёма лидов с внешних веб-форм напрямую в сделки и чаты CRM, управление сеткой онлайн-записи и интеграция событий телефонии.

POSThttps://app-sandbox.aitomaton.online/api/public/forms/whk_aitomaton-demo_sitelead01

1. Приём заявок с веб-форм напрямую в сделки CRM

Эндпоинт предназначен для интеграции произвольных сайтов, лендингов (Tilda, WordPress, кастомный фронтенд на React/Vue) и мобильных приложений. Запрос обрабатывается ядром платформы: проверяется токен канала, создаётся или обновляется карточка клиента, создаётся сделка в первой стадии воронки и открывается диалог в инбоксе.

💡
Рекомендация для веб-разработчиков (Frontend / Tilda / React):Чтобы браузер отправлял форму моментально без предварительного запроса (preflight OPTIONS), используйте заголовок Content-Type: text/plain;charset=UTF-8 и параметр mode: 'no-cors'. Сервер автоматически распознает JSON-тело и зарегистрирует лид.

Параметры URL:

ПараметрТипСтатусОписание
channel_tokenstringОбязателенСекретный токен канала в CRM. Формат: whk_{companyId}_{secret}. Для песочницы: whk_aitomaton-demo_sitelead01

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

ПолеТипСтатусОписание и правила валидации
namestringОбязательноИмя контакта или компании (от 2 до 120 символов).
phonestringОбязательноТелефон контакта в международном формате (например, +7 777 123 45 67). Символы форматирования автоматически нормализуются.
messagestringОпциональноТекст заявки, комментарий клиента или детали запроса.
servicestringОпциональноИнтересующая услуга (например: 1C:Предприятие, Asterisk PBX, Запись на демо).
formnamestringОпциональноНазвание формы на сайте (например: Калькулятор потерь, Popup демо).
pagestringОпциональноURL страницы, с которой отправлена заявка.
utm_sourcestringОпциональноМаркетинговый источник перехода (google, yandex, instagram, direct).
consentbooleanОбязательноСогласие на обработку персональных данных (Закон РК № 94-V). Всегда true.

Примеры отправки на разных языках программирования:

POST /api/public/forms/...
curl -X POST https://app-sandbox.aitomaton.online/api/public/forms/whk_aitomaton-demo_sitelead01 \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Айдар Нургалиев",
    "phone": "+7 777 123 45 67",
    "message": "Тестовая заявка на демонстрацию платформы",
    "service": "Демо-доступ",
    "formname": "Запись на демо",
    "page": "https://aitomaton.online/#popup:myform",
    "utm_source": "google_cpc",
    "consent": true
  }'
// Отправка заявки из браузера (React, Vue, Tilda, кастомный лендинг)
const payload = {
  name: "Айдар Нургалиев",
  phone: "+7 777 123 45 67",
  message: "Тестовая заявка на демонстрацию платформы",
  service: "Демо-доступ",
  formname: "Запись на демо",
  page: document.URL,
  utm_source: new URLSearchParams(location.search).get("utm_source") || "direct",
  consent: true
};

// text/plain и mode: 'no-cors' гарантируют отправку без лишнего preflight OPTIONS
fetch("https://app-sandbox.aitomaton.online/api/public/forms/whk_aitomaton-demo_sitelead01", {
  method: "POST",
  headers: { "Content-Type": "text/plain;charset=UTF-8" },
  body: JSON.stringify(payload),
  mode: "no-cors"
})
.then(() => console.log("Заявка успешно отправлена в CRM"))
.catch((err) => console.error("Ошибка сети:", err));
import requests

url = "https://app-sandbox.aitomaton.online/api/public/forms/whk_aitomaton-demo_sitelead01"
payload = {
    "name": "Айдар Нургалиев",
    "phone": "+7 777 123 45 67",
    "message": "Тестовая заявка на демонстрацию платформы",
    "service": "Демо-доступ",
    "formname": "Запись на демо",
    "page": "https://aitomaton.online/",
    "utm_source": "python_backend",
    "consent": True,
}

response = requests.post(url, json=payload, timeout=10)
if response.status_code == 200:
    data = response.json()
    print(f"Сделка создана: ID={data.get('deal')}, Клиент={data.get('client')}")
else:
    print(f"Ошибка {response.status_code}: {response.text}")
<?php
$webhookUrl = 'https://app-sandbox.aitomaton.online/api/public/forms/whk_aitomaton-demo_sitelead01';

$payload = [
    'name'       => 'Айдар Нургалиев',
    'phone'      => '+7 777 123 45 67',
    'message'    => 'Тестовая заявка на демонстрацию платформы',
    'service'    => 'Демо-доступ',
    'formname'   => 'Запись на демо',
    'page'       => 'https://aitomaton.online/',
    'utm_source' => 'php_backend',
    'consent'    => true,
];

$ch = curl_init($webhookUrl);
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Content-Type: application/json'],
    CURLOPT_POSTFIELDS     => json_encode($payload),
    CURLOPT_TIMEOUT        => 10,
]);

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

if ($httpCode === 200) {
    $result = json_decode($response, true);
    echo "Сделка создана! ID: " . $result['deal'];
}
import axios from 'axios';

const webhookUrl = 'https://app-sandbox.aitomaton.online/api/public/forms/whk_aitomaton-demo_sitelead01';

const payload = {
  name: 'Айдар Нургалиев',
  phone: '+7 777 123 45 67',
  message: 'Тестовая заявка на демонстрацию платформы',
  service: 'Демо-доступ',
  formname: 'Запись на демо',
  page: 'https://aitomaton.online/',
  utm_source: 'node_microservice',
  consent: true
};

try {
  const { data } = await axios.post(webhookUrl, payload, { timeout: 10000 });
  console.log(`Успех! Сделка: ${data.deal}, Чат: ${data.chat}, Клиент: ${data.client}`);
} catch (error) {
  console.error('Ошибка создания заявки:', error.response?.data || error.message);
}

Коды ответов сервера (HTTP Statuses):

КодСтатусОписание ответа
200 OKУспешноЗаявка принята, создана сделка, клиент и чат в CRM. Возвращается JSON: {"status":"ok","outcome":"written","deal":"...","client":"..."}
400 Bad RequestОшибка валидацииНе передано имя или телефон, либо повреждена JSON-структура тела запроса.
404 Not FoundНеверный токенКанал с данным токеном не существует, отключён администратором или не найден в компании.
429 Rate LimitedЛимит запросовСработал встроенный ограничитель частоты запросов от спама.

2. Публичный API онлайн-записи (Booking API)

Предназначен для виджетов онлайн-бронирования клиник, салонов красоты, СТО, автодилеров и образовательных центров:

GEThttps://aitomaton.online/api/public/booking/{slug}/slots

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

GET /slots
curl -X GET "https://aitomaton.online/api/public/booking/fx2-salon/slots?resource_id=01a187a2-629b-73f2-9f3f-878a5f1b92c5&date=2026-11-15" \
  -H "Accept: application/json"
const params = new URLSearchParams({
  resource_id: '01a187a2-629b-73f2-9f3f-878a5f1b92c5',
  date: '2026-11-15'
});

const res = await fetch(`https://aitomaton.online/api/public/booking/fx2-salon/slots?${params}`);
const { slots } = await res.json();
console.log('Доступные слоты:', slots);
import requests

url = "https://aitomaton.online/api/public/booking/fx2-salon/slots"
params = {
    "resource_id": "01a187a2-629b-73f2-9f3f-878a5f1b92c5",
    "date": "2026-11-15"
}

resp = requests.get(url, params=params, timeout=5)
slots = resp.json().get("slots", [])
print(f"Найдено свободных слотов: {len(slots)}")
POSThttps://aitomaton.online/api/public/booking/{slug}/book

Бронирование выбранного слота клиентом с моментальной фиксацией в расписании:

POST /book
curl -X POST https://aitomaton.online/api/public/booking/fx2-salon/book \
  -H "Content-Type: application/json" \
  -d '{
    "client_name": "Карина Ахметова",
    "client_phone": "+77028889900",
    "resource_id": "01a187a2-629b-73f2-9f3f-878a5f1b92c5",
    "service_id": "srv_dentistry_consult_01",
    "slot_start": "2026-11-15T15:30:00+05:00"
  }'
const bookingData = {
  client_name: "Карина Ахметова",
  client_phone: "+77028889900",
  resource_id: "01a187a2-629b-73f2-9f3f-878a5f1b92c5",
  service_id: "srv_dentistry_consult_01",
  slot_start: "2026-11-15T15:30:00+05:00"
};

const res = await fetch("https://aitomaton.online/api/public/booking/fx2-salon/book", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify(bookingData)
});
const result = await res.json();
console.log("Номер бронирования:", result.booking_id);
import requests

booking_payload = {
    "client_name": "Карина Ахметова",
    "client_phone": "+77028889900",
    "resource_id": "01a187a2-629b-73f2-9f3f-878a5f1b92c5",
    "service_id": "srv_dentistry_consult_01",
    "slot_start": "2026-11-15T15:30:00+05:00",
}

res = requests.post("https://aitomaton.online/api/public/booking/fx2-salon/book", json=booking_payload)
print("Бронь подтверждена:", res.json())

3. Вебхуки телефонии и SIP-транков

Интеграция с АТС Asterisk (AMI/ARI) и облачными операторами связи Казахстана для передачи статусов вызовов в CRM в реальном времени:

POSThttps://aitomaton.online/api/telephony/events
POST /api/telephony/events
curl -X POST https://aitomaton.online/api/telephony/events \
  -H "Content-Type: application/json" \
  -H "X-Station-Key: sha256_station_fingerprint_here" \
  -d '{
    "event": "call.completed",
    "call_id": "ast-1731189000.1245",
    "caller": "+77015554433",
    "callee": "+77273110022",
    "direction": "inbound",
    "duration_sec": 142,
    "status": "answered",
    "recording_url": "https://pbx.company.kz/records/1731189000.mp3",
    "summary": "Клиент интересовался стоимостью ТО и записался на субботу 14:00"
  }'
import requests

url = "https://aitomaton.online/api/telephony/events"
headers = {
    "Content-Type": "application/json",
    "X-Station-Key": "sha256_station_fingerprint_here"
}
payload = {
    "event": "call.completed",
    "call_id": "ast-1731189000.1245",
    "caller": "+77015554433",
    "callee": "+77273110022",
    "duration_sec": 142,
    "status": "answered",
    "summary": "Запись на ТО автомобиля Camry 70"
}

res = requests.post(url, json=payload, headers=headers)
print("Событие телефонии зарегистрировано:", res.status_code)

Поддерживаемые типы событий:

call.started — вызов поступил в очередь или на транк
call.transcribed — распознанная реплика (STT на казахском / русском)
call.completed — вызов завершён, аудиозапись прикреплена к сделке
call.analyzed — автоматическая квалификация (BANT, сумма, саммари)
Готово к тестированиюТестовый стенд (Sandbox)

4. Доступ к демо-песочнице для разработчиков

Для проверки сквозной интеграции без риска для боевых данных развёрнута демо-песочница с компанией Aitomaton Демо Стенд (aitomaton-demo).

Веб-интерфейс CRM:https://app-sandbox.aitomaton.online/
Логин администратора:[email protected]
Пароль песочницы:Aitomaton2026SafePassword!
Токен вебхука:whk_aitomaton-demo_sitelead01

5. Безопасность и Закон РК № 94-V

Локализация данных в РК

Серверы и базы данных размещены в Казахстане в строгом соответствии с Законом РК № 94-V «О персональных данных и их защите».

Изоляция пространств (Door v1)

Все компании изолированы на уровне прав доступа. Попытка обращения с чужим токеном возвращает 404 без раскрытия схемы арендатора.

Шифрование и аудит

Все транзитные вызовы защищены TLS 1.3, пароли хэшируются Argon2id, а каждое действие логируется с correlation-id.