Спецификация REST API и вебхуков
Нативный протокол приёма лидов с внешних веб-форм напрямую в сделки и чаты CRM, управление сеткой онлайн-записи и интеграция событий телефонии.
https://app-sandbox.aitomaton.online/api/public/forms/whk_aitomaton-demo_sitelead011. Приём заявок с веб-форм напрямую в сделки CRM
Эндпоинт предназначен для интеграции произвольных сайтов, лендингов (Tilda, WordPress, кастомный фронтенд на React/Vue) и мобильных приложений. Запрос обрабатывается ядром платформы: проверяется токен канала, создаётся или обновляется карточка клиента, создаётся сделка в первой стадии воронки и открывается диалог в инбоксе.
Content-Type: text/plain;charset=UTF-8 и параметр mode: 'no-cors'. Сервер автоматически распознает JSON-тело и зарегистрирует лид.Параметры URL:
| Параметр | Тип | Статус | Описание |
|---|---|---|---|
channel_token | string | Обязателен | Секретный токен канала в CRM. Формат: whk_{companyId}_{secret}. Для песочницы: whk_aitomaton-demo_sitelead01 |
Тело запроса (JSON Body):
| Поле | Тип | Статус | Описание и правила валидации |
|---|---|---|---|
name | string | Обязательно | Имя контакта или компании (от 2 до 120 символов). |
phone | string | Обязательно | Телефон контакта в международном формате (например, +7 777 123 45 67). Символы форматирования автоматически нормализуются. |
message | string | Опционально | Текст заявки, комментарий клиента или детали запроса. |
service | string | Опционально | Интересующая услуга (например: 1C:Предприятие, Asterisk PBX, Запись на демо). |
formname | string | Опционально | Название формы на сайте (например: Калькулятор потерь, Popup демо). |
page | string | Опционально | URL страницы, с которой отправлена заявка. |
utm_source | string | Опционально | Маркетинговый источник перехода (google, yandex, instagram, direct). |
consent | boolean | Обязательно | Согласие на обработку персональных данных (Закон РК № 94-V). Всегда true. |
Примеры отправки на разных языках программирования:
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)
Предназначен для виджетов онлайн-бронирования клиник, салонов красоты, СТО, автодилеров и образовательных центров:
https://aitomaton.online/api/public/booking/{slug}/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)}")https://aitomaton.online/api/public/booking/{slug}/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 в реальном времени:
https://aitomaton.online/api/telephony/eventscurl -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, сумма, саммари)4. Доступ к демо-песочнице для разработчиков
Для проверки сквозной интеграции без риска для боевых данных развёрнута демо-песочница с компанией Aitomaton Демо Стенд (aitomaton-demo).
[email protected]Aitomaton2026SafePassword!whk_aitomaton-demo_sitelead015. Безопасность и Закон РК № 94-V
Локализация данных в РК
Серверы и базы данных размещены в Казахстане в строгом соответствии с Законом РК № 94-V «О персональных данных и их защите».
Изоляция пространств (Door v1)
Все компании изолированы на уровне прав доступа. Попытка обращения с чужим токеном возвращает 404 без раскрытия схемы арендатора.
Шифрование и аудит
Все транзитные вызовы защищены TLS 1.3, пароли хэшируются Argon2id, а каждое действие логируется с correlation-id.