Обзор API для пользователей

CRMPro предоставляет полнофункциональное REST API для интеграции с вашими приложениями и сервисами. Все запросы должны использовать протокол HTTPS и передавать данные в формате JSON.

Базовый URL: https://appap.sbs/api

Роли и права доступа

API поддерживает несколько ролей пользователей с разными уровнями доступа:

Роль Описание Доступные функции
company_owner Владелец компании Полный доступ ко всем функциям компании, управление сотрудниками, подписка
manager Менеджер Управление клиентами, сделками, задачами, календарем
user Пользователь Просмотр клиентов, сделок, задач, работа с календарем
employee Сотрудник Базовый доступ к просмотру информации
developer Разработчик Расширенные права для интеграций и разработки

Формат данных

Все запросы и ответы используют формат JSON. Заголовок Content-Type должен быть установлен как application/json.

Коды ответов

Код Описание
200 Успешный запрос
201 Успешное создание
400 Неверный запрос
401 Не авторизован
403 Доступ запрещен
404 Не найдено
422 Ошибка валидации
500 Ошибка сервера

Быстрый справочник API (Пользовательская часть)

Все доступные эндпоинты для пользователей, владельцев компаний, менеджеров и сотрудников:

Аутентификация

Для доступа к защищенным эндпоинтам API требуется аутентификация с использованием Bearer Token (API ключа).

Важно: Все защищенные эндпоинты требуют API ключ в заголовке Authorization.
Пример заголовка Authorization
Authorization: Bearer ваш_api_ключ

Регистрация

Создание нового пользователя и тенанта в системе.

POST /api/register

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

JSON
{ "username": "user123", "email": "user@example.com", "password": "securepassword", "company_name": "Моя компания", "full_name": "Иван Иванов", "user_role": "company_owner" }

Ответ

JSON
{ "status": "success", "api_key": "abc123def456...", "tenant_id": "a1b2c3d4e5f6" }

Вход в систему

Аутентификация пользователя и получение API ключа.

POST /api/login

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

JSON
{ "username": "user123", "password": "securepassword" }

Ответ

JSON
{ "status": "success", "api_key": "abc123def456...", "tenant_id": "a1b2c3d4e5f6", "company_name": "Моя компания", "user_role": "company_owner" }

Информация о пользователе

Получение информации о текущем авторизованном пользователе.

GET /api/user
Требуется аутентификация: Добавьте API ключ в заголовок Authorization

Ответ

JSON
{ "id": 1, "username": "user123", "email": "user@example.com", "company_name": "Моя компания", "full_name": "Иван Иванов", "api_key": "abc123...", "tenant_id": "a1b2c3d4e5f6", "user_role": "company_owner", "subscription_type": "basic", "phone": "+79161234567", "position": "Директор", "department": "Управление" }

Информация о текущем пользователе

Получение расширенной информации о текущем авторизованном пользователе.

GET /api/user/me
Требуется аутентификация: Добавьте API ключ в заголовок Authorization

Ответ

JSON
{ "id": 1, "username": "user123", "email": "user@example.com", "name": "Иван Иванов", "full_name": "Иван Иванов", "company_name": "Моя компания", "role": "company_owner", "user_role": "company_owner", "phone": "+79161234567", "position": "Директор", "department": "Управление", "subscription_type": "basic", "tenant_id": "a1b2c3d4e5f6" }

Генерация нового API ключа

Создание нового API ключа для текущего пользователя. Старый ключ перестанет работать.

POST /api/user/generate-api-key
Требуется аутентификация: Добавьте текущий API ключ в заголовок Authorization

Ответ

JSON
{ "status": "success", "api_key": "новый_сгенерированный_api_ключ" }

Управление сотрудниками компании

Эндпоинты для управления сотрудниками компании. Доступны только для владельцев компаний и менеджеров.

GET /api/company/users

Получение списка всех сотрудников компании

Требуется аутентификация: Добавьте API ключ в заголовок Authorization
Требуемые права: MANAGE_ALL_USERS (владельцы компаний, менеджеры)

Ответ

JSON
[ { "id": 1, "username": "employee1", "email": "employee1@example.com", "full_name": "Петр Петров", "phone": "+79161234568", "position": "Менеджер", "department": "Продажи", "user_role": "manager", "is_active": true, "created_at": "2024-01-15T10:30:00" } ]
POST /api/company/users

Создание нового сотрудника компании

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

JSON
{ "username": "newemployee", "email": "new@example.com", "password": "password123", "full_name": "Сергей Сергеев", "phone": "+79161234569", "position": "Аналитик", "department": "Аналитика", "user_role": "employee" }

Ответ

JSON
{ "status": "success", "user": { "id": 2, "username": "newemployee", "email": "new@example.com", "full_name": "Сергей Сергеев", "phone": "+79161234569", "position": "Аналитик", "department": "Аналитика", "user_role": "employee", "is_active": true, "created_at": "2024-01-15T10:30:00" } }
PUT /api/company/users/{user_id}

Обновление данных сотрудника компании

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

JSON
{ "full_name": "Сергей Иванов", "phone": "+79161234570", "position": "Старший аналитик", "department": "Аналитика", "user_role": "manager", "is_active": true }

Ответ

JSON
{ "status": "success", "user": { "id": 2, "username": "newemployee", "email": "new@example.com", "full_name": "Сергей Иванов", "phone": "+79161234570", "position": "Старший аналитик", "department": "Аналитика", "user_role": "manager", "is_active": true } }
DELETE /api/company/users/{user_id}

Удаление сотрудника компании

Ответ

JSON
{ "status": "success", "message": "User deleted successfully" }

Клиенты - физические лица

Управление клиентами - физическими лицами.

POST /api/clients/individual

Создание нового клиента (физическое лицо)

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

JSON
{ "first_name": "Иван", "last_name": "Иванов", "phone": "+79161234567", "email": "ivan@example.com", "status": "new", "comment": "Потенциальный клиент" }

Ответ

JSON
{ "status": "success" }
GET /api/clients/individual

Получение списка всех клиентов (физические лица)

Ответ

JSON
[ { "id": 1, "first_name": "Иван", "last_name": "Иванов", "phone": "+79161234567", "email": "ivan@example.com", "status": "new", "comment": "Потенциальный клиент", "created_at": "2024-01-15T10:30:00", "updated_at": "2024-01-15T10:30:00" } ]

Получение клиента по ID

Получение информации о конкретном клиенте (физическое лицо) по его идентификатору.

GET /api/clients/individual/{client_id}
Требуется аутентификация: Добавьте API ключ в заголовок Authorization

Ответ

JSON
{ "id": 1, "first_name": "Иван", "last_name": "Иванов", "phone": "+79161234567", "email": "ivan@example.com", "status": "new", "comment": "Потенциальный клиент", "created_at": "2024-01-15T10:30:00", "updated_at": "2024-01-15T10:30:00" }

Все клиенты

Получение списка всех клиентов (физических и юридических лиц).

GET /api/clients
Требуется аутентификация: Добавьте API ключ в заголовок Authorization

Ответ

JSON
[ { "id": 1, "name": "Иван Иванов", "type": "individual", "phone": "+79161234567", "email": "ivan@example.com", "status": "new", "created_at": "2024-01-15T10:30:00" }, { "id": 2, "name": "ООО Ромашка", "contact_person": "Петр Петров", "type": "legal", "phone": "+79161234568", "email": "petr@romashka.ru", "status": "active", "created_at": "2024-01-15T11:30:00" } ]

Создание сделки

Создание новой сделки в системе.

POST /api/deals

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

JSON
{ "title": "Продажа ПО", "client_id": 1, "client_type": "individual", "budget": 50000.00, "expected_close_date": "2024-02-15", "status": "active" }

Ответ

JSON
{ "status": "success" }

Получение списка сделок

Получение списка всех сделок пользователя.

GET /api/deals
Требуется аутентификация: Добавьте API ключ в заголовок Authorization

Ответ

JSON
[ { "id": 1, "title": "Продажа ПО", "client_id": 1, "client_type": "individual", "budget": 50000.00, "expected_close_date": "2024-02-15", "actual_close_date": null, "status": "active", "loss_reason": null, "created_at": "2024-01-15T10:30:00", "updated_at": "2024-01-15T10:30:00", "closed_at": null } ]

Получение сделки по ID

Получение информации о конкретной сделке по её идентификатору.

GET /api/deals/{deal_id}
Требуется аутентификация: Добавьте API ключ в заголовок Authorization

Ответ

JSON
{ "id": 1, "title": "Продажа ПО", "client_id": 1, "client_type": "individual", "budget": 50000.00, "expected_close_date": "2024-02-15", "actual_close_date": null, "status": "active", "loss_reason": null, "created_at": "2024-01-15T10:30:00", "updated_at": "2024-01-15T10:30:00", "closed_at": null }

Обновление сделки

Обновление информации о существующей сделке.

PUT /api/deals/{deal_id}

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

JSON
{ "title": "Продажа ПО (обновлено)", "budget": 55000.00, "status": "completed" }

Ответ

JSON
{ "status": "success", "deal": { "id": 1, "title": "Продажа ПО (обновлено)", "client_id": 1, "client_type": "individual", "budget": 55000.00, "expected_close_date": "2024-02-15", "actual_close_date": "2024-02-10", "status": "completed", "loss_reason": null, "created_at": "2024-01-15T10:30:00", "updated_at": "2024-02-10T14:30:00", "closed_at": "2024-02-10T14:30:00" } }

Создание задачи

Создание новой задачи в системе.

POST /api/tasks

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

JSON
{ "title": "Позвонить клиенту", "priority": "high", "deadline": "2024-01-20", "status": "pending", "action": "Обсудить условия", "price": 15000.00, "profit": 5000.00, "comment": "Важный клиент" }

Ответ

JSON
{ "status": "success" }

Получение списка задач

Получение списка всех задач пользователя.

GET /api/tasks
Требуется аутентификация: Добавьте API ключ в заголовок Authorization

Ответ

JSON
[ { "id": 1, "title": "Позвонить клиенту", "priority": "high", "deadline": "2024-01-20", "status": "pending", "action": "Обсудить условия", "price": 15000.00, "profit": 5000.00, "comment": "Важный клиент", "created_at": "2024-01-15T10:30:00", "updated_at": "2024-01-15T10:30:00" } ]

Получение задачи по ID

Получение информации о конкретной задаче по её идентификатору.

GET /api/tasks/{task_id}
Требуется аутентификация: Добавьте API ключ в заголовок Authorization

Ответ

JSON
{ "id": 1, "title": "Позвонить клиенту", "priority": "high", "deadline": "2024-01-20", "status": "pending", "action": "Обсудить условия", "price": 15000.00, "profit": 5000.00, "comment": "Важный клиент", "created_at": "2024-01-15T10:30:00", "updated_at": "2024-01-15T10:30:00" }

Обновление задачи

Обновление информации о существующей задаче.

PUT /api/tasks/{task_id}

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

JSON
{ "title": "Позвонить клиенту (обновлено)", "status": "completed", "comment": "Клиент подтвердил условия" }

Ответ

JSON
{ "status": "success", "task": { "id": 1, "title": "Позвонить клиенту (обновлено)", "priority": "high", "deadline": "2024-01-20", "status": "completed", "action": "Обсудить условия", "price": 15000.00, "profit": 5000.00, "comment": "Клиент подтвердил условия", "created_at": "2024-01-15T10:30:00", "updated_at": "2024-01-16T14:30:00" } }

Создание заявки (Lead)

Создание новой заявки в системе.

POST /api/leads

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

JSON
{ "first_name": "Алексей", "last_name": "Смирнов", "phone": "+79161234571", "email": "alexey@example.com", "company_name": "ООО ТехноПро", "message": "Интересует внедрение CRM", "source": "website", "status": "new", "priority": "high", "assigned_to": 1, "tags": ["crm", "внедрение"], "custom_fields": { "budget": "50000", "timeline": "1 месяц" } }

Ответ

JSON
{ "status": "success", "lead": { "id": 1, "first_name": "Алексей", "last_name": "Смирнов", "phone": "+79161234571", "email": "alexey@example.com", "company_name": "ООО ТехноПро", "message": "Интересует внедрение CRM", "source": "website", "status": "new", "priority": "high", "assigned_to": 1, "tags": ["crm", "внедрение"], "custom_fields": { "budget": "50000", "timeline": "1 месяц" }, "created_at": "2024-01-15T10:30:00" } }

Получение списка заявок

Получение списка всех заявок с возможностью фильтрации.

GET /api/leads
Требуется аутентификация: Добавьте API ключ в заголовок Authorization

Ответ

JSON
[ { "id": 1, "first_name": "Алексей", "last_name": "Смирнов", "phone": "+79161234571", "email": "alexey@example.com", "company_name": "ООО ТехноПро", "message": "Интересует внедрение CRM", "source": "website", "status": "new", "priority": "high", "assigned_to": 1, "tags": ["crm", "внедрение"], "custom_fields": { "budget": "50000", "timeline": "1 месяц" }, "created_at": "2024-01-15T10:30:00" } ]

Получение заявки по ID

Получение информации о конкретной заявке по её идентификатору.

GET /api/leads/{lead_id}
Требуется аутентификация: Добавьте API ключ в заголовок Authorization

Ответ

JSON
{ "id": 1, "first_name": "Алексей", "last_name": "Смирнов", "phone": "+79161234571", "email": "alexey@example.com", "company_name": "ООО ТехноПро", "message": "Интересует внедрение CRM", "source": "website", "status": "new", "priority": "high", "assigned_to": 1, "tags": ["crm", "внедрение"], "custom_fields": { "budget": "50000", "timeline": "1 месяц" }, "created_at": "2024-01-15T10:30:00", "updated_at": "2024-01-15T10:30:00" }

Обновление заявки

Обновление информации о существующей заявке.

PUT /api/leads/{lead_id}

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

JSON
{ "status": "in_progress", "assigned_to": 2, "priority": "medium" }

Ответ

JSON
{ "status": "success", "lead": { "id": 1, "first_name": "Алексей", "last_name": "Смирнов", "phone": "+79161234571", "email": "alexey@example.com", "company_name": "ООО ТехноПро", "message": "Интересует внедрение CRM", "source": "website", "status": "in_progress", "priority": "medium", "assigned_to": 2, "tags": ["crm", "внедрение"], "custom_fields": { "budget": "50000", "timeline": "1 месяц" }, "created_at": "2024-01-15T10:30:00", "updated_at": "2024-01-16T14:30:00" } }

Удаление заявки

Удаление заявки из системы.

DELETE /api/leads/{lead_id}
Внимание: Удаление заявки невозможно отменить.

Ответ

JSON
{ "status": "success" }

События календаря

Получение событий календаря с возможностью фильтрации по дате.

GET /api/calendar/events
Требуется аутентификация: Добавьте API ключ в заголовок Authorization

Ответ

JSON
[ { "id": 1, "title": "Встреча с клиентом", "description": "Обсуждение условий договора", "start_time": "2024-01-20T14:00:00", "end_time": "2024-01-20T15:00:00", "event_type": "meeting", "client_id": 1, "deal_id": 1, "location": "Офис клиента", "created_by": 1, "created_at": "2024-01-15T10:30:00" } ]

Создание события календаря

Создание нового события в календаре.

POST /api/calendar/events

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

JSON
{ "title": "Презентация продукта", "description": "Демонстрация новых возможностей CRM", "start_time": "2024-01-25T10:00:00", "end_time": "2024-01-25T11:30:00", "event_type": "presentation", "client_id": 1, "deal_id": 1, "location": "Конференц-зал" }

Ответ

JSON
{ "status": "success", "event": { "id": 2, "title": "Презентация продукта", "description": "Демонстрация новых возможностей CRM", "start_time": "2024-01-25T10:00:00", "end_time": "2024-01-25T11:30:00", "event_type": "presentation", "client_id": 1, "deal_id": 1, "location": "Конференц-зал", "created_by": 1, "created_at": "2024-01-16T10:30:00" } }

Обновление события календаря

Обновление информации о существующем событии календаря.

PUT /api/calendar/events/{event_id}

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

JSON
{ "title": "Презентация продукта (обновлено)", "start_time": "2024-01-25T11:00:00", "location": "Главный конференц-зал" }

Ответ

JSON
{ "status": "success", "event": { "id": 2, "title": "Презентация продукта (обновлено)", "description": "Демонстрация новых возможностей CRM", "start_time": "2024-01-25T11:00:00", "end_time": "2024-01-25T12:30:00", "event_type": "presentation", "client_id": 1, "deal_id": 1, "location": "Главный конференц-зал", "created_by": 1, "created_at": "2024-01-16T10:30:00", "updated_at": "2024-01-17T14:30:00" } }

Удаление события календаря

Удаление события из календаря.

DELETE /api/calendar/events/{event_id}

Ответ

JSON
{ "status": "success" }

Уведомления

Получение уведомлений пользователя.

GET /api/notifications
Требуется аутентификация: Добавьте API ключ в заголовок Authorization

Ответ

JSON
[ { "id": 1, "user_id": 1, "title": "Новая задача", "message": "Вам назначена новая задача", "type": "info", "is_read": false, "created_at": "2024-01-15T10:30:00" } ]

Отметить уведомление как прочитанное

Отметить конкретное уведомление как прочитанное.

PUT /api/notifications/{notification_id}/read

Ответ

JSON
{ "status": "success" }

Отметить все уведомления как прочитанные

Отметить все уведомления пользователя как прочитанные.

POST /api/notifications/read-all

Ответ

JSON
{ "status": "success" }

Внутренние сообщения

Получение внутренних сообщений между сотрудниками компании.

GET /api/messages
Требуется аутентификация: Добавьте API ключ в заголовок Authorization

Ответ

JSON
[ { "id": 1, "sender_id": 2, "recipient_id": 1, "subject": "По поводу встречи", "content": "Переносим встречу на 15:00", "is_read": false, "created_at": "2024-01-15T10:30:00" } ]

Создание сообщения

Создание нового внутреннего сообщения.

POST /api/messages

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

JSON
{ "recipient_id": 2, "subject": "Отчет по продажам", "content": "Прошу предоставить отчет за январь" }

Ответ

JSON
{ "status": "success", "message": { "id": 2, "sender_id": 1, "recipient_id": 2, "subject": "Отчет по продажам", "content": "Прошу предоставить отчет за январь", "is_read": false, "created_at": "2024-01-16T10:30:00" } }

Отметить сообщение как прочитанное

Отметить конкретное сообщение как прочитанное.

PUT /api/messages/{message_id}/read

Ответ

JSON
{ "status": "success" }

Сообщения техподдержки

Получение сообщений техподдержки.

GET /api/support/messages
Требуется аутентификация: Добавьте API ключ в заголовок Authorization

Ответ

JSON
[ { "id": 1, "tenant_id": "a1b2c3d4e5f6", "user_id": 1, "subject": "Проблема с интеграцией", "message": "Не работает интеграция с Telegram", "status": "open", "is_from_admin": false, "is_read": false, "created_at": "2024-01-15T10:30:00" } ]

Создание обращения в техподдержку

Создание нового обращения в техподдержку.

POST /api/support/messages

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

JSON
{ "subject": "Проблема с отчетами", "message": "Не формируются отчеты за последнюю неделю" }

Ответ

JSON
{ "status": "success", "message": { "id": 2, "tenant_id": "a1b2c3d4e5f6", "user_id": 1, "subject": "Проблема с отчетами", "message": "Не формируются отчеты за последнюю неделю", "status": "open", "is_from_admin": false, "is_read": false, "created_at": "2024-01-16T10:30:00" } }

Отметить сообщение поддержки как прочитанное

Отметить конкретное сообщение техподдержки как прочитанное.

POST /api/support/messages/{message_id}/read

Ответ

JSON
{ "status": "success" }

Информация о подписке

Получение информации о текущей подписке компании.

GET /api/subscription
Требуется аутентификация: Добавьте API ключ в заголовок Authorization

Ответ

JSON
{ "id": 1, "tenant_id": "a1b2c3d4e5f6", "plan_type": "basic", "max_users": 10, "max_clients": 100, "max_deals": 50, "features": { "crm": true, "analytics": true, "api_access": true }, "status": "active", "start_date": "2024-01-01T00:00:00", "end_date": "2025-01-01T00:00:00", "created_at": "2024-01-01T00:00:00" }

Обновление подписки

Обновление информации о подписке компании.

PUT /api/subscription
Только для владельцев компаний: Требуется роль company_owner

Ответ

JSON
{ "status": "success", "subscription": { "id": 1, "tenant_id": "a1b2c3d4e5f6", "plan_type": "pro", "max_users": 25, "max_clients": 100, "max_deals": 50, "features": { "crm": true, "analytics": true, "api_access": true, "priority_support": true }, "status": "active", "start_date": "2024-01-01T00:00:00", "end_date": "2025-01-01T00:00:00", "created_at": "2024-01-01T00:00:00", "updated_at": "2024-01-16T14:30:00" } }

Платежи

Получение информации о платежах компании.

GET /api/payments
Требуется аутентификация: Добавьте API ключ в заголовок Authorization
Только для владельцев компаний: Требуется роль company_owner

Ответ

JSON
[ { "id": 1, "tenant_id": "a1b2c3d4e5f6", "amount": 5000.00, "currency": "RUB", "payment_method": "bank_card", "subscription_plan": "basic", "status": "completed", "payment_data": { "card_last_four": "4242" }, "created_at": "2024-01-01T00:00:00", "completed_at": "2024-01-01T00:05:00" } ]

Создание платежа

Создание нового платежа для компании.

POST /api/payments
Только для владельцев компаний: Требуется роль company_owner

Ответ

JSON
{ "status": "success", "payment": { "id": 2, "tenant_id": "a1b2c3d4e5f6", "amount": 10000.00, "currency": "RUB", "payment_method": "bank_transfer", "subscription_plan": "pro", "status": "pending", "payment_data": { "bank_name": "Сбербанк", "account_number": "1234567890" }, "created_at": "2024-01-16T10:30:00" } }

Отчеты

Получение созданных отчетов.

GET /api/reports
Требуется аутентификация: Добавьте API ключ в заголовок Authorization

Ответ

JSON
[ { "id": 1, "tenant_id": "a1b2c3d4e5f6", "title": "Отчет по продажам за январь", "report_type": "sales", "data": { "total_sales": 150000, "completed_deals": 15, "average_deal_size": 10000 }, "created_by": 1, "created_at": "2024-01-31T23:59:59" } ]

Создание отчета

Создание нового отчета.

POST /api/reports

Ответ

JSON
{ "status": "success", "report": { "id": 2, "tenant_id": "a1b2c3d4e5f6", "title": "Отчет по клиентам", "report_type": "clients", "data": { "total_clients": 50, "new_clients_this_month": 10, "active_clients": 35 }, "created_by": 1, "created_at": "2024-01-16T10:30:00" } }

Общая статистика

Получение общей статистики по клиентам, сделкам и задачам.

GET /api/statistics
Требуется аутентификация: Добавьте API ключ в заголовок Authorization

Ответ

JSON
{ "clients": { "individual": 15, "legal": 3, "total": 18 }, "tasks": 25, "deals": { "total": 10, "active": 7, "completed": 3 } }

Дашборд

Получение данных для отображения на дашборде (быстрые цифры).

GET /api/dashboard
Требуется аутентификация: Добавьте API ключ в заголовок Authorization

Ответ

JSON
{ "new_clients": 5, "monthly_sales": 150000.00, "completed_deals": 3, "pending_tasks": 8, "conversion_rate": 30.0, "monthly_revenue": 150000.00, "total_clients": 18 }

Активности

Получение последних активностей в системе.

GET /api/activities
Требуется аутентификация: Добавьте API ключ в заголовок Authorization

Ответ

JSON
[ { "id": 1, "tenant_id": "a1b2c3d4e5f6", "user_id": 1, "action_type": "client_created", "details": "Создан новый клиент: Иван Иванов", "created_at": "2024-01-15T10:30:00" } ]

Логи API

Получение логов API действий.

GET /api/logs
Требуется аутентификация: Добавьте API ключ в заголовок Authorization
Ограниченный доступ: Только для владельцев компаний, супер-админов и разработчиков

Ответ

JSON
[ { "id": 1, "tenant_id": "a1b2c3d4e5f6", "user_id": 1, "user_role": "company_owner", "endpoint": "/api/clients/individual", "method": "POST", "response_status": 200, "ip_address": "192.168.1.1", "user_agent": "Mozilla/5.0...", "execution_time_ms": 150, "created_at": "2024-01-15T10:30:00" } ]

Публичные лиды

Прием лидов с сайтов и приложений без аутентификации (требуется только API ключ).

POST /api/public/lead

Универсальный эндпоинт для приема лидов. Работает с GET и POST запросами.

Ответ

JSON Response
{ "status": "success", "message": "Заявка успешно добавлена в CRM!" }

Заявки через публичный API

Создание заявок через публичный API без авторизации (требуется tenant_id в заголовке или параметре).

POST /api/public/leads
Без авторизации: Этот endpoint не требует API ключа, но требует tenant_id в заголовке X-Tenant-ID или параметре запроса

Заголовки запроса

Headers
Content-Type: application/json X-Tenant-ID: ваш_tenant_id

Параметры запроса (JSON)

JSON
{ "first_name": "Анна", "last_name": "Сидорова", "phone": "+79161234572", "email": "anna@example.com", "company_name": "ИП Сидорова", "message": "Интересуюсь демо-версией", "source": "landing_page", "status": "new", "priority": "medium", "assigned_to": null, "tags": ["важный", "новый_клиент"], "custom_fields": { "utm_source": "google", "utm_campaign": "summer2024" } }

Параметры (все опциональны, кроме tenant_id)

  • first_name (string, optional) - Имя
  • last_name (string, optional) - Фамилия
  • phone (string, optional) - Телефон
  • email (string, optional) - Email
  • company_name (string, optional) - Название компании
  • message (string, optional) - Сообщение/комментарий
  • source (string, default: "api") - Источник заявки
  • status (string, default: "new") - Статус: "new", "contacted", "qualified", "converted", "lost"
  • priority (string, default: "medium") - Приоритет: "low", "medium", "high"
  • assigned_to (integer, optional) - ID пользователя, которому назначена заявка
  • tags (array, optional) - Массив тегов
  • custom_fields (object, optional) - Дополнительные поля

Ответ

JSON
{ "status": "success", "lead": { "id": 3, "first_name": "Анна", "last_name": "Сидорова", "phone": "+79161234572", "email": "anna@example.com", "company_name": "ИП Сидорова", "message": "Интересуюсь демо-версией", "source": "landing_page", "status": "new", "priority": "medium", "created_at": "2024-01-16T10:30:00Z" } }

Примеры HTML форм для заявок

Готовые HTML формы, которые можно вставить на ваш сайт. Просто замените YOUR_TENANT_ID на ваш tenant_id.

Простая форма заявки

HTML
<!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Оставить заявку</title> <style> body { font-family: Arial, sans-serif; max-width: 500px; margin: 50px auto; padding: 20px; } .form-group { margin-bottom: 15px; } label { display: block; margin-bottom: 5px; font-weight: bold; } input, textarea { width: 100%; padding: 10px; border: 1px solid #ddd; border-radius: 4px; box-sizing: border-box; } button { background: #4361ee; color: white; padding: 12px 30px; border: none; border-radius: 4px; cursor: pointer; font-size: 16px; } button:hover { background: #3a56d4; } .message { margin-top: 15px; padding: 10px; border-radius: 4px; display: none; } .success { background: #d4edda; color: #155724; border: 1px solid #c3e6cb; } .error { background: #f8d7da; color: #721c24; border: 1px solid #f5c6cb; } </style> </head> <body> <h2>Оставить заявку</h2> <form id="leadForm"> <div class="form-group"> <label for="first_name">Имя *</label> <input type="text" id="first_name" name="first_name" required> </div> <div class="form-group"> <label for="last_name">Фамилия *</label> <input type="text" id="last_name" name="last_name" required> </div> <div class="form-group"> <label for="phone">Телефон *</label> <input type="tel" id="phone" name="phone" required> </div> <div class="form-group"> <label for="email">Email *</label> <input type="email" id="email" name="email" required> </div> <div class="form-group"> <label for="message">Сообщение</label> <textarea id="message" name="message" rows="4"></textarea> </div> <button type="submit">Отправить заявку</button> </form> <div id="messageDiv" class="message"></div> <script> const TENANT_ID = 'YOUR_TENANT_ID'; // Замените на ваш tenant_id const API_URL = 'https://appap.sbs/api/public/leads'; document.getElementById('leadForm').addEventListener('submit', async function(e) { e.preventDefault(); const formData = { first_name: document.getElementById('first_name').value, last_name: document.getElementById('last_name').value, phone: document.getElementById('phone').value, email: document.getElementById('email').value, message: document.getElementById('message').value, source: 'website_form' }; try { const response = await fetch(API_URL, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Tenant-ID': TENANT_ID }, body: JSON.stringify(formData) }); const result = await response.json(); const messageDiv = document.getElementById('messageDiv'); if (response.ok && result.status === 'success') { messageDiv.className = 'message success'; messageDiv.textContent = 'Заявка успешно отправлена! Мы свяжемся с вами в ближайшее время.'; messageDiv.style.display = 'block'; document.getElementById('leadForm').reset(); } else { messageDiv.className = 'message error'; messageDiv.textContent = 'Ошибка при отправке заявки. Попробуйте еще раз.'; messageDiv.style.display = 'block'; } } catch (error) { const messageDiv = document.getElementById('messageDiv'); messageDiv.className = 'message error'; messageDiv.textContent = 'Ошибка при отправке заявки. Попробуйте еще раз.'; messageDiv.style.display = 'block'; } }); </script> </body> </html>

Расширенная форма с дополнительными полями

HTML
<!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Расширенная форма заявки</title> <style> body { font-family: Arial, sans-serif; max-width: 600px; margin: 50px auto; padding: 20px; background: #f5f7fb; } .form-container { background: white; padding: 30px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); } .form-group { margin-bottom: 20px; } label { display: block; margin-bottom: 5px; font-weight: bold; color: #333; } input, textarea, select { width: 100%; padding: 12px; border: 1px solid #ddd; border-radius: 4px; box-sizing: border-box; font-size: 14px; } button { background: linear-gradient(135deg, #4361ee 0%, #7209b7 100%); color: white; padding: 14px 40px; border: none; border-radius: 4px; cursor: pointer; font-size: 16px; font-weight: bold; width: 100%; } button:hover { opacity: 0.9; } button:disabled { opacity: 0.6; cursor: not-allowed; } .message { margin-top: 20px; padding: 15px; border-radius: 4px; display: none; } .success { background: #d4edda; color: #155724; border: 1px solid #c3e6cb; } .error { background: #f8d7da; color: #721c24; border: 1px solid #f5c6cb; } </style> </head> <body> <div class="form-container"> <h2>Оставить заявку</h2> <form id="leadForm"> <div class="form-group"> <label for="first_name">Имя *</label> <input type="text" id="first_name" name="first_name" required> </div> <div class="form-group"> <label for="last_name">Фамилия *</label> <input type="text" id="last_name" name="last_name" required> </div> <div class="form-group"> <label for="phone">Телефон *</label> <input type="tel" id="phone" name="phone" placeholder="+7 (999) 123-45-67" required> </div> <div class="form-group"> <label for="email">Email *</label> <input type="email" id="email" name="email" required> </div> <div class="form-group"> <label for="company_name">Название компании</label> <input type="text" id="company_name" name="company_name"> </div> <div class="form-group"> <label for="priority">Приоритет</label> <select id="priority" name="priority"> <option value="low">Низкий</option> <option value="medium" selected>Средний</option> <option value="high">Высокий</option> </select> </div> <div class="form-group"> <label for="message">Сообщение</label> <textarea id="message" name="message" rows="5" placeholder="Опишите ваш запрос..."></textarea> </div> <button type="submit" id="submitBtn">Отправить заявку</button> </form> <div id="messageDiv" class="message"></div> </div> <script> const TENANT_ID = 'YOUR_TENANT_ID'; // Замените на ваш tenant_id const API_URL = 'https://appap.sbs/api/public/leads'; document.getElementById('leadForm').addEventListener('submit', async function(e) { e.preventDefault(); const submitBtn = document.getElementById('submitBtn'); submitBtn.disabled = true; submitBtn.textContent = 'Отправка...'; const formData = { first_name: document.getElementById('first_name').value, last_name: document.getElementById('last_name').value, phone: document.getElementById('phone').value, email: document.getElementById('email').value, company_name: document.getElementById('company_name').value || null, message: document.getElementById('message').value || null, priority: document.getElementById('priority').value, source: 'website_form', tags: ['веб-форма'], custom_fields: { form_type: 'extended', submitted_at: new Date().toISOString() } }; try { const response = await fetch(API_URL, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Tenant-ID': TENANT_ID }, body: JSON.stringify(formData) }); const result = await response.json(); const messageDiv = document.getElementById('messageDiv'); if (response.ok && result.status === 'success') { messageDiv.className = 'message success'; messageDiv.textContent = '✓ Заявка успешно отправлена! Мы свяжемся с вами в ближайшее время.'; messageDiv.style.display = 'block'; document.getElementById('leadForm').reset(); } else { messageDiv.className = 'message error'; messageDiv.textContent = '✗ Ошибка при отправке заявки: ' + (result.detail || 'Попробуйте еще раз'); messageDiv.style.display = 'block'; } } catch (error) { const messageDiv = document.getElementById('messageDiv'); messageDiv.className = 'message error'; messageDiv.textContent = '✗ Ошибка при отправке заявки. Проверьте подключение к интернету.'; messageDiv.style.display = 'block'; } finally { submitBtn.disabled = false; submitBtn.textContent = 'Отправить заявку'; } }); </script> </body> </html>

Минимальная форма (только имя и телефон)

HTML
<form id="quickLeadForm" style="max-width: 300px; margin: 20px auto;"> <input type="text" id="quick_name" placeholder="Ваше имя" required style="width: 100%; padding: 10px; margin-bottom: 10px; border: 1px solid #ddd; border-radius: 4px;"> <input type="tel" id="quick_phone" placeholder="Телефон" required style="width: 100%; padding: 10px; margin-bottom: 10px; border: 1px solid #ddd; border-radius: 4px;"> <button type="submit" style="width: 100%; padding: 12px; background: #4361ee; color: white; border: none; border-radius: 4px; cursor: pointer;">Позвоните мне</button> </form> <script> const TENANT_ID = 'YOUR_TENANT_ID'; // Замените на ваш tenant_id document.getElementById('quickLeadForm').addEventListener('submit', async function(e) { e.preventDefault(); await fetch('https://appap.sbs/api/public/leads', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Tenant-ID': TENANT_ID }, body: JSON.stringify({ first_name: document.getElementById('quick_name').value, phone: document.getElementById('quick_phone').value, source: 'quick_form' }) }); alert('Спасибо! Мы свяжемся с вами в ближайшее время.'); this.reset(); }); </script>

Восстановление пароля

Отправка нового пароля на email пользователя.

POST /api/auth/forgot-password
Без авторизации: Этот endpoint не требует API ключа

Параметры запроса (JSON)

JSON
{ "email": "user@example.com" }

Ответ

JSON
{ "status": "success", "message": "Новый пароль отправлен на ваш email" }

Отправка кода двухфакторной аутентификации

Отправка 6-значного кода 2FA на email пользователя.

POST /api/auth/send-2fa-code
Без авторизации: Этот endpoint не требует API ключа

Параметры запроса (JSON)

JSON
{ "user_id": 123 }

Ответ

JSON
{ "status": "success", "message": "Код отправлен на ваш email" }
Важно: Код действителен 10 минут

Google OAuth

Вход и привязка Google аккаунта.

POST /api/auth/google

Вход через Google OAuth. Требуется код авторизации от Google.

Параметры запроса (Form Data)

Form Data
code: authorization_code_from_google

Ответ

JSON
{ "status": "success", "api_key": "your_api_key", "tenant_id": "your_tenant_id", "user_role": "company_owner" }
GET /api/user/google-oauth

Получить статус привязки Google аккаунта.

Ответ

JSON
{ "linked": true, "email": "user@gmail.com", "name": "Иван Иванов", "picture_url": "https://...", "connected_at": "2024-01-15T10:30:00Z" }
POST /api/user/google-oauth/link-code

Привязать Google аккаунт через код авторизации.

Параметры запроса (Form Data)

Form Data
code: authorization_code_from_google redirect_uri: https://appap.sbs/dashboard.html
DELETE /api/user/google-oauth/unlink

Отвязать Google аккаунт от пользователя.

Ответ

JSON
{ "status": "success" }

Сессии пользователя

Управление активными сессиями пользователя.

GET /api/user/sessions

Получить все активные сессии пользователя.

Ответ

JSON
{ "sessions": [ { "id": 1, "session_token": "abc123...", "device_info": "Chrome on Windows", "ip_address": "192.168.1.1", "location": "Москва, Россия", "created_at": "2024-01-15T10:30:00Z", "last_activity": "2024-01-15T15:45:00Z" } ] }
DELETE /api/user/sessions/{session_token}

Завершить конкретную сессию пользователя.

Ответ

JSON
{ "status": "success", "message": "Сессия завершена" }

Настройки уведомлений

Управление настройками email уведомлений и двухфакторной аутентификации.

GET /api/user/notification-settings

Получить текущие настройки уведомлений.

Ответ

JSON
{ "email_notifications_enabled": true, "two_factor_enabled": false }
PUT /api/user/notification-settings

Обновить настройки уведомлений.

Параметры запроса (JSON)

JSON
{ "email_notifications_enabled": true, "two_factor_enabled": true }

Ответ

JSON
{ "status": "success", "message": "Настройки обновлены" }

Проверка здоровья системы

Проверка работоспособности API сервера.

GET /health

Ответ

JSON
{ "status": "ok" }

Корневой эндпоинт

Базовый эндпоинт для проверки доступности API.

GET /

Ответ

JSON
{ "message": "CRMPro API работает!", "version": "3.0" }

Ошибки API

Стандартные форматы ошибок, возвращаемых API.

Ошибка аутентификации (401)

JSON
{ "detail": "Invalid API key" }

Ошибка доступа (403)

JSON
{ "detail": "Permission denied" }

Ошибка валидации (400/422)

JSON
{ "detail": "User already exists" }

Не найдено (404)

JSON
{ "detail": "Client not found" }

Базовый URL

Все API запросы должны отправляться на следующие базовые URL:

Базовые URL
# Для разработки http://appap.sbs # Для продакшена https://appap.sbs
Пример полного URL: https://appap.sbs/api/register

Готовы начать работу с API?

Получите API ключ и начните интегрировать CRMPro с вашими приложениями уже сегодня

Получить API ключ