# API Документация: Маркетинговый анализ и стратегии (Frontend/AI Agent)

## Базовый URL

```
https://api.konturai.kz
```

## Обзор

API для генерации маркетингового анализа и стратегий на основе данных о бизнесе. Все эндпоинты требуют JWT аутентификации для связи данных с пользователем.

**Важные изменения:**

- ✅ Все эндпоинты теперь требуют JWT токен в заголовке `Authorization`
- ✅ Пользователи могут видеть только свои анализы и стратегии
- ✅ Добавлена детальная история статусов для каждого анализа и стратегии
- ✅ Новые эндпоинты для получения списка всех анализов/стратегий пользователя
- ✅ **НОВОЕ**: Добавлена поддержка типов анализов (РЫНОК, КОНКУРЕНТЫ, ЦА, КАНАЛЫ, SWOT)

---

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

Все запросы должны включать JWT токен в заголовке `Authorization`:

```
Authorization: Bearer <your_jwt_token>
```

### Структура JWT токена

JWT токен содержит следующую информацию:

- **sub**: Email пользователя
- **uid**: ID пользователя (Long) - используется для связи данных
- **roles**: Роли пользователя (String, разделённые запятыми)

### Ошибки аутентификации

Если токен отсутствует или невалиден, API вернет:

```json
{
  "success": false,
  "message": "Не авторизован",
  "error": {
    "code": "UNAUTHORIZED",
    "message": "Требуется аутентификация. Пожалуйста, предоставьте валидный JWT токен."
  }
}
```

**HTTP статус**: `401 Unauthorized`

---

## Эндпоинты

### 1. Запуск маркетингового анализа

**POST** `/api/marketing/analysis/start`

Создает новую задачу на генерацию маркетингового анализа и запускает асинхронную обработку. Анализ автоматически связывается с пользователем из JWT токена.

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

```
Content-Type: application/json
Authorization: Bearer <your_jwt_token>
```

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

| Поле             | Тип    | Обязательный | Описание                       | Пример значения                  |
| ---------------- | ------ | ------------ | ------------------------------ | -------------------------------- |
| `product`        | string | ✅           | Название продукта или услуги   | "Веб-разработка"                 |
| `location`       | string | ✅           | Географическая локация работы  | "Алматы, Казахстан"              |
| `client`         | string | ✅           | Тип целевой аудитории          | "B2B клиенты"                    |
| `differentiator` | string | ✅           | Уникальные особенности бизнеса | "Быстрая разработка за 2 недели" |
| `analysisType`   | string | ✅           | Тип анализа для генерации      | "РЫНОК"                          |

#### Валидация полей

**`product`** (string, обязательное)

- Минимальная длина: 3 символа
- Максимальная длина: 200 символов

**`location`** (string, обязательное)

- Минимальная длина: 2 символа
- Максимальная длина: 150 символов

**`client`** (string, обязательное)

- Допустимые значения:
  - `"B2B клиенты"`
  - `"B2C клиенты"`
  - `"Частные лица"`
  - `"Корпорации"`
  - `"Малый бизнес"`

**`differentiator`** (string, обязательное)

- Минимальная длина: 10 символов
- Максимальная длина: 500 символов

**`analysisType`** (string, обязательное)

- Допустимые значения (регистр не важен, но рекомендуется использовать заглавные буквы):
  - `"РЫНОК"` - Анализ рынка (размер рынка, динамика роста, сегменты, тренды)
  - `"КОНКУРЕНТЫ"` - Анализ конкурентов (основные конкуренты, их сильные/слабые стороны, позиционирование)
  - `"ЦА"` - Анализ целевой аудитории (демография, психография, потребности, поведение)
  - `"КАНАЛЫ"` - Анализ маркетинговых каналов (эффективность каналов, рекомендации по выбору)
  - `"SWOT"` - SWOT-анализ (сильные стороны, слабые стороны, возможности, угрозы)

#### Пример запроса

```javascript
const response = await fetch(
  'https://api.konturai.kz/api/marketing/analysis/start',
  {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      Authorization: `Bearer ${jwtToken}`,
    },
    body: JSON.stringify({
      product: 'Разработка мобильных приложений',
      location: 'Нур-Султан, Казахстан',
      client: 'B2B клиенты',
      differentiator: 'Специализируемся на быстрой разработке MVP за 4 недели',
      analysisType: 'РЫНОК',
    }),
  }
);
```

#### Пример успешного ответа (200 OK)

```json
{
  "success": true,
  "message": "Анализ запущен успешно",
  "data": {
    "analysisId": "507f1f77bcf86cd799439011",
    "status": "processing",
    "estimatedCompletionTime": "2025-01-20T15:38:00",
    "message": "Анализ запущен успешно. Результаты будут готовы в течение 5-10 минут."
  }
}
```

---

### 2. Получение результата анализа

**GET** `/api/marketing/analysis/{analysisId}`

Возвращает статус и результаты анализа по идентификатору. Пользователь может получить только свои анализы.

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

```
Authorization: Bearer <your_jwt_token>
```

#### Параметры пути

| Параметр     | Тип    | Описание              |
| ------------ | ------ | --------------------- |
| `analysisId` | string | Идентификатор анализа |

#### Пример запроса

```javascript
const response = await fetch(
  `https://api.konturai.kz/api/marketing/analysis/${analysisId}`,
  {
    headers: {
      Authorization: `Bearer ${jwtToken}`,
    },
  }
);
```

#### Пример ответа (когда анализ завершен - 200 OK)

```json
{
  "success": true,
  "message": "Операция выполнена успешно",
  "data": {
    "analysisId": "507f1f77bcf86cd799439011",
    "status": "completed",
    "createdAt": "2025-01-20T15:30:00",
    "completedAt": "2025-01-20T15:38:00",
    "report": {
      "summary": "Краткое резюме анализа...",
      "targetAudience": {
        "description": "Описание целевой аудитории...",
        "channels": ["Instagram", "LinkedIn", "Telegram"]
      },
      "recommendations": ["Рекомендация 1", "Рекомендация 2"],
      "strategy": {
        "duration": "2 недели",
        "channels": ["Instagram", "Telegram", "21MC"],
        "contentTypes": ["посты", "сторис", "баннеры"]
      },
      "pdfUrl": "/api/marketing/analysis/507f1f77bcf86cd799439011/download"
    }
  }
}
```

#### Статусы анализа

| Статус       | Описание                      |
| ------------ | ----------------------------- |
| `queued`     | Запрос в очереди на обработку |
| `processing` | Анализ выполняется            |
| `completed`  | Анализ завершен успешно       |
| `failed`     | Анализ завершился с ошибкой   |

#### Ошибки доступа

Если пользователь пытается получить доступ к анализу другого пользователя:

```json
{
  "success": false,
  "message": "Доступ запрещен",
  "error": {
    "code": "FORBIDDEN",
    "message": "У вас нет доступа к этому анализу"
  }
}
```

**HTTP статус**: `403 Forbidden`

---

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

**GET** `/api/marketing/analysis/my`

Возвращает список всех анализов текущего пользователя, отсортированных по дате создания (новые первыми).

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

```
Authorization: Bearer <your_jwt_token>
```

#### Пример запроса

```javascript
const response = await fetch(
  'https://api.konturai.kz/api/marketing/analysis/my',
  {
    headers: {
      Authorization: `Bearer ${jwtToken}`,
    },
  }
);
```

#### Пример успешного ответа (200 OK)

```json
{
  "success": true,
  "message": "Операция выполнена успешно",
  "data": [
    {
      "analysisId": "507f1f77bcf86cd799439011",
      "product": "Разработка мобильных приложений",
      "location": "Нур-Султан, Казахстан",
      "clientType": "B2B клиенты",
      "differentiator": "Быстрая разработка MVP за 4 недели",
      "status": "completed",
      "userId": "12345",
      "createdAt": "2025-01-20T15:30:00",
      "completedAt": "2025-01-20T15:38:00",
      "statusHistory": [
        {
          "status": "queued",
          "timestamp": "2025-01-20T15:30:00",
          "message": "Анализ создан и добавлен в очередь"
        },
        {
          "status": "processing",
          "timestamp": "2025-01-20T15:30:05",
          "message": "Начата обработка анализа"
        },
        {
          "status": "completed",
          "timestamp": "2025-01-20T15:38:00",
          "message": "Анализ успешно завершен"
        }
      ]
    },
    {
      "analysisId": "507f1f77bcf86cd799439012",
      "product": "Веб-разработка",
      "location": "Алматы, Казахстан",
      "clientType": "B2C клиенты",
      "differentiator": "Современные технологии",
      "status": "processing",
      "userId": "12345",
      "createdAt": "2025-01-20T14:00:00",
      "completedAt": null,
      "statusHistory": [
        {
          "status": "queued",
          "timestamp": "2025-01-20T14:00:00",
          "message": "Анализ создан и добавлен в очередь"
        },
        {
          "status": "processing",
          "timestamp": "2025-01-20T14:00:05",
          "message": "Начата обработка анализа"
        }
      ]
    }
  ]
}
```

#### Структура ответа

| Поле                               | Тип    | Описание                                               |
| ---------------------------------- | ------ | ------------------------------------------------------ |
| `data[].analysisId`                | string | Уникальный идентификатор анализа                       |
| `data[].product`                   | string | Название продукта или услуги                           |
| `data[].location`                  | string | Географическая локация                                 |
| `data[].clientType`                | string | Тип целевой аудитории                                  |
| `data[].differentiator`            | string | Уникальные особенности бизнеса                         |
| `data[].status`                    | string | Текущий статус анализа                                 |
| `data[].userId`                    | string | ID пользователя (из JWT)                               |
| `data[].createdAt`                 | string | ISO 8601 дата/время создания                           |
| `data[].completedAt`               | string | ISO 8601 дата/время завершения (null если не завершен) |
| `data[].statusHistory`             | array  | Детальная история изменений статуса                    |
| `data[].statusHistory[].status`    | string | Статус на момент изменения                             |
| `data[].statusHistory[].timestamp` | string | ISO 8601 дата/время изменения статуса                  |
| `data[].statusHistory[].message`   | string | Описание изменения статуса                             |

---

### 4. Получение детальной истории анализа

**GET** `/api/marketing/analysis/{analysisId}/history`

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

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

```
Authorization: Bearer <your_jwt_token>
```

#### Параметры пути

| Параметр     | Тип    | Описание              |
| ------------ | ------ | --------------------- |
| `analysisId` | string | Идентификатор анализа |

#### Пример запроса

```javascript
const response = await fetch(
  `https://api.konturai.kz/api/marketing/analysis/${analysisId}/history`,
  {
    headers: {
      Authorization: `Bearer ${jwtToken}`,
    },
  }
);
```

#### Пример успешного ответа (200 OK)

```json
{
  "success": true,
  "message": "Операция выполнена успешно",
  "data": {
    "analysisId": "507f1f77bcf86cd799439011",
    "product": "Разработка мобильных приложений",
    "location": "Нур-Султан, Казахстан",
    "clientType": "B2B клиенты",
    "differentiator": "Быстрая разработка MVP за 4 недели",
    "status": "completed",
    "userId": "12345",
    "createdAt": "2025-01-20T15:30:00",
    "completedAt": "2025-01-20T15:38:00",
    "statusHistory": [
      {
        "status": "queued",
        "timestamp": "2025-01-20T15:30:00",
        "message": "Анализ создан и добавлен в очередь"
      },
      {
        "status": "processing",
        "timestamp": "2025-01-20T15:30:05",
        "message": "Начата обработка анализа"
      },
      {
        "status": "completed",
        "timestamp": "2025-01-20T15:38:00",
        "message": "Анализ успешно завершен"
      }
    ]
  }
}
```

---

### 5. Скачивание PDF отчета

**GET** `/api/marketing/analysis/{analysisId}/download`

Возвращает PDF файл с полным маркетинговым отчетом. Пользователь может скачать только свои отчеты.

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

```
Authorization: Bearer <your_jwt_token>
```

#### Параметры пути

| Параметр     | Тип    | Описание              |
| ------------ | ------ | --------------------- |
| `analysisId` | string | Идентификатор анализа |

#### Пример запроса

```javascript
const response = await fetch(
  `https://api.konturai.kz/api/marketing/analysis/${analysisId}/download`,
  {
    headers: {
      Authorization: `Bearer ${jwtToken}`,
    },
  }
);

if (response.ok) {
  const blob = await response.blob();
  const url = window.URL.createObjectURL(blob);
  const a = document.createElement('a');
  a.href = url;
  a.download = `marketing_analysis_${analysisId}.pdf`;
  a.click();
}
```

#### Успешный ответ (200 OK)

- **Content-Type**: `application/pdf`
- **Content-Disposition**: `attachment; filename="marketing_analysis_{analysisId}_{timestamp}.pdf"`
- **Body**: Бинарные данные PDF файла

---

### 6. Генерация маркетинговой стратегии

**POST** `/api/marketing/analysis/strategy/generate`

Создает маркетинговую стратегию на основе завершенного анализа. Стратегия автоматически связывается с пользователем из JWT токена.

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

```
Content-Type: application/json
Authorization: Bearer <your_jwt_token>
```

#### Параметры запроса

| Параметр            | Тип     | Обязательный | Описание                                      |
| ------------------- | ------- | ------------ | --------------------------------------------- |
| `analysisId`        | string  | ✅           | ID завершенного анализа (query parameter)     |
| `durationWeeks`     | integer | ❌           | Длительность стратегии в неделях (default: 4) |
| `priorityPlatforms` | array   | ❌           | Приоритетные платформы (массив строк)         |

#### Тело запроса (JSON, опционально)

```json
{
  "durationWeeks": 4,
  "priorityPlatforms": ["Instagram", "LinkedIn", "Telegram"]
}
```

#### Пример запроса

```javascript
const response = await fetch(
  `https://api.konturai.kz/api/marketing/analysis/strategy/generate?analysisId=${analysisId}`,
  {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      Authorization: `Bearer ${jwtToken}`,
    },
    body: JSON.stringify({
      durationWeeks: 4,
      priorityPlatforms: ['Instagram', 'LinkedIn', 'Telegram'],
    }),
  }
);
```

#### Пример успешного ответа (200 OK)

```json
{
  "success": true,
  "message": "Генерация стратегии запущена успешно. Результаты будут готовы в течение 3-5 минут.",
  "data": {
    "strategyId": "507f1f77bcf86cd799439020",
    "analysisId": "507f1f77bcf86cd799439011",
    "status": "queued",
    "createdAt": "2025-01-20T15:40:00",
    "completedAt": null,
    "durationWeeks": 4,
    "priorityPlatforms": ["Instagram", "LinkedIn", "Telegram"]
  }
}
```

---

### 7. Получение результата стратегии

**GET** `/api/marketing/analysis/strategy/{strategyId}`

Возвращает статус и результаты стратегии. Пользователь может получить только свои стратегии.

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

```
Authorization: Bearer <your_jwt_token>
```

#### Параметры пути

| Параметр     | Тип    | Описание                |
| ------------ | ------ | ----------------------- |
| `strategyId` | string | Идентификатор стратегии |

#### Пример ответа (когда стратегия завершена - 200 OK)

```json
{
  "success": true,
  "message": "Операция выполнена успешно",
  "data": {
    "strategyId": "507f1f77bcf86cd799439020",
    "analysisId": "507f1f77bcf86cd799439011",
    "status": "completed",
    "createdAt": "2025-01-20T15:40:00",
    "completedAt": "2025-01-20T15:43:00",
    "durationWeeks": 4,
    "priorityPlatforms": ["Instagram", "LinkedIn", "Telegram"],
    "strategy": {
      "weeklyPlans": [
        {
          "weekNumber": 1,
          "mainThemes": ["Презентация продукта", "Преимущества"],
          "contentRecommendations": "Создавайте контент, который демонстрирует ценность продукта",
          "priorityPlatforms": ["Instagram", "LinkedIn"]
        }
      ],
      "postCalendar": [
        {
          "publishDate": "2025-01-21T10:00:00",
          "platform": "Instagram",
          "contentType": "пост",
          "theme": "Презентация продукта",
          "postText": "Полный текст поста для публикации...",
          "hashtags": ["#маркетинг", "#бизнес"],
          "publishTime": "10:00"
        }
      ]
    }
  }
}
```

---

### 8. Получение стратегии по ID анализа

**GET** `/api/marketing/analysis/{analysisId}/strategy`

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

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

```
Authorization: Bearer <your_jwt_token>
```

#### Параметры пути

| Параметр     | Тип    | Описание              |
| ------------ | ------ | --------------------- |
| `analysisId` | string | Идентификатор анализа |

---

### 9. Получение списка всех стратегий пользователя

**GET** `/api/marketing/analysis/strategy/my`

Возвращает список всех стратегий текущего пользователя, отсортированных по дате создания (новые первыми).

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

```
Authorization: Bearer <your_jwt_token>
```

#### Пример успешного ответа (200 OK)

```json
{
  "success": true,
  "message": "Операция выполнена успешно",
  "data": [
    {
      "strategyId": "507f1f77bcf86cd799439020",
      "analysisId": "507f1f77bcf86cd799439011",
      "status": "completed",
      "userId": "12345",
      "durationWeeks": 4,
      "priorityPlatforms": ["Instagram", "LinkedIn", "Telegram"],
      "createdAt": "2025-01-20T15:40:00",
      "completedAt": "2025-01-20T15:43:00",
      "statusHistory": [
        {
          "status": "queued",
          "timestamp": "2025-01-20T15:40:00",
          "message": "Стратегия создана и добавлена в очередь"
        },
        {
          "status": "processing",
          "timestamp": "2025-01-20T15:40:05",
          "message": "Начата генерация стратегии"
        },
        {
          "status": "completed",
          "timestamp": "2025-01-20T15:43:00",
          "message": "Стратегия успешно сгенерирована"
        }
      ]
    }
  ]
}
```

---

### 10. Получение детальной истории стратегии

**GET** `/api/marketing/analysis/strategy/{strategyId}/history`

Возвращает детальную информацию о стратегии, включая полную историю изменений статуса.

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

```
Authorization: Bearer <your_jwt_token>
```

#### Параметры пути

| Параметр     | Тип    | Описание                |
| ------------ | ------ | ----------------------- |
| `strategyId` | string | Идентификатор стратегии |

#### Пример успешного ответа (200 OK)

```json
{
  "success": true,
  "message": "Операция выполнена успешно",
  "data": {
    "strategyId": "507f1f77bcf86cd799439020",
    "analysisId": "507f1f77bcf86cd799439011",
    "status": "completed",
    "userId": "12345",
    "durationWeeks": 4,
    "priorityPlatforms": ["Instagram", "LinkedIn", "Telegram"],
    "createdAt": "2025-01-20T15:40:00",
    "completedAt": "2025-01-20T15:43:00",
    "statusHistory": [
      {
        "status": "queued",
        "timestamp": "2025-01-20T15:40:00",
        "message": "Стратегия создана и добавлена в очередь"
      },
      {
        "status": "processing",
        "timestamp": "2025-01-20T15:40:05",
        "message": "Начата генерация стратегии"
      },
      {
        "status": "completed",
        "timestamp": "2025-01-20T15:43:00",
        "message": "Стратегия успешно сгенерирована"
      }
    ]
  }
}
```

---

## Обработка ошибок

### Коды ошибок

| Код                      | HTTP статус | Описание                        |
| ------------------------ | ----------- | ------------------------------- |
| `UNAUTHORIZED`           | 401         | Требуется аутентификация        |
| `FORBIDDEN`              | 403         | Нет доступа к ресурсу           |
| `VALIDATION_ERROR`       | 400         | Ошибка валидации входных данных |
| `NOT_FOUND`              | 404         | Ресурс не найден                |
| `INVALID_ANALYSIS`       | 404         | Анализ не найден                |
| `ANALYSIS_NOT_COMPLETED` | 400         | Анализ еще не завершен          |
| `INTERNAL_SERVER_ERROR`  | 500         | Внутренняя ошибка сервера       |

### Формат ошибки

```json
{
  "success": false,
  "message": "Описание ошибки",
  "error": {
    "code": "ERROR_CODE",
    "message": "Детальное сообщение об ошибке",
    "details": {
      "field1": "Сообщение об ошибке для поля 1"
    }
  }
}
```

---

## Примеры использования

### JavaScript/TypeScript (Fetch API)

#### Получение JWT токена

```javascript
// Предполагается, что токен получен при логине
const jwtToken = localStorage.getItem('jwtToken');
```

#### Запуск анализа с JWT

```javascript
async function startMarketingAnalysis(data, jwtToken) {
  const response = await fetch(
    'https://api.konturai.kz/api/marketing/analysis/start',
    {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        Authorization: `Bearer ${jwtToken}`,
      },
      body: JSON.stringify(data),
    }
  );

  if (!response.ok) {
    if (response.status === 401) {
      throw new Error('Требуется аутентификация');
    }
    const error = await response.json();
    throw new Error(error.error?.message || 'Ошибка при запуске анализа');
  }

  const result = await response.json();
  return result.data.analysisId;
}
```

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

```javascript
async function getMyAnalyses(jwtToken) {
  const response = await fetch(
    'https://api.konturai.kz/api/marketing/analysis/my',
    {
      headers: {
        Authorization: `Bearer ${jwtToken}`,
      },
    }
  );

  if (!response.ok) {
    throw new Error('Ошибка при получении списка анализов');
  }

  const result = await response.json();
  return result.data; // Массив анализов
}
```

#### Получение детальной истории анализа

```javascript
async function getAnalysisHistory(analysisId, jwtToken) {
  const response = await fetch(
    `https://api.konturai.kz/api/marketing/analysis/${analysisId}/history`,
    {
      headers: {
        Authorization: `Bearer ${jwtToken}`,
      },
    }
  );

  if (!response.ok) {
    if (response.status === 403) {
      throw new Error('Нет доступа к этому анализу');
    }
    throw new Error('Ошибка при получении истории');
  }

  const result = await response.json();
  return result.data;
}
```

#### Полный пример: создание анализа и отслеживание статуса

```javascript
async function createAndTrackAnalysis(
  product,
  location,
  client,
  differentiator,
  jwtToken
) {
  try {
    // 1. Запускаем анализ
    const analysisId = await startMarketingAnalysis(
      {
        product,
        location,
        client,
        differentiator,
      },
      jwtToken
    );

    console.log(`Анализ запущен: ${analysisId}`);

    // 2. Получаем историю для отслеживания статуса
    const checkStatus = async () => {
      const history = await getAnalysisHistory(analysisId, jwtToken);

      // Показываем последний статус
      const lastStatus =
        history.statusHistory[history.statusHistory.length - 1];
      console.log(`Статус: ${lastStatus.status} - ${lastStatus.message}`);

      return history.status;
    };

    // 3. Polling: проверяем статус каждые 10 секунд
    const pollInterval = setInterval(async () => {
      const status = await checkStatus();

      if (status === 'completed') {
        clearInterval(pollInterval);
        console.log('Анализ завершен!');
        // Получаем полный результат
        const fullResult = await getAnalysisResult(analysisId, jwtToken);
        return fullResult;
      } else if (status === 'failed') {
        clearInterval(pollInterval);
        throw new Error('Анализ завершился с ошибкой');
      }
    }, 10000);

    // Останавливаем polling через 15 минут
    setTimeout(() => {
      clearInterval(pollInterval);
      console.log('Превышено время ожидания');
    }, 15 * 60 * 1000);
  } catch (error) {
    console.error('Ошибка:', error);
    throw error;
  }
}
```

#### Получение списка стратегий пользователя

```javascript
async function getMyStrategies(jwtToken) {
  const response = await fetch(
    'https://api.konturai.kz/api/marketing/analysis/strategy/my',
    {
      headers: {
        Authorization: `Bearer ${jwtToken}`,
      },
    }
  );

  if (!response.ok) {
    throw new Error('Ошибка при получении списка стратегий');
  }

  const result = await response.json();
  return result.data; // Массив стратегий
}
```

---

## Рекомендации по интеграции

### 1. Обработка JWT токена

- Сохраняйте токен в безопасном месте (например, `localStorage` или `sessionStorage`)
- Проверяйте срок действия токена перед запросами
- Реализуйте механизм обновления токена при истечении

### 2. Обработка ошибок аутентификации

При получении `401 Unauthorized`:

- Перенаправляйте пользователя на страницу входа
- Очищайте сохраненный токен
- Показывайте понятное сообщение пользователю

### 3. Обработка ошибок доступа

При получении `403 Forbidden`:

- Показывайте сообщение о том, что ресурс недоступен
- Не пытайтесь повторять запрос с теми же параметрами

### 4. Polling стратегия

Для отслеживания статуса анализа/стратегии:

- Используйте интервал 10-15 секунд
- Максимальное время ожидания: 15 минут
- Показывайте прогресс пользователю на основе `statusHistory`

### 5. Отображение истории статусов

Используйте `statusHistory` для:

- Показывать временную шкалу изменений статуса
- Отображать детальную информацию о каждом этапе
- Информировать пользователя о прогрессе

### 6. Кэширование

- Кэшируйте список анализов/стратегий пользователя
- Обновляйте кэш при создании новых записей
- Используйте `analysisId`/`strategyId` как ключи кэша

---

## Примечания

1. **Формат даты**: Все даты возвращаются в формате ISO 8601 без timezone (LocalDateTime)
2. **Идентификаторы**: Используются MongoDB ObjectId (24 символа hex)
3. **Асинхронность**: Анализ и стратегия выполняются асинхронно
4. **Безопасность**: Все эндпоинты требуют валидный JWT токен
5. **Изоляция данных**: Пользователи видят только свои данные
6. **История статусов**: Детальная история доступна для всех анализов и стратегий

---

## Изменения: Поддержка типов анализов

### Обзор изменений

В API добавлена поддержка различных типов маркетинговых анализов. Теперь при создании анализа можно указать тип анализа, который определяет фокус и содержание генерируемого отчета.

### Новое поле в запросе

**Поле**: `analysisType` (обязательное)

**Тип**: `string`

**Допустимые значения**:

- `"РЫНОК"` - Анализ рынка
- `"КОНКУРЕНТЫ"` - Анализ конкурентов
- `"ЦА"` - Анализ целевой аудитории
- `"КАНАЛЫ"` - Анализ маркетинговых каналов
- `"SWOT"` - SWOT-анализ

### Описание типов анализов

#### 1. РЫНОК

Генерирует анализ рынка, включающий:

- Размер рынка
- Динамику роста
- Основные сегменты
- Тренды и перспективы развития

#### 2. КОНКУРЕНТЫ

Генерирует анализ конкурентов, включающий:

- Основных конкурентов
- Их сильные и слабые стороны
- Позиционирование
- Ценовую политику
- Маркетинговые стратегии

#### 3. ЦА (Целевая аудитория)

Генерирует анализ целевой аудитории, включающий:

- Демографические характеристики
- Психографический профиль
- Потребности и боли
- Поведенческие паттерны
- Предпочтения

#### 4. КАНАЛЫ

Генерирует анализ маркетинговых каналов, включающий:

- Оценку эффективности различных каналов коммуникации
- Рекомендации по выбору каналов
- Особенности использования каждого канала
- Бюджетные рекомендации

#### 5. SWOT

Генерирует SWOT-анализ, включающий:

- Сильные стороны (Strengths)
- Слабые стороны (Weaknesses)
- Возможности (Opportunities)
- Угрозы (Threats)

### Изменения в ответе

В ответе анализа теперь присутствует поле `analysisType` в объекте `reportData`, которое содержит название типа анализа.

### Пример использования

```javascript
// Запрос на создание SWOT-анализа
const response = await fetch(
  'https://api.konturai.kz/api/marketing/analysis/start',
  {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      Authorization: `Bearer ${jwtToken}`,
    },
    body: JSON.stringify({
      product: 'Разработка мобильных приложений',
      location: 'Нур-Султан, Казахстан',
      client: 'B2B клиенты',
      differentiator: 'Специализируемся на быстрой разработке MVP за 4 недели',
      analysisType: 'SWOT', // Указываем тип анализа
    }),
  }
);
```

### Рекомендации для фронтенда

1. **UI для выбора типа анализа**: Добавьте выпадающий список или радиокнопки для выбора типа анализа перед отправкой запроса.

2. **Валидация на фронтенде**: Убедитесь, что отправляется только один из допустимых значений.

3. **Отображение типа анализа**: При показе результатов анализа отображайте тип анализа для контекста.

4. **Обратная совместимость**: Если поле `analysisType` не указано, API вернет ошибку валидации. Это обязательное поле.

### Миграция существующих интеграций

Если у вас есть существующие интеграции, которые не используют поле `analysisType`, необходимо:

1. Добавить поле `analysisType` в запрос
2. Выбрать подходящий тип анализа по умолчанию или позволить пользователю выбрать
3. Обновить UI для отображения выбора типа анализа

---

## Поддержка

При возникновении проблем с API обращайтесь в техническую поддержку с указанием:

- `analysisId` или `strategyId` (если есть)
- Время запроса
- Описание проблемы
- Код ошибки (если есть)
- JWT токен (только для отладки, не в продакшене!)
