# REST API (основные эндпоинты)

## Аутентификация
- `POST /v1/auth/login` -> access_token (JWT, 15 мин) + refresh_token (opaque, 30 дней)
- `POST /v1/auth/refresh` -> новый access_token
- API-ключи: заголовок `X-API-Key`, scopes: `clients:read`, `clients:write`, `trainings:read`, `trainings:write`, `sales:read`, `sales:write`, `funnel:read`, `funnel:write`, `stats:read`, `webhooks:manage`, `email:read`, `email:write`

## Основные сущности
- `/v1/clients` — CRUD, `/v1/clients/:id/services`, `/v1/clients/sleeping`
- `/v1/trainings` — CRUD, `/:id/cancel`, `/:id/reschedule`, `/:id/repeat`
- `/v1/funnel` — по этапам, `/:id/action`, `/:id/assign`, `/:id/transfer`, `/:id/move`
- `/v1/sales` — CRUD, `/v1/sales/debts`
- `/v1/stats/summary`, `/v1/stats/funnel`, `/v1/stats/rating`
- `/v1/reports/generate` — PDF
- `/v1/users/trainers`, `/v1/schedule/work`
- `/v1/sip/calls` — журнал звонков, настройки SIP
- `/v1/webhooks` — CRUD webhook-подписок
- `/v1/theme/current` — текущая тема платформы (публичный, кэш Redis)
- `/v1/admin/theme` — PUT смена темы (@Roles('super_admin'))
- `/v1/admin/themes` — каталог всех 10 тем (@Roles('super_admin'))
- `/v1/email/templates` — CRUD шаблонов, предпросмотр, клонирование
- `/v1/email/campaigns` — создание, отправка, расписание, статистика рассылок
- `/v1/email/campaigns/:id/send` — запуск отправки кампании
- `/v1/email/campaigns/:id/stats` — статистика: доставлено, открытия, клики, отписки
- `/v1/email/settings` — SMTP/API провайдер, sender name/email, настройки отписки

## Webhooks (15 типов исходящих событий)

| Событие | Триггер |
|---------|---------|
| `client.created` | Создание клиента |
| `client.updated` | Обновление карточки |
| `training.created` | Создание тренировки |
| `training.cancelled` | Отмена |
| `training.rescheduled` | Перенос |
| `training.completed` | Списание |
| `sale.created` | Выставлена продажа |
| `sale.paid` | Оплачена |
| `funnel.stage_changed` | Смена этапа воронки |
| `funnel.assigned` | Назначен тренер |
| `schedule.updated` | Изменён график работы |
| `membership.expiring` | Членство истекает (за 7 дней) |
| `email.sent` | Email-кампания отправлена |
| `email.bounced` | Email отклонён (bounce) |
| `theme.changed` | Смена темы оформления платформы |

Формат: JSON POST с `event`, `timestamp`, `club_id`, `data`, `signature` (HMAC-SHA256). Retry: 3 попытки (5 сек, 30 сек, 5 мин).
