14 KiB
14 KiB
API Документация: Маркетинговый анализ
Обзор
API для запуска маркетингового анализа на основе данных о бизнесе пользователя. Эндпоинт принимает информацию о продукте, локации, типе клиентов и уникальных особенностях бизнеса, затем генерирует маркетинговый отчет.
Эндпоинт
POST /api/marketing/analysis/start
Базовый URL
https://api.konturai.kz/api/marketing/analysis/start
Запрос
Заголовки
Content-Type: application/json
Authorization: Bearer {access_token} // Опционально, если требуется аутентификация
Тело запроса (JSON)
| Поле | Тип | Обязательный | Описание | Пример значения |
|---|---|---|---|---|
product |
string | ✅ | Название продукта или услуги | "Веб-разработка" |
location |
string | ✅ | Географическая локация работы | "Алматы, Казахстан" |
client |
string | ✅ | Тип целевой аудитории | "B2B клиенты" |
differentiator |
string | ✅ | Уникальные особенности бизнеса | "Быстрая разработка за 2 недели" |
Валидация полей
product (string, обязательное)
- Минимальная длина: 3 символа
- Максимальная длина: 200 символов
- Паттерн: Разрешены буквы, цифры, пробелы, дефисы, запятые
- Ошибка валидации:
"product": "Поле 'product' должно содержать от 3 до 200 символов"
location (string, обязательное)
- Минимальная длина: 2 символа
- Максимальная длина: 150 символов
- Паттерн: Разрешены буквы, цифры, пробелы, запятые, дефисы
- Ошибка валидации:
"location": "Поле 'location' должно содержать от 2 до 150 символов"
client (string, обязательное)
- Допустимые значения:
"B2B клиенты""B2C клиенты""Частные лица""Корпорации""Малый бизнес"
- Ошибка валидации:
"client": "Поле 'client' должно быть одним из: B2B клиенты, B2C клиенты, Частные лица, Корпорации, Малый бизнес"
differentiator (string, обязательное)
- Минимальная длина: 10 символов
- Максимальная длина: 500 символов
- Паттерн: Разрешены любые символы
- Ошибка валидации:
"differentiator": "Поле 'differentiator' должно содержать от 10 до 500 символов"
Пример запроса
{
"product": "Разработка мобильных приложений",
"location": "Нур-Султан, Казахстан",
"client": "B2B клиенты",
"differentiator": "Специализируемся на быстрой разработке MVP за 4 недели с использованием современных технологий"
}
Ответ
Успешный ответ (200 OK)
{
"success": true,
"data": {
"analysisId": "550e8400-e29b-41d4-a716-446655440000",
"status": "processing",
"estimatedCompletionTime": "2025-01-20T15:30:00Z",
"message": "Анализ запущен успешно. Результаты будут готовы в течение 5-10 минут."
}
}
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
success |
boolean | Флаг успешности операции |
data.analysisId |
string | Уникальный идентификатор анализа (UUID) |
data.status |
string | Статус анализа: "processing", "completed", "failed" |
data.estimatedCompletionTime |
string | ISO 8601 дата/время ожидаемого завершения анализа |
data.message |
string | Информационное сообщение для пользователя |
Асинхронная обработка (202 Accepted)
Если анализ требует длительной обработки, сервер может вернуть статус 202:
{
"success": true,
"data": {
"analysisId": "550e8400-e29b-41d4-a716-446655440000",
"status": "queued",
"queuePosition": 3,
"estimatedWaitTime": 300,
"message": "Запрос добавлен в очередь. Примерное время ожидания: 5 минут."
}
}
Обработка ошибок
Ошибки валидации (400 Bad Request)
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "Ошибка валидации входных данных",
"details": {
"product": "Поле 'product' обязательно для заполнения",
"client": "Недопустимое значение поля 'client'"
}
}
}
Ошибка аутентификации (401 Unauthorized)
{
"success": false,
"error": {
"code": "UNAUTHORIZED",
"message": "Требуется аутентификация"
}
}
Ошибка сервера (500 Internal Server Error)
{
"success": false,
"error": {
"code": "INTERNAL_SERVER_ERROR",
"message": "Произошла внутренняя ошибка сервера. Попробуйте позже."
}
}
Ошибка таймаута (504 Gateway Timeout)
{
"success": false,
"error": {
"code": "TIMEOUT",
"message": "Превышено время ожидания ответа от сервиса анализа"
}
}
Получение результатов анализа
После успешного запуска анализа, результаты можно получить по идентификатору:
GET /api/marketing/analysis/{analysisId}
Пример запроса
GET /api/marketing/analysis/550e8400-e29b-41d4-a716-446655440000
Пример ответа (когда анализ завершен)
{
"success": true,
"data": {
"analysisId": "550e8400-e29b-41d4-a716-446655440000",
"status": "completed",
"createdAt": "2025-01-20T15:00:00Z",
"completedAt": "2025-01-20T15:08:00Z",
"report": {
"summary": "Краткое резюме анализа...",
"targetAudience": {
"description": "Описание целевой аудитории...",
"channels": ["Instagram", "LinkedIn", "Telegram"]
},
"recommendations": ["Рекомендация 1", "Рекомендация 2"],
"strategy": {
"duration": "2 недели",
"channels": ["Instagram", "Telegram", "21MC"],
"contentTypes": ["посты", "сторис", "баннеры"]
},
"pdfUrl": "/api/marketing/analysis/550e8400-e29b-41d4-a716-446655440000/download"
}
}
}
Статусы анализа
queued- Запрос в очереди на обработкуprocessing- Анализ выполняетсяcompleted- Анализ завершен успешноfailed- Анализ завершился с ошибкой
Рекомендации по реализации
1. Валидация на бэкенде
// Пример валидации (Java/Spring Boot)
@PostMapping("/api/marketing/analysis/start")
public ResponseEntity<?> startAnalysis(@Valid @RequestBody MarketingAnalysisRequest request) {
// Валидация выполняется автоматически через @Valid
// Дополнительная бизнес-логика валидации
if (!isValidClientType(request.getClient())) {
return ResponseEntity.badRequest()
.body(new ErrorResponse("VALIDATION_ERROR", "Недопустимый тип клиента"));
}
// Обработка запроса
}
2. Асинхронная обработка
Рекомендуется использовать асинхронную обработку для длительных операций:
@Async
public CompletableFuture<AnalysisResult> processAnalysis(MarketingAnalysisRequest request) {
// Длительная обработка
// Генерация отчета
// Сохранение результатов
return CompletableFuture.completedFuture(result);
}
3. Хранение данных
Рекомендуемая структура таблицы в БД:
CREATE TABLE marketing_analysis (
id UUID PRIMARY KEY,
product VARCHAR(200) NOT NULL,
location VARCHAR(150) NOT NULL,
client_type VARCHAR(50) NOT NULL,
differentiator TEXT NOT NULL,
status VARCHAR(20) NOT NULL,
created_at TIMESTAMP NOT NULL,
completed_at TIMESTAMP,
user_id UUID, -- Если требуется аутентификация
report_data JSONB, -- JSON с результатами анализа
CONSTRAINT valid_client_type CHECK (client_type IN (
'B2B клиенты', 'B2C клиенты', 'Частные лица', 'Корпорации', 'Малый бизнес'
)),
CONSTRAINT valid_status CHECK (status IN (
'queued', 'processing', 'completed', 'failed'
))
);
4. Интеграция с AI сервисом
Если используется внешний AI сервис для генерации анализа:
public AnalysisResult generateAnalysis(MarketingAnalysisRequest request) {
// Подготовка промпта для AI
String prompt = String.format(
"Проанализируй бизнес:\n" +
"Продукт: %s\n" +
"Локация: %s\n" +
"Клиенты: %s\n" +
"Уникальность: %s\n" +
"Создай маркетинговую стратегию...",
request.getProduct(),
request.getLocation(),
request.getClient(),
request.getDifferentiator()
);
// Вызов AI API
return aiService.generateReport(prompt);
}
5. Обработка ошибок
@ExceptionHandler(ValidationException.class)
public ResponseEntity<ErrorResponse> handleValidationException(ValidationException e) {
return ResponseEntity.badRequest()
.body(new ErrorResponse("VALIDATION_ERROR", e.getMessage(), e.getDetails()));
}
@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResponse> handleGenericException(Exception e) {
log.error("Unexpected error", e);
return ResponseEntity.status(500)
.body(new ErrorResponse("INTERNAL_SERVER_ERROR", "Внутренняя ошибка сервера"));
}
Тестирование
Примеры тестовых запросов
Успешный запрос
curl -X POST https://api.konturai.kz/api/marketing/analysis/start \
-H "Content-Type: application/json" \
-d '{
"product": "Разработка мобильных приложений",
"location": "Алматы, Казахстан",
"client": "B2B клиенты",
"differentiator": "Специализируемся на быстрой разработке MVP за 4 недели"
}'
Запрос с ошибкой валидации
curl -X POST https://api.konturai.kz/api/marketing/analysis/start \
-H "Content-Type: application/json" \
-d '{
"product": "AB",
"location": "Алматы",
"client": "Неверный тип",
"differentiator": "Коротко"
}'
Примечания
- Аутентификация: Если требуется аутентификация, используйте JWT токен в заголовке
Authorization - Rate Limiting: Рекомендуется ограничить количество запросов на пользователя (например, 10 запросов в час)
- Кэширование: Можно кэшировать результаты для одинаковых запросов
- Логирование: Все запросы должны логироваться для отладки и аналитики
- Мониторинг: Отслеживайте время выполнения анализа и процент успешных завершений