Повна документація REST API для інтеграції з CRM-системою IT CITY
https://crm.its.te.ua/apiДва способи авторизації: API ключ (рекомендовано для інтеграцій) або Session Cookie (браузер).
Налаштування → API ключі → Створити ключ (тільки ADMIN)
GET /api/tickets
Authorization: Bearer itc_a1b2c3d4e5f6789...
Content-Type: application/json
| Поле | Опис |
|---|---|
| Назва | Довільна назва (Postman, Integration, Monitoring...) |
| Термін дії | 7д / 30д / 90д / 1 рік / безстроковий |
| Метод | URL | Опис |
|---|---|---|
| GET | /api/api-keys | Список активних ключів |
| POST | /api/api-keys | Створити новий ключ |
| DEL | /api/api-keys?id=N | Відкликати ключ |
⚠️ Ключ показується тільки при створенні. Зберігається як SHA-256 хеш.
Реєстрація, відновлення пароля та управління сесіями. Ендпоінти мають підвищений rate limiting.
{
"name": "Іван Петренко",
"email": "ivan@example.com",
"password": "securePassword123",
"role": "TECH"
}
| Поле | Тип | Опис |
|---|---|---|
| name | string required | Повне ім'я користувача |
| string required | Email адреса | |
| password | string required | Пароль (мінімум 8 символів) |
| role | enum | ADMIN | MANAGER | TECH (за замовчуванням TECH) |
{
"id": "clx1abc...",
"name": "Іван Петренко",
"email": "ivan@example.com",
"role": "TECH"
}
{
"email": "ivan@example.com"
}
{
"message": "Якщо email існує, лист з інструкціями відправлено"
}
{
"token": "reset-token-from-email",
"password": "newSecurePassword456"
}
{
"message": "Пароль успішно змінено"
}
CRUD-операції із заявками, масові дії, обладнання, фото та коментарі.
| Параметр | Тип | Опис |
|---|---|---|
| status | string | Фільтр за статусом: NEW, IN_PROGRESS, COMPLETED, CANCELLED |
| assigneeId | string | ID виконавця |
| storeId | string | ID торгової точки |
| q | string | Пошук за заголовком, описом, номером |
| page | number | Номер сторінки (за замовчуванням 1) |
| sortField | string | Поле сортування: createdAt, updatedAt, status, number |
| sortDir | string | Напрямок: asc | desc |
{
"tickets": [
{
"id": "clx1abc...",
"number": 1042,
"title": "Не працює принтер",
"status": "NEW",
"store": { "id": "...", "name": "Магазин #5" },
"assignee": { "id": "...", "name": "Олег Коваль" },
"createdAt": "2026-03-28T10:00:00.000Z"
}
],
"total": 156,
"page": 1,
"totalPages": 16
}
{
"title": "Заміна картриджа",
"description": "Потрібно замінити картридж у принтері HP LaserJet",
"storeId": "clx1store...",
"assigneeId": "clx1user...",
"priority": "HIGH",
"categoryId": "clx1cat...",
"scheduledAt": "2026-04-05T10:00:00.000Z",
"scheduledEndAt": "2026-04-05T12:00:00.000Z",
"isPlanned": true
}
| Поле | Тип | Опис |
|---|---|---|
| title | string required | Заголовок заявки |
| description | string | Детальний опис |
| storeId | string required | ID торгової точки |
| assigneeId | string | ID виконавця |
| priority | enum | LOW | MEDIUM | HIGH | CRITICAL |
| categoryId | string | ID категорії заявки |
| scheduledAt | datetime | Дата та час запланованого виїзду (ISO 8601) |
| scheduledEndAt | datetime | Дата та час завершення (ISO 8601) |
| isPlanned | boolean | Позначити як плановий виїзд |
{
"id": "clx1new...",
"number": 1043,
"title": "Заміна картриджа",
"status": "NEW",
"createdAt": "2026-03-28T12:00:00.000Z"
}
{
"status": "COMPLETED",
"completionNote": "Картридж замінено",
"gpsLat": 49.5535,
"gpsLng": 25.5948
}
| Поле | Тип | Опис |
|---|---|---|
| status | enum | Новий статус заявки |
| completionNote | string | Примітка при закритті |
| gpsLat | number | GPS широта (при закритті) |
| gpsLng | number | GPS довгота (при закритті) |
| title | string | Оновлений заголовок |
| assigneeId | string | Новий виконавець |
| scheduledAt | datetime | Дата та час запланованого виїзду (ISO 8601) |
| scheduledEndAt | datetime | Дата та час завершення (ISO 8601) |
{
"action": "assign",
"ticketIds": ["clx1a...", "clx1b...", "clx1c..."],
"assigneeId": "clx1user..."
}
// Або зміна статусу:
{
"action": "status",
"ticketIds": ["clx1a...", "clx1b..."],
"status": "COMPLETED"
}
// Або видалення:
{
"action": "delete",
"ticketIds": ["clx1a...", "clx1b..."]
}
| Поле | Тип | Опис |
|---|---|---|
| action | enum required | assign | status | delete |
| ticketIds | string[] required | Масив ID заявок |
| assigneeId | string | ID виконавця (для action=assign) |
| status | enum | Статус (для action=status) |
{
"updated": 3,
"message": "Успішно оновлено 3 заявки"
}
GET /api/tickets/clx1abc.../equipment
{
"equipmentId": "clx1eq...",
"action": "install"
}
[
{
"id": "clx1eq...",
"name": "HP LaserJet Pro",
"serialNumber": "VNB3K12345",
"type": "PRINTER"
}
]
Content-Type: multipart/form-data
photo: [binary file]
description: "Фото пошкодженого принтера"
{
"id": "clx1ph...",
"url": "/uploads/tickets/clx1abc.../photo1.jpg",
"description": "Фото пошкодженого принтера",
"createdAt": "2026-03-28T12:30:00.000Z"
}
Підтримує application/json та multipart/form-data (з файлами).
{
"text": "Замовив новий картридж, доставка завтра"
}
Автор може видалити свій коментар, ADMIN — будь-який. Створює запис в журналі змін заявки.
Тільки автор, зберігає попередні версії в editHistory.
{
"id": 42,
"text": "Замовив новий картридж, доставка завтра",
"author": { "id": 1, "name": "Олег Коваль" },
"files": [],
"createdAt": "2026-03-28T13:00:00.000Z"
}
Повертає файл у форматі iCalendar (.ics) з подією VEVENT для запланованого виїзду. Файл містить нагадування VALARM за 1 день до події. Сумісний з Google Calendar, Apple Calendar та Outlook.
Content-Type: text/calendar
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//IT CITY CRM//Tickets//UK
BEGIN:VEVENT
UID:ticket-clx1abc@crm.its.te.ua
DTSTART:20260405T100000Z
DTEND:20260405T120000Z
SUMMARY:Заявка #1043 — Заміна картриджа
DESCRIPTION:Магазин #5\nПріоритет: HIGH\nhttps://crm.its.te.ua/tickets/clx1abc
LOCATION:вул. Центральна, 15
BEGIN:VALARM
TRIGGER:-P1D
ACTION:DISPLAY
DESCRIPTION:Нагадування: завтра плановий виїзд — Заявка #1043
END:VALARM
END:VEVENT
END:VCALENDAR
Управління обладнанням, серійними номерами та переміщеннями між торговими точками.
| Параметр | Тип | Опис |
|---|---|---|
| type | string | Тип: PRINTER, SCANNER, PC, MONITOR, OTHER |
| storeId | string | Фільтр за торговою точкою |
| q | string | Пошук за назвою, серійним номером |
| status | string | ACTIVE | REPAIR | DECOMMISSIONED |
| page | number | Номер сторінки |
{
"equipment": [
{
"id": "clx1eq...",
"name": "HP LaserJet Pro M404dn",
"type": "PRINTER",
"serialNumber": "VNB3K12345",
"status": "ACTIVE",
"store": { "id": "...", "name": "Магазин #5" }
}
],
"total": 84,
"page": 1
}
{
"name": "HP LaserJet Pro M404dn",
"type": "PRINTER",
"serialNumber": "VNB3K12345",
"storeId": "clx1store...",
"notes": "Нове обладнання, гарантія до 2027"
}
{
"id": "clx1new...",
"name": "HP LaserJet Pro M404dn",
"type": "PRINTER",
"serialNumber": "VNB3K12345",
"status": "ACTIVE"
}
{
"name": "HP LaserJet Pro M404dn (оновлено)",
"serialNumber": "VNB3K12345-NEW",
"status": "REPAIR",
"notes": "Відправлено на ремонт"
}
{
"toStoreId": "clx1store2...",
"reason": "Переміщення на іншу точку за запитом клієнта"
}
{
"id": "clx1eq...",
"store": { "id": "clx1store2...", "name": "Магазин #12" },
"movement": {
"id": "clx1mv...",
"fromStore": "Магазин #5",
"toStore": "Магазин #12",
"movedAt": "2026-03-28T14:00:00.000Z",
"movedBy": "Олег Коваль"
}
}
Грошовий потік, регулярні платежі, закриття місяця, виплати та категорії.
| Параметр | Тип | Опис |
|---|---|---|
| month | number | Місяць (1-12) |
| year | number | Рік |
| type | string | INCOME | EXPENSE |
| categoryId | string | ID категорії |
{
"type": "INCOME",
"amount": 15000,
"description": "Оплата за обслуговування - Березень",
"categoryId": "clx1cat...",
"date": "2026-03-28",
"organizationId": "clx1org..."
}
{
"id": "clx1cf...",
"type": "INCOME",
"amount": 15000,
"tax": 750,
"netAmount": 14250,
"description": "Оплата за обслуговування - Березень",
"date": "2026-03-28T00:00:00.000Z"
}
| Параметр | Тип | Опис |
|---|---|---|
| month | number required | Місяць (1-12) |
| year | number required | Рік |
{
"month": {
"income": 85000,
"expense": 42000,
"tax": 4250,
"profit": 38750
},
"quarter": {
"income": 240000,
"expense": 118000,
"tax": 12000,
"profit": 110000
}
}
{
"name": "Оренда офісу",
"amount": 8000,
"type": "EXPENSE",
"frequency": "MONTHLY",
"categoryId": "clx1cat...",
"dayOfMonth": 5
}
{
"items": [
{
"id": "clx1ri...",
"name": "Оренда офісу",
"amount": 8000,
"type": "EXPENSE",
"frequency": "MONTHLY",
"nextDate": "2026-04-05",
"isActive": true
}
]
}
{
"month": 3,
"year": 2026,
"action": "close"
}
| Поле | Тип | Опис |
|---|---|---|
| month | number required | Місяць (1-12) |
| year | number required | Рік |
| action | enum required | close | reopen |
{
"month": 3,
"year": 2026,
"isClosed": true,
"closedAt": "2026-04-01T00:00:00.000Z",
"closedBy": "Адмін"
}
| Параметр | Тип | Опис |
|---|---|---|
| month | number required | Місяць (1-12) |
| year | number required | Рік |
{
"month": 3,
"year": 2026,
"recurringItems": [
{
"id": "clx1ri...",
"name": "Оренда офісу",
"amount": 8000,
"type": "EXPENSE",
"category": "Оренда"
}
],
"totals": {
"income": 85000,
"expense": 42000,
"recurringExpense": 18000,
"recurringIncome": 5000
}
}
{
"orderedIds": ["clx1cat1...", "clx1cat2...", "clx1cat3..."]
}
| Поле | Тип | Опис |
|---|---|---|
| orderedIds | string[] required | Масив ID категорій у новому порядку |
{
"success": true,
"message": "Порядок категорій оновлено"
}
{
"userId": "clx1user...",
"amount": 25000,
"type": "SALARY",
"month": 3,
"year": 2026,
"note": "Зарплата за березень"
}
{
"id": "clx1pay...",
"userId": "clx1user...",
"amount": 25000,
"type": "SALARY",
"createdAt": "2026-04-01T00:00:00.000Z"
}
{
"name": "Витратні матеріали",
"type": "EXPENSE",
"parentId": null
}
{
"categories": [
{
"id": "clx1cat...",
"name": "Витратні матеріали",
"type": "EXPENSE",
"parentId": null,
"children": [
{ "id": "clx1cat2...", "name": "Картриджі" },
{ "id": "clx1cat3...", "name": "Папір" }
]
}
]
}
Щомісячна статистика, деталізовані звіти та експорт у Excel.
| Параметр | Тип | Опис |
|---|---|---|
| month | number | Місяць (1-12) |
| year | number | Рік |
{
"tickets": {
"total": 156,
"new": 12,
"inProgress": 28,
"completed": 110,
"cancelled": 6
},
"technicians": [
{ "name": "Олег Коваль", "completed": 45, "avgTime": "2.3 год" }
],
"finance": {
"income": 85000,
"expense": 42000,
"profit": 43000
}
}
| Параметр | Тип | Опис |
|---|---|---|
| from | string required | Початкова дата (YYYY-MM-DD) |
| to | string required | Кінцева дата (YYYY-MM-DD) |
| type | enum required | Тип звіту (див. нижче) |
| Тип | Опис |
|---|---|
| summary | Загальна зведена інформація |
| taxes | Розрахунок податків за період |
| salaries | Зарплати та виплати |
| income | Деталізація доходів |
| categories | Розбивка за категоріями |
| contractors | Звіт по підрядниках |
| monthly | Помісячна розбивка |
GET /api/reports/detailed?from=2026-01-01&to=2026-03-31&type=summary
{
"period": { "from": "2026-01-01", "to": "2026-03-31" },
"type": "summary",
"data": {
"totalIncome": 240000,
"totalExpense": 118000,
"totalTax": 12000,
"netProfit": 110000,
"ticketsCompleted": 312,
"avgTicketTime": "2.1 год"
}
}
Ті самі параметри, що й для /api/reports/detailed
Бінарний файл application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
Content-Disposition: attachment; filename="report-2026-Q1.xlsx"
{
"type": "monthly",
"month": 3,
"year": 2026
}
| Поле | Тип | Опис |
|---|---|---|
| type | enum required | Тип звіту: monthly | weekly |
| month | number | Місяць (для monthly) |
| year | number | Рік (для monthly) |
{
"success": true,
"message": "Тестовий звіт відправлено в Telegram"
}
{
"weeklyReport": {
"enabled": true,
"dayOfWeek": 1,
"time": "09:00",
"chatIds": ["-100123456789"]
},
"monthlyReport": {
"enabled": true,
"dayOfMonth": 1,
"time": "10:00",
"chatIds": ["-100123456789"]
}
}
Вебхуки, Telegram-бот, Google Maps та магічні посилання.
| Заголовок | Опис |
|---|---|
| X-Webhook-Signature | HMAC-SHA256 підпис тіла запиту |
| Content-Type | application/json |
{
"event": "ticket.created",
"data": {
"id": 12345,
"subject": "Не працює каса",
"description": "Каса не включається після оновлення",
"priority": "high",
"store": {
"name": "Магазин Електроніка #7",
"address": "вул. Центральна, 15"
},
"contact": {
"name": "Марія Коваленко",
"phone": "+380501234567"
}
}
}
| Eddy | CRM |
|---|---|
| data.subject | title |
| data.description | description |
| data.priority | priority (high→HIGH, medium→MEDIUM, low→LOW) |
| data.store.name | Пошук store за назвою |
| data.contact.name | Контактна особа в описі |
{
"success": true,
"ticketId": "clx1new...",
"ticketNumber": 1044
}
| Подія | Отримувач | Опис |
|---|---|---|
| Нова заявка | Виконавець | Повідомлення з деталями заявки та посиланням |
| Зміна статусу | Автор / Менеджер | Оповіщення при зміні статусу заявки |
| Нарахування ЗП | Працівник | Повідомлення про нараховану зарплату |
| Щотижневий звіт | Менеджери | Зведення по заявках за тиждень (понеділок) |
| Щомісячний звіт | Адміни | Фінансове зведення за місяць (1 числа) |
🔔 Нова заявка #1044
📋 Не працює каса
🏪 Магазин Електроніка #7
⚡ Пріоритет: Високий
🔗 https://crm.its.te.ua/tickets/clx1new...
Одноразове посилання для закриття заявки зовнішнім підрядником без облікового запису в CRM.
https://crm.its.te.ua/magic/abc123def456...
| Крок | Опис |
|---|---|
| 1 | Менеджер генерує Magic Link для заявки |
| 2 | Посилання надсилається підряднику (email/Telegram) |
| 3 | Підрядник відкриває посилання, бачить форму закриття |
| 4 | Заповнює результат роботи та закриває заявку |
| Функція | Опис |
|---|---|
| Геолокація точок | Координати магазинів зберігаються при створенні (geocoding API) |
| Карта заявок | Відображення всіх відкритих заявок на карті з маркерами |
| Побудова маршруту | Оптимальний маршрут між кількома точками (Directions API) |
| GPS при закритті | Фіксація GPS-координат техніка при закритті заявки |
Управління обліковими записами, ролями та статусами користувачів.
{
"error": "Видалення користувачів заборонено. Використовуйте деактивацію.",
"hint": "PATCH /api/users/[id] з { \"isActive\": false }"
}
Створення, призначення та проходження тестів для перевірки знань техніків.
Для техніка: тільки обов'язкові + призначені. Для адміна: всі опубліковані.
{
"title": "Основи мереж",
"description": "Базові знання мережевих технологій",
"level": "BEGINNER",
"category": "networks",
"passingScore": 80,
"timeLimitMin": 15,
"isRequired": false,
"questions": [
{
"text": "Який порт використовує HTTPS?",
"type": "single",
"options": ["80", "443", "8080", "22"],
"correctAnswer": [1],
"explanation": "HTTPS працює на порті 443"
}
]
}
GET — повертає тест з питаннями (для техніка без правильних відповідей).
PATCH — оновлення тесту та питань (ADMIN). DELETE — видалення (ADMIN).
{
"answers": {
"1": [1],
"2": [0, 2],
"3": [0]
}
}
Повертає результат: score, passed, детальний розбір кожного питання з правильними відповідями.
{
"userIds": [4, 5, 6],
"deadline": "2026-04-15"
}
Надсилає Telegram та in-app сповіщення кожному призначеному користувачу.
Створює 6 шаблонів: Мережі, Принтери, Windows, Сервери, Безпека, Hardware (54 питання).
Повертає матрицю: користувачі × тести з найкращими балами та кількістю спроб.
In-app сповіщення з дзвіночком, звуком та polling кожні 30 секунд.
Параметр ?unread=1 — тільки непрочитані. Повертає { notifications, unreadCount }.
// Одне сповіщення
{ "id": 42 }
// Все прочитано
{ "markAll": true }
| Тип | Опис |
|---|---|
| TICKET_CREATED | Нова заявка (адмінам/менеджерам) |
| TICKET_ASSIGNED | Призначено заявку |
| STATUS_CHANGED | Зміна статусу заявки |
| TICKET_COMMENT | Новий коментар |
| QUIZ_ASSIGNED | Призначено тест |
| SLA_WARNING | SLA наближається/прострочено |
Масові розсилки через Telegram та Viber з фільтрацією аудиторії.
{
"name": "Акція березень",
"message": "Шановні клієнти! Знижка 20% на обслуговування до кінця місяця.",
"channel": "telegram",
"filters": {
"organizationId": "clx1org...",
"tags": ["active"]
}
}
| Поле | Тип | Опис |
|---|---|---|
| name | string required | Назва розсилки |
| message | string required | Текст повідомлення |
| channel | enum required | telegram | viber |
| filters | object | Фільтри аудиторії (організація, теги) |
{
"id": "clx1br...",
"name": "Акція березень",
"status": "DRAFT",
"recipientCount": 45,
"createdAt": "2026-04-01T10:00:00.000Z"
}
{
"broadcasts": [
{
"id": "clx1br...",
"name": "Акція березень",
"status": "SENT",
"channel": "telegram",
"recipientCount": 45,
"sentCount": 42,
"failedCount": 3,
"createdAt": "2026-04-01T10:00:00.000Z",
"sentAt": "2026-04-01T10:05:00.000Z"
}
]
}
Запускає відправку розсилки всім отримувачам. Статус змінюється на SENDING, потім на SENT після завершення.
{
"id": "clx1br...",
"status": "SENDING",
"recipientCount": 45,
"message": "Розсилка запущена"
}
Import/Export, шаблони заявок, планове ТО, підписки та логування помилок.
Імпорт даних з CSV-файлу. Підтримує контакти, обладнання та організації. Формат: multipart/form-data.
Content-Type: multipart/form-data
file: [CSV file]
type: "contacts" // contacts | equipment | organizations
| Поле | Тип | Опис |
|---|---|---|
| file | file required | CSV-файл з даними |
| type | enum required | contacts | equipment | organizations |
{
"imported": 42,
"skipped": 3,
"errors": [
{ "row": 5, "error": "Дублікат email" }
]
}
| Параметр | Тип | Опис |
|---|---|---|
| type | enum required | contacts | equipment | organizations |
| format | enum | csv (за замовчуванням) |
Бінарний файл text/csv
Content-Disposition: attachment; filename="contacts-2026-04-01.csv"
{
"templates": [
{
"id": "clx1tmpl...",
"name": "Заміна картриджа",
"title": "Заміна картриджа — {printer}",
"description": "Потрібна заміна картриджа",
"priority": "MEDIUM",
"categoryId": "clx1cat..."
}
]
}
{
"name": "Заміна картриджа",
"title": "Заміна картриджа — {printer}",
"description": "Потрібна заміна картриджа в принтері",
"priority": "MEDIUM",
"categoryId": "clx1cat..."
}
{
"id": "clx1tmpl...",
"name": "Заміна картриджа",
"createdAt": "2026-04-01T10:00:00.000Z"
}
{
"items": [
{
"id": "clx1pm...",
"name": "Щомісячна перевірка принтерів",
"frequency": "MONTHLY",
"templateId": "clx1tmpl...",
"storeId": "clx1store...",
"nextRunAt": "2026-05-01T09:00:00.000Z",
"isActive": true
}
]
}
{
"name": "Щомісячна перевірка принтерів",
"frequency": "MONTHLY",
"dayOfMonth": 1,
"templateId": "clx1tmpl...",
"storeId": "clx1store...",
"assigneeId": "clx1user..."
}
| Поле | Тип | Опис |
|---|---|---|
| name | string required | Назва планового ТО |
| frequency | enum required | DAILY | WEEKLY | MONTHLY | QUARTERLY |
| templateId | string | ID шаблону заявки |
| storeId | string | ID об'єкта |
| assigneeId | string | ID виконавця |
{
"id": "clx1pm...",
"name": "Щомісячна перевірка принтерів",
"nextRunAt": "2026-05-01T09:00:00.000Z"
}
{
"provider": "liqpay",
"plan": "professional",
"period": "monthly"
}
| Поле | Тип | Опис |
|---|---|---|
| provider | enum required | liqpay | wayforpay |
| plan | enum required | starter | professional | enterprise |
| period | enum | monthly | yearly |
{
"paymentUrl": "https://www.liqpay.ua/checkout/...",
"orderId": "ord_abc123"
}
{
"message": "TypeError: Cannot read property 'id' of undefined",
"stack": "at TicketList.render (tickets.js:42:15)...",
"url": "/tickets",
"userAgent": "Mozilla/5.0..."
}
| Поле | Тип | Опис |
|---|---|---|
| message | string required | Текст помилки |
| stack | string | Stack trace |
| url | string | URL сторінки де виникла помилка |
| userAgent | string | User Agent браузера |
{
"id": "clx1err...",
"message": "Помилку зафіксовано"
}
Службові ендпоінти для моніторингу стану системи.
{
"status": "ok",
"version": "4.0.0",
"uptime": 1234567,
"database": "connected",
"timestamp": "2026-04-01T12:00:00.000Z"
}
Покрокові інструкції для підключення зовнішніх систем до IT CITY CRM.
POST /api/auth/callback/credentialsnext-auth.session-token)Authorization// Приклад з Bearer токеном
fetch('https://crm.its.te.ua/api/tickets', {
headers: {
'Authorization': 'Bearer your-session-token',
'Content-Type': 'application/json'
}
})
https://crm.its.te.ua/api/webhooksX-Webhook-Signature// Генерація підпису
const crypto = require('crypto');
const signature = crypto
.createHmac('sha256', WEBHOOK_SECRET)
.update(JSON.stringify(body))
.digest('hex');
{
"event": "ticket.created",
"data": {
"id": 12345,
"subject": "Тема заявки",
"description": "Опис проблеми",
"priority": "high",
"store": { "name": "..." },
"contact": { "name": "...", "phone": "..." }
}
}
При перевищенні ліміту повертається статус 429 Too Many Requests з заголовком Retry-After.
// Відповідь при перевищенні ліміту
HTTP/1.1 429 Too Many Requests
Retry-After: 60
{
"error": "Too many requests",
"retryAfter": 60
}
Омніканальний чат з Telegram та Viber ботами, AI-агентом, базою знань, автопризначенням та SLA.
Приймає повідомлення від Telegram Bot API. Обробляє текст, фото, відео, файли, контакт (request_contact), callback_query (рейтинг).
Створює/знаходить ChatSession → зберігає повідомлення → ідентифікує клієнта → Zabbix-перевірка → AI-відповідь (якщо немає оператора) → автопризначення → сповіщення.
Приймає повідомлення від Viber Bot. Повна паритетність з Telegram: кнопки (Viber Keyboard), рейтинг, Zabbix, AI.
| status | string | Фільтр статусу: _all_open, open, closed, deleted або кастомний ID |
| contactId | number | Фільтр по контакту |
| storeId | number | Фільтр по об'єкту |
| operatorId | number | Фільтр по оператору |
Масив ChatSession з вкладеними contact, store, operator, останнє повідомлення, _count.messages. Плюс об'єкт counts з кількістю по кожному статусу.
Повна інформація: всі повідомлення з replyTo, контакт (customFields, stores), оператор, канал, рейтинг.
| status | string | Новий статус. При closed — надсилає запит рейтингу в Telegram/Viber |
| subject | string | Тема заявки |
| operatorId | number|null | Призначити/зняти оператора |
| contactId | number | Прив'язати контакт |
| storeId | number | Прив'язати об'єкт |
FormData: text, file (attachment), isComment (внутрішній коментар), replyToId (цитування).
Коментарі не надсилаються клієнту. Звичайні повідомлення надсилаються через Telegram/Viber API.
KPI: всього заявок, закрито, середній час відповіді, середній рейтинг. Графіки по статусах, каналах, операторах. Список відгуків з фільтрацією.
| from | date | Початок періоду (ISO) |
| to | date | Кінець періоду (ISO) |
| type | string | kb — пошук статей, templates — шаблони відповідей, unread — кількість непрочитаних |
| q | string | Рядок пошуку (для type=kb) |
Авторизація через x-cron-secret header. Знаходить заявки де останнє повідомлення від клієнта старше SLA, надсилає сповіщення через Telegram та in-app.
Інтеграція з Zabbix для моніторингу мережевого обладнання на об'єктах.
| action | string | status — статус хоста, equipment-report — звіт обладнання |
| storeId | number | ID об'єкта (для action=status) |
Повертає: проблеми (severity: High), inventory роутера (модель, прошивка, S/N), тривалість простою.
CRUD статей бази знань з публічним доступом через окремий сервер (порт 3099).
Повертає всі статті з title, content, tags, isPublic, slug. Фільтрація по тегах та пошук по заголовку.
| title | string | required Заголовок |
| content | string | HTML-контент (rich text) |
| tags | string[] | Теги для категоризації |
| isPublic | boolean | Публічна доступність (через kb-server) |
Окремий сервер (порт 3099). Список публічних статей з пошуком та фільтрацією по тегах. Без авторизації.
HTML-сторінка статті з повним контентом. Slug генерується транслітерацією з кирилиці.