Admin API
Общая информация
Базовый URL
/api/v1/adminЗаголовок аутентификации
Authorization: Bearer <access_token>Требуемые роли
Все эндпоинты в этом API требуют одну из следующих ролей:
ADMIN- Стандартный доступ администратораSUPER_ADMIN- Полный административный доступ
Некоторые эндпоинты могут требовать именно SUPER_ADMIN. Это указано в документации эндпоинта.
Формат ответа
Все ответы следуют стандартному формату:
// Success response
interface SuccessResponse<T> {
success: true;
data: T;
meta?: {
pagination?: PaginationMeta;
[key: string]: unknown;
};
}
// Error response
interface ErrorResponse {
success: false;
error: {
code: string;
message: string;
details?: Record<string, string[]>;
};
}Формат пагинации
interface PaginationMeta {
total: number;
page: number;
pageSize: number;
totalPages: number;
hasNext: boolean;
hasPrevious: boolean;
}Лимиты запросов
| Эндпоинт | Лимит |
|---|---|
| Общие админ эндпоинты | 200/мин |
| POST /commissions/:id/adjust | 10/мин |
| POST /payouts/:id/process | 5/мин |
| Массовые операции | 30/мин |
Аудит-логирование
Все административные операции логируются с указанием:
- ID администратора
- Временная метка
- Выполненное действие
- ID затронутой сущности
- Предыдущие и новые значения (для обновлений)
- IP-адрес
Эндпоинты управления пользователями
GET /api/v1/admin/users
Получение списка всех пользователей с фильтрами.
Аутентификация: Требуется (ADMIN)
Лимит запросов: 200 запросов в минуту
Заголовки запроса
Authorization: Bearer <access_token>Тело запроса
Отсутствует
Query параметры
| Параметр | Тип | Описание |
|---|---|---|
| page | number | Номер страницы (опционально) |
| pageSize | number | Элементов на странице, макс 100 (опционально) |
| status | string | Фильтр: 'PENDING_VERIFICATION', 'ACTIVE', 'SUSPENDED', 'BANNED', 'ALL' (опционально) |
| role | string | Фильтр по роли: 'USER', 'ADMIN', 'SUPER_ADMIN' (опционально) |
| kycStatus | string | Фильтр по статусу KYC (опционально) |
| search | string | Поиск по email, имени или телефону (опционально) |
| dateFrom | string | Дата регистрации от (ISO 8601) (опционально) |
| dateTo | string | Дата регистрации до (ISO 8601) (опционально) |
| sortBy | string | Поле сортировки: 'createdAt', 'email', 'status', 'lastLoginAt' (опционально) |
| sortOrder | string | Направление сортировки: 'asc', 'desc' (опционально) |
Ответ (200 OK)
interface AdminUsersResponse {
users: AdminUser[];
}
interface AdminUser {
id: string;
email: string;
phone: string | null;
status: string;
profile: {
firstName: string;
lastName: string;
avatarUrl: string | null;
};
kyc: {
status: string;
level: string;
};
roles: string[];
isPartner: boolean;
stats: {
ordersCount: number;
totalSpent: number;
investmentsCount: number;
totalInvested: number;
};
lastLoginAt: string | null;
createdAt: string;
}Ответы с ошибками
| Статус | Код | Описание |
|---|---|---|
| 400 | VALIDATION_ERROR | Некорректные query параметры |
| 401 | UNAUTHORIZED | Недействительный или истёкший токен доступа |
| 403 | FORBIDDEN | Недостаточно прав |
Пример
Запрос:
curl -X GET "https://api.iwm-platform.com/api/v1/admin/users?status=ACTIVE&page=1&pageSize=20" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..."Ответ:
{
"success": true,
"data": {
"users": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"email": "user@example.com",
"phone": "+79991234567",
"status": "ACTIVE",
"profile": {
"firstName": "John",
"lastName": "Doe",
"avatarUrl": "https://cdn.iwm-platform.com/avatars/550e8400.jpg"
},
"kyc": {
"status": "APPROVED",
"level": "STANDARD"
},
"roles": ["USER"],
"isPartner": true,
"stats": {
"ordersCount": 15,
"totalSpent": 125000,
"investmentsCount": 3,
"totalInvested": 150000
},
"lastLoginAt": "2024-01-15T14:00:00Z",
"createdAt": "2024-01-01T10:00:00Z"
}
]
},
"meta": {
"pagination": {
"total": 1250,
"page": 1,
"pageSize": 20,
"totalPages": 63,
"hasNext": true,
"hasPrevious": false
}
}
}GET /api/v1/admin/users/:id
Получение детальной информации о пользователе.
Аутентификация: Требуется (ADMIN)
Лимит запросов: 200 запросов в минуту
Заголовки запроса
Authorization: Bearer <access_token>Path параметры
| Параметр | Тип | Описание |
|---|---|---|
| id | string (UUID) | ID пользователя |
Тело запроса
Отсутствует
Query параметры
Отсутствуют
Ответ (200 OK)
interface AdminUserDetailResponse {
id: string;
email: string;
phone: string | null;
status: string;
profile: {
firstName: string;
lastName: string;
middleName: string | null;
dateOfBirth: string | null;
avatarUrl: string | null;
language: string;
timezone: string;
};
kyc: {
id: string;
status: string;
level: string;
submittedAt: string | null;
reviewedAt: string | null;
reviewedBy: string | null;
expiresAt: string | null;
documents: {
id: string;
type: string;
status: string;
uploadedAt: string;
}[];
} | null;
roles: string[];
partner: {
id: string;
referralCode: string;
status: string;
rank: string | null;
sponsorId: string | null;
sponsorName: string | null;
balance: {
available: number;
pending: number;
};
} | null;
security: {
twoFactorEnabled: boolean;
twoFactorMethod: string | null;
emailVerifiedAt: string | null;
phoneVerifiedAt: string | null;
passwordChangedAt: string | null;
activeSessions: number;
};
stats: {
ordersCount: number;
totalSpent: number;
investmentsCount: number;
totalInvested: number;
commissionsEarned: number;
referralsCount: number;
};
addresses: {
id: string;
label: string;
isDefault: boolean;
city: string;
country: string;
}[];
recentActivity: {
type: string;
description: string;
timestamp: string;
}[];
notes: {
id: string;
content: string;
createdBy: string;
createdAt: string;
}[];
lastLoginAt: string | null;
createdAt: string;
updatedAt: string;
}Ответы с ошибками
| Статус | Код | Описание |
|---|---|---|
| 401 | UNAUTHORIZED | Недействительный или истёкший токен доступа |
| 403 | FORBIDDEN | Недостаточно прав |
| 404 | USER_NOT_FOUND | Пользователь не найден |
Пример
Запрос:
curl -X GET https://api.iwm-platform.com/api/v1/admin/users/550e8400-e29b-41d4-a716-446655440000 \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..."Ответ:
{
"success": true,
"data": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"email": "user@example.com",
"phone": "+79991234567",
"status": "ACTIVE",
"profile": {
"firstName": "John",
"lastName": "Doe",
"middleName": null,
"dateOfBirth": "1990-05-15",
"avatarUrl": "https://cdn.iwm-platform.com/avatars/550e8400.jpg",
"language": "ru",
"timezone": "Europe/Moscow"
},
"kyc": {
"id": "kyc-001",
"status": "APPROVED",
"level": "STANDARD",
"submittedAt": "2024-01-10T14:00:00Z",
"reviewedAt": "2024-01-12T09:30:00Z",
"reviewedBy": "Admin User",
"expiresAt": "2025-01-12T09:30:00Z",
"documents": [
{ "id": "doc-001", "type": "PASSPORT", "status": "VERIFIED", "uploadedAt": "2024-01-10T14:00:00Z" },
{ "id": "doc-002", "type": "SELFIE", "status": "VERIFIED", "uploadedAt": "2024-01-10T14:05:00Z" }
]
},
"roles": ["USER"],
"partner": {
"id": "cc0e8400-e29b-41d4-a716-446655440000",
"referralCode": "DEF456ZW",
"status": "ACTIVE",
"rank": "Silver Partner",
"sponsorId": "dd0e8400-e29b-41d4-a716-446655440000",
"sponsorName": "Jane Smith",
"balance": {
"available": 45000,
"pending": 15000
}
},
"security": {
"twoFactorEnabled": true,
"twoFactorMethod": "TOTP",
"emailVerifiedAt": "2024-01-01T10:30:00Z",
"phoneVerifiedAt": null,
"passwordChangedAt": "2024-01-01T10:00:00Z",
"activeSessions": 2
},
"stats": {
"ordersCount": 15,
"totalSpent": 125000,
"investmentsCount": 3,
"totalInvested": 150000,
"commissionsEarned": 75000,
"referralsCount": 25
},
"addresses": [
{ "id": "addr-001", "label": "Home", "isDefault": true, "city": "Moscow", "country": "RU" }
],
"recentActivity": [
{ "type": "LOGIN", "description": "Logged in from Moscow, RU", "timestamp": "2024-01-15T14:00:00Z" },
{ "type": "ORDER", "description": "Placed order #ORD-2024-00001234", "timestamp": "2024-01-14T18:00:00Z" }
],
"notes": [],
"lastLoginAt": "2024-01-15T14:00:00Z",
"createdAt": "2024-01-01T10:00:00Z",
"updatedAt": "2024-01-15T12:00:00Z"
}
}PATCH /api/v1/admin/users/:id
Обновление информации о пользователе.
Аутентификация: Требуется (ADMIN)
Лимит запросов: 200 запросов в минуту
Заголовки запроса
Authorization: Bearer <access_token>Path параметры
| Параметр | Тип | Описание |
|---|---|---|
| id | string (UUID) | ID пользователя |
Тело запроса
interface AdminUpdateUserRequest {
email?: string;
phone?: string | null;
profile?: {
firstName?: string;
lastName?: string;
middleName?: string | null;
dateOfBirth?: string;
language?: string;
timezone?: string;
};
roles?: string[]; // Требуется SUPER_ADMIN
note?: string; // Добавить заметку администратора
}Query параметры
Отсутствуют
Ответ (200 OK)
interface AdminUpdateUserResponse {
id: string;
email: string;
phone: string | null;
status: string;
profile: {
firstName: string;
lastName: string;
middleName: string | null;
dateOfBirth: string | null;
language: string;
timezone: string;
};
roles: string[];
updatedAt: string;
updatedBy: string;
}Ответы с ошибками
| Статус | Код | Описание |
|---|---|---|
| 400 | VALIDATION_ERROR | Некорректные входные данные |
| 401 | UNAUTHORIZED | Недействительный или истёкший токен доступа |
| 403 | FORBIDDEN | Недостаточно прав |
| 403 | CANNOT_MODIFY_SUPER_ADMIN | Нельзя изменять SUPER_ADMIN пользователя |
| 404 | USER_NOT_FOUND | Пользователь не найден |
| 409 | EMAIL_ALREADY_EXISTS | Email уже используется |
Пример
Запрос:
curl -X PATCH https://api.iwm-platform.com/api/v1/admin/users/550e8400-e29b-41d4-a716-446655440000 \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..." \
-H "Content-Type: application/json" \
-d '{
"profile": {
"firstName": "Jonathan"
},
"note": "Updated name at user request"
}'Ответ:
{
"success": true,
"data": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"email": "user@example.com",
"phone": "+79991234567",
"status": "ACTIVE",
"profile": {
"firstName": "Jonathan",
"lastName": "Doe",
"middleName": null,
"dateOfBirth": "1990-05-15",
"language": "ru",
"timezone": "Europe/Moscow"
},
"roles": ["USER"],
"updatedAt": "2024-01-15T21:00:00Z",
"updatedBy": "Admin User"
}
}POST /api/v1/admin/users/:id/suspend
Приостановка учётной записи пользователя.
Аутентификация: Требуется (ADMIN)
Лимит запросов: 200 запросов в минуту
Заголовки запроса
Authorization: Bearer <access_token>Path параметры
| Параметр | Тип | Описание |
|---|---|---|
| id | string (UUID) | ID пользователя |
Тело запроса
interface SuspendUserRequest {
reason: string; // Причина приостановки
duration?: number; // Длительность в днях (null = бессрочно)
notifyUser?: boolean; // Отправить уведомление на email
}Query параметры
Отсутствуют
Ответ (200 OK)
interface SuspendUserResponse {
userId: string;
status: 'SUSPENDED';
reason: string;
suspendedAt: string;
suspendedBy: string;
suspendedUntil: string | null;
sessionsRevoked: number;
}Ответы с ошибками
| Статус | Код | Описание |
|---|---|---|
| 400 | VALIDATION_ERROR | Причина не указана |
| 401 | UNAUTHORIZED | Недействительный или истёкший токен доступа |
| 403 | FORBIDDEN | Недостаточно прав |
| 403 | CANNOT_SUSPEND_ADMIN | Нельзя приостановить администратора |
| 404 | USER_NOT_FOUND | Пользователь не найден |
| 400 | ALREADY_SUSPENDED | Пользователь уже приостановлен |
Пример
Запрос:
curl -X POST https://api.iwm-platform.com/api/v1/admin/users/550e8400-e29b-41d4-a716-446655440000/suspend \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..." \
-H "Content-Type: application/json" \
-d '{
"reason": "Suspicious activity detected",
"duration": 7,
"notifyUser": true
}'Ответ:
{
"success": true,
"data": {
"userId": "550e8400-e29b-41d4-a716-446655440000",
"status": "SUSPENDED",
"reason": "Suspicious activity detected",
"suspendedAt": "2024-01-15T21:00:00Z",
"suspendedBy": "Admin User",
"suspendedUntil": "2024-01-22T21:00:00Z",
"sessionsRevoked": 2
}
}POST /api/v1/admin/users/:id/activate
Активация приостановленной учётной записи.
Аутентификация: Требуется (ADMIN)
Лимит запросов: 200 запросов в минуту
Заголовки запроса
Authorization: Bearer <access_token>Path параметры
| Параметр | Тип | Описание |
|---|---|---|
| id | string (UUID) | ID пользователя |
Тело запроса
interface ActivateUserRequest {
note?: string; // Опциональная заметка
notifyUser?: boolean; // Отправить уведомление на email
}Query параметры
Отсутствуют
Ответ (200 OK)
interface ActivateUserResponse {
userId: string;
status: 'ACTIVE';
activatedAt: string;
activatedBy: string;
}Ответы с ошибками
| Статус | Код | Описание |
|---|---|---|
| 401 | UNAUTHORIZED | Недействительный или истёкший токен доступа |
| 403 | FORBIDDEN | Недостаточно прав |
| 404 | USER_NOT_FOUND | Пользователь не найден |
| 400 | NOT_SUSPENDED | Пользователь не приостановлен |
Пример
Запрос:
curl -X POST https://api.iwm-platform.com/api/v1/admin/users/550e8400-e29b-41d4-a716-446655440000/activate \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..." \
-H "Content-Type: application/json" \
-d '{
"note": "Investigation completed, no violation found",
"notifyUser": true
}'Ответ:
{
"success": true,
"data": {
"userId": "550e8400-e29b-41d4-a716-446655440000",
"status": "ACTIVE",
"activatedAt": "2024-01-16T10:00:00Z",
"activatedBy": "Admin User"
}
}Эндпоинты управления KYC
GET /api/v1/admin/kyc/queue
Получение заявок KYC, ожидающих проверки.
Аутентификация: Требуется (ADMIN)
Лимит запросов: 200 запросов в минуту
Заголовки запроса
Authorization: Bearer <access_token>Тело запроса
Отсутствует
Query параметры
| Параметр | Тип | Описание |
|---|---|---|
| page | number | Номер страницы (опционально) |
| pageSize | number | Элементов на странице, макс 50 (опционально) |
| status | string | Фильтр: 'SUBMITTED', 'UNDER_REVIEW', 'NEEDS_INFO' (опционально) |
| priority | string | Фильтр: 'HIGH', 'NORMAL', 'LOW' (опционально) |
| sortBy | string | Поле сортировки: 'submittedAt', 'priority' (опционально) |
| sortOrder | string | Направление сортировки: 'asc', 'desc' (опционально) |
Ответ (200 OK)
interface KycQueueResponse {
submissions: KycQueueItem[];
stats: {
pending: number;
underReview: number;
needsInfo: number;
averageProcessingTime: number; // Часы
};
}
interface KycQueueItem {
id: string;
user: {
id: string;
email: string;
name: string;
};
status: string;
level: string;
priority: 'HIGH' | 'NORMAL' | 'LOW';
submittedAt: string;
assignedTo: string | null;
documentsCount: number;
waitingTime: number; // Часы
}Ответы с ошибками
| Статус | Код | Описание |
|---|---|---|
| 401 | UNAUTHORIZED | Недействительный или истёкший токен доступа |
| 403 | FORBIDDEN | Недостаточно прав |
Пример
Запрос:
curl -X GET "https://api.iwm-platform.com/api/v1/admin/kyc/queue?status=SUBMITTED&sortBy=submittedAt&sortOrder=asc" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..."Ответ:
{
"success": true,
"data": {
"submissions": [
{
"id": "kyc-002",
"user": {
"id": "660e8400-e29b-41d4-a716-446655440000",
"email": "newuser@example.com",
"name": "Alice Smith"
},
"status": "SUBMITTED",
"level": "STANDARD",
"priority": "NORMAL",
"submittedAt": "2024-01-15T10:00:00Z",
"assignedTo": null,
"documentsCount": 2,
"waitingTime": 11
}
],
"stats": {
"pending": 12,
"underReview": 5,
"needsInfo": 3,
"averageProcessingTime": 24
}
},
"meta": {
"pagination": {
"total": 12,
"page": 1,
"pageSize": 20,
"totalPages": 1,
"hasNext": false,
"hasPrevious": false
}
}
}GET /api/v1/admin/kyc/:id
Получение деталей KYC-заявки.
Аутентификация: Требуется (ADMIN)
Лимит запросов: 200 запросов в минуту
Заголовки запроса
Authorization: Bearer <access_token>Path параметры
| Параметр | Тип | Описание |
|---|---|---|
| id | string (UUID) | ID KYC-верификации |
Тело запроса
Отсутствует
Query параметры
Отсутствуют
Ответ (200 OK)
interface KycDetailResponse {
id: string;
user: {
id: string;
email: string;
name: string;
phone: string | null;
createdAt: string;
};
status: string;
level: string;
personalInfo: {
firstName: string;
lastName: string;
middleName: string | null;
dateOfBirth: string;
nationality: string;
documentNumber: string;
documentType: string;
documentIssueDate: string;
documentExpiryDate: string;
address: {
country: string;
region: string;
city: string;
street: string;
building: string;
apartment: string | null;
postalCode: string;
};
};
documents: {
id: string;
type: string;
fileName: string;
fileUrl: string;
thumbnailUrl: string;
status: string;
ocrData: Record<string, string> | null;
uploadedAt: string;
}[];
history: {
action: string;
performedBy: string | null;
note: string | null;
timestamp: string;
}[];
submittedAt: string;
reviewedAt: string | null;
reviewedBy: string | null;
rejectionReason: string | null;
}Ответы с ошибками
| Статус | Код | Описание |
|---|---|---|
| 401 | UNAUTHORIZED | Недействительный или истёкший токен доступа |
| 403 | FORBIDDEN | Недостаточно прав |
| 404 | KYC_NOT_FOUND | KYC-верификация не найдена |
POST /api/v1/admin/kyc/:id/approve
Одобрение KYC-заявки.
Аутентификация: Требуется (ADMIN)
Лимит запросов: 200 запросов в минуту
Заголовки запроса
Authorization: Bearer <access_token>Path параметры
| Параметр | Тип | Описание |
|---|---|---|
| id | string (UUID) | ID KYC-верификации |
Тело запроса
interface ApproveKycRequest {
level: 'BASIC' | 'STANDARD' | 'ENHANCED';
note?: string;
expiresAt?: string; // Переопределить срок истечения (ISO 8601)
}Query параметры
Отсутствуют
Ответ (200 OK)
interface ApproveKycResponse {
id: string;
userId: string;
status: 'APPROVED';
level: string;
approvedAt: string;
approvedBy: string;
expiresAt: string;
}Ответы с ошибками
| Статус | Код | Описание |
|---|---|---|
| 400 | VALIDATION_ERROR | Некорректный уровень |
| 401 | UNAUTHORIZED | Недействительный или истёкший токен доступа |
| 403 | FORBIDDEN | Недостаточно прав |
| 404 | KYC_NOT_FOUND | KYC-верификация не найдена |
| 400 | NOT_REVIEWABLE | KYC не находится в статусе для проверки |
Пример
Запрос:
curl -X POST https://api.iwm-platform.com/api/v1/admin/kyc/kyc-002/approve \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..." \
-H "Content-Type: application/json" \
-d '{
"level": "STANDARD",
"note": "All documents verified successfully"
}'Ответ:
{
"success": true,
"data": {
"id": "kyc-002",
"userId": "660e8400-e29b-41d4-a716-446655440000",
"status": "APPROVED",
"level": "STANDARD",
"approvedAt": "2024-01-15T21:30:00Z",
"approvedBy": "Admin User",
"expiresAt": "2025-01-15T21:30:00Z"
}
}POST /api/v1/admin/kyc/:id/reject
Отклонение KYC-заявки.
Аутентификация: Требуется (ADMIN)
Лимит запросов: 200 запросов в минуту
Заголовки запроса
Authorization: Bearer <access_token>Path параметры
| Параметр | Тип | Описание |
|---|---|---|
| id | string (UUID) | ID KYC-верификации |
Тело запроса
interface RejectKycRequest {
reason: string; // Причина отклонения
rejectedDocuments?: {
documentId: string;
reason: string;
}[];
allowResubmission?: boolean; // Разрешить повторную подачу
}Query параметры
Отсутствуют
Ответ (200 OK)
interface RejectKycResponse {
id: string;
userId: string;
status: 'REJECTED';
reason: string;
rejectedAt: string;
rejectedBy: string;
canResubmit: boolean;
}Ответы с ошибками
| Статус | Код | Описание |
|---|---|---|
| 400 | VALIDATION_ERROR | Причина не указана |
| 401 | UNAUTHORIZED | Недействительный или истёкший токен доступа |
| 403 | FORBIDDEN | Недостаточно прав |
| 404 | KYC_NOT_FOUND | KYC-верификация не найдена |
| 400 | NOT_REVIEWABLE | KYC не находится в статусе для проверки |
Эндпоинты управления партнёрами
GET /api/v1/admin/partners
Получение списка всех партнёров.
Аутентификация: Требуется (ADMIN)
Лимит запросов: 200 запросов в минуту
Заголовки запроса
Authorization: Bearer <access_token>Тело запроса
Отсутствует
Query параметры
| Параметр | Тип | Описание |
|---|---|---|
| page | number | Номер страницы (опционально) |
| pageSize | number | Элементов на странице, макс 100 (опционально) |
| status | string | Фильтр: 'ACTIVE', 'SUSPENDED', 'TERMINATED', 'ALL' (опционально) |
| rank | string | Фильтр по коду ранга (опционально) |
| search | string | Поиск по имени или реферальному коду (опционально) |
| sortBy | string | Поле сортировки: 'createdAt', 'totalEarned', 'networkSize' (опционально) |
| sortOrder | string | Направление сортировки: 'asc', 'desc' (опционально) |
Ответ (200 OK)
interface AdminPartnersResponse {
partners: AdminPartner[];
}
interface AdminPartner {
id: string;
user: {
id: string;
email: string;
name: string;
};
referralCode: string;
status: string;
rank: {
name: string;
code: string;
} | null;
sponsor: {
id: string;
name: string;
} | null;
stats: {
directReferrals: number;
networkSize: number;
totalEarned: number;
totalWithdrawn: number;
availableBalance: number;
pendingBalance: number;
};
joinedAt: string;
}Ответы с ошибками
| Статус | Код | Описание |
|---|---|---|
| 401 | UNAUTHORIZED | Недействительный или истёкший токен доступа |
| 403 | FORBIDDEN | Недостаточно прав |
GET /api/v1/admin/partners/:id
Получение деталей партнёра.
Аутентификация: Требуется (ADMIN)
Лимит запросов: 200 запросов в минуту
Заголовки запроса
Authorization: Bearer <access_token>Path параметры
| Параметр | Тип | Описание |
|---|---|---|
| id | string (UUID) | ID партнёра |
Тело запроса
Отсутствует
Query параметры
Отсутствуют
Ответ (200 OK)
interface AdminPartnerDetailResponse {
id: string;
user: {
id: string;
email: string;
name: string;
phone: string | null;
status: string;
};
referralCode: string;
status: string;
rank: {
id: string;
name: string;
code: string;
level: number;
} | null;
highestRank: {
name: string;
code: string;
achievedAt: string;
} | null;
sponsor: {
id: string;
name: string;
referralCode: string;
} | null;
balance: {
available: number;
pending: number;
totalEarned: number;
totalWithdrawn: number;
careerPointsTotal: number;
careerPointsPeriod: number;
currency: string;
};
stats: {
directReferrals: number;
networkSize: number;
treeDepth: number;
activeReferrals: number;
commissionsCount: number;
payoutsCount: number;
};
payoutDetails: {
method: string;
maskedDetails: string;
lastUpdated: string;
} | null;
recentCommissions: {
id: string;
amount: number;
sourceType: string;
status: string;
createdAt: string;
}[];
recentPayouts: {
id: string;
amount: number;
status: string;
createdAt: string;
}[];
joinedAt: string;
activatedAt: string | null;
}Ответы с ошибками
| Статус | Код | Описание |
|---|---|---|
| 401 | UNAUTHORIZED | Недействительный или истёкший токен доступа |
| 403 | FORBIDDEN | Недостаточно прав |
| 404 | PARTNER_NOT_FOUND | Партнёр не найден |
GET /api/v1/admin/partners/:id/network
Получение дерева сети партнёра.
Аутентификация: Требуется (ADMIN)
Лимит запросов: 200 запросов в минуту
Заголовки запроса
Authorization: Bearer <access_token>Path параметры
| Параметр | Тип | Описание |
|---|---|---|
| id | string (UUID) | ID партнёра |
Тело запроса
Отсутствует
Query параметры
| Параметр | Тип | Описание |
|---|---|---|
| depth | number | Максимальная глубина, 1-10 (опционально) |
| page | number | Номер страницы (опционально) |
| pageSize | number | Элементов на странице, макс 100 (опционально) |
Ответ (200 OK)
interface AdminPartnerNetworkResponse {
partnerId: string;
partnerName: string;
network: NetworkNode[];
stats: {
totalSize: number;
byLevel: {
level: number;
count: number;
volume: number;
}[];
};
}
interface NetworkNode {
id: string;
name: string;
email: string;
referralCode: string;
level: number;
status: string;
rank: string | null;
directReferrals: number;
totalVolume: number;
joinedAt: string;
}Ответы с ошибками
| Статус | Код | Описание |
|---|---|---|
| 401 | UNAUTHORIZED | Недействительный или истёкший токен доступа |
| 403 | FORBIDDEN | Недостаточно прав |
| 404 | PARTNER_NOT_FOUND | Партнёр не найден |
Эндпоинты управления комиссиями
GET /api/v1/admin/commissions
Получение списка всех комиссионных транзакций.
Аутентификация: Требуется (ADMIN)
Лимит запросов: 200 запросов в минуту
Заголовки запроса
Authorization: Bearer <access_token>Тело запроса
Отсутствует
Query параметры
| Параметр | Тип | Описание |
|---|---|---|
| page | number | Номер страницы (опционально) |
| pageSize | number | Элементов на странице, макс 100 (опционально) |
| status | string | Фильтр: 'PENDING', 'APPROVED', 'PAID', 'HELD', 'REVERSED', 'ALL' (опционально) |
| sourceType | string | Фильтр: 'ORDER', 'INVESTMENT', 'BONUS', 'RANK_BONUS' (опционально) |
| partnerId | string | Фильтр по UUID партнёра (опционально) |
| dateFrom | string | Начальная дата (ISO 8601) (опционально) |
| dateTo | string | Конечная дата (ISO 8601) (опционально) |
| minAmount | number | Фильтр по минимальной сумме (опционально) |
| sortBy | string | Поле сортировки: 'createdAt', 'amount', 'status' (опционально) |
| sortOrder | string | Направление сортировки: 'asc', 'desc' (опционально) |
Ответ (200 OK)
interface AdminCommissionsResponse {
commissions: AdminCommission[];
summary: {
totalPending: number;
totalApproved: number;
totalPaid: number;
totalReversed: number;
};
}
interface AdminCommission {
id: string;
partner: {
id: string;
name: string;
referralCode: string;
};
sourceType: string;
sourceId: string;
sourcePartner: {
id: string;
name: string;
} | null;
levelDepth: number | null;
grossAmount: number;
netAmount: number;
careerPoints: number;
currency: string;
status: string;
periodId: string | null;
processedAt: string | null;
approvedBy: string | null;
createdAt: string;
}Ответы с ошибками
| Статус | Код | Описание |
|---|---|---|
| 401 | UNAUTHORIZED | Недействительный или истёкший токен доступа |
| 403 | FORBIDDEN | Недостаточно прав |
POST /api/v1/admin/commissions/:id/adjust
Корректировка комиссионной транзакции.
Аутентификация: Требуется (ADMIN)
Лимит запросов: 10 запросов в минуту
Заголовки запроса
Authorization: Bearer <access_token>Path параметры
| Параметр | Тип | Описание |
|---|---|---|
| id | string (UUID) | ID комиссии |
Тело запроса
interface AdjustCommissionRequest {
action: 'APPROVE' | 'HOLD' | 'REVERSE' | 'ADJUST_AMOUNT';
newAmount?: number; // Для действия ADJUST_AMOUNT
reason: string; // Причина корректировки
}Query параметры
Отсутствуют
Ответ (200 OK)
interface AdjustCommissionResponse {
id: string;
previousStatus: string;
newStatus: string;
previousAmount: number | null;
newAmount: number | null;
adjustedAt: string;
adjustedBy: string;
reason: string;
}Ответы с ошибками
| Статус | Код | Описание |
|---|---|---|
| 400 | VALIDATION_ERROR | Некорректное действие или причина не указана |
| 401 | UNAUTHORIZED | Недействительный или истёкший токен доступа |
| 403 | FORBIDDEN | Недостаточно прав |
| 404 | COMMISSION_NOT_FOUND | Комиссия не найдена |
| 400 | CANNOT_ADJUST | Комиссия не может быть скорректирована в текущем статусе |
Эндпоинты управления выплатами
GET /api/v1/admin/payouts
Получение списка всех запросов на выплату.
Аутентификация: Требуется (ADMIN)
Лимит запросов: 200 запросов в минуту
Заголовки запроса
Authorization: Bearer <access_token>Тело запроса
Отсутствует
Query параметры
| Параметр | Тип | Описание |
|---|---|---|
| page | number | Номер страницы (опционально) |
| pageSize | number | Элементов на странице, макс 100 (опционально) |
| status | string | Фильтр: 'PENDING', 'APPROVED', 'PROCESSING', 'COMPLETED', 'REJECTED', 'CANCELLED', 'ALL' (опционально) |
| partnerId | string | Фильтр по UUID партнёра (опционально) |
| dateFrom | string | Начальная дата (ISO 8601) (опционально) |
| dateTo | string | Конечная дата (ISO 8601) (опционально) |
| minAmount | number | Фильтр по минимальной сумме (опционально) |
Ответ (200 OK)
interface AdminPayoutsResponse {
payouts: AdminPayout[];
summary: {
pendingCount: number;
pendingAmount: number;
processingCount: number;
processingAmount: number;
};
}
interface AdminPayout {
id: string;
partner: {
id: string;
name: string;
referralCode: string;
};
amount: number;
currency: string;
method: {
type: string;
maskedDetails: string;
};
status: string;
rejectionReason: string | null;
externalReference: string | null;
processedBy: string | null;
processedAt: string | null;
completedAt: string | null;
createdAt: string;
}Ответы с ошибками
| Статус | Код | Описание |
|---|---|---|
| 401 | UNAUTHORIZED | Недействительный или истёкший токен доступа |
| 403 | FORBIDDEN | Недостаточно прав |
POST /api/v1/admin/payouts/:id/approve
Одобрение запроса на выплату.
Аутентификация: Требуется (ADMIN)
Лимит запросов: 200 запросов в минуту
Заголовки запроса
Authorization: Bearer <access_token>Path параметры
| Параметр | Тип | Описание |
|---|---|---|
| id | string (UUID) | ID запроса на выплату |
Тело запроса
interface ApprovePayoutRequest {
note?: string;
}Query параметры
Отсутствуют
Ответ (200 OK)
interface ApprovePayoutResponse {
id: string;
status: 'APPROVED';
approvedAt: string;
approvedBy: string;
}Ответы с ошибками
| Статус | Код | Описание |
|---|---|---|
| 401 | UNAUTHORIZED | Недействительный или истёкший токен доступа |
| 403 | FORBIDDEN | Недостаточно прав |
| 404 | PAYOUT_NOT_FOUND | Запрос на выплату не найден |
| 400 | NOT_PENDING | Выплата не в статусе ожидания |
POST /api/v1/admin/payouts/:id/reject
Отклонение запроса на выплату.
Аутентификация: Требуется (ADMIN)
Лимит запросов: 200 запросов в минуту
Заголовки запроса
Authorization: Bearer <access_token>Path параметры
| Параметр | Тип | Описание |
|---|---|---|
| id | string (UUID) | ID запроса на выплату |
Тело запроса
interface RejectPayoutRequest {
reason: string; // Причина отклонения
returnToBalance?: boolean; // Вернуть средства на баланс партнёра
}Query параметры
Отсутствуют
Ответ (200 OK)
interface RejectPayoutResponse {
id: string;
status: 'REJECTED';
reason: string;
rejectedAt: string;
rejectedBy: string;
fundsReturned: boolean;
}Ответы с ошибками
| Статус | Код | Описание |
|---|---|---|
| 400 | VALIDATION_ERROR | Причина не указана |
| 401 | UNAUTHORIZED | Недействительный или истёкший токен доступа |
| 403 | FORBIDDEN | Недостаточно прав |
| 404 | PAYOUT_NOT_FOUND | Запрос на выплату не найден |
| 400 | NOT_REJECTABLE | Выплата не может быть отклонена в текущем статусе |
POST /api/v1/admin/payouts/:id/process
Обработка выплаты (инициирование платежа).
Аутентификация: Требуется (ADMIN)
Лимит запросов: 5 запросов в минуту
Заголовки запроса
Authorization: Bearer <access_token>Path параметры
| Параметр | Тип | Описание |
|---|---|---|
| id | string (UUID) | ID запроса на выплату |
Тело запроса
interface ProcessPayoutRequest {
externalReference?: string; // Внешний референс транзакции
}Query параметры
Отсутствуют
Ответ (200 OK)
interface ProcessPayoutResponse {
id: string;
status: 'PROCESSING' | 'COMPLETED';
externalReference: string | null;
processedAt: string;
processedBy: string;
estimatedCompletion: string | null;
}Ответы с ошибками
| Статус | Код | Описание |
|---|---|---|
| 401 | UNAUTHORIZED | Недействительный или истёкший токен доступа |
| 403 | FORBIDDEN | Недостаточно прав |
| 404 | PAYOUT_NOT_FOUND | Запрос на выплату не найден |
| 400 | NOT_APPROVED | Выплата должна быть сначала одобрена |
| 400 | PAYMENT_FAILED | Ошибка обработки платежа |
Эндпоинты управления заказами
GET /api/v1/admin/orders
Получение списка всех заказов.
Аутентификация: Требуется (ADMIN)
Лимит запросов: 200 запросов в минуту
Заголовки запроса
Authorization: Bearer <access_token>Тело запроса
Отсутствует
Query параметры
| Параметр | Тип | Описание |
|---|---|---|
| page | number | Номер страницы (опционально) |
| pageSize | number | Элементов на странице, макс 100 (опционально) |
| status | string | Фильтр по статусу заказа (опционально) |
| paymentStatus | string | Фильтр по статусу оплаты (опционально) |
| userId | string | Фильтр по UUID пользователя (опционально) |
| dateFrom | string | Начальная дата (ISO 8601) (опционально) |
| dateTo | string | Конечная дата (ISO 8601) (опционально) |
| search | string | Поиск по номеру заказа или email пользователя (опционально) |
Ответ (200 OK)
interface AdminOrdersResponse {
orders: AdminOrder[];
summary: {
totalOrders: number;
totalRevenue: number;
pendingPayment: number;
processing: number;
shipped: number;
};
}
interface AdminOrder {
id: string;
orderNumber: string;
user: {
id: string;
email: string;
name: string;
};
status: string;
paymentStatus: string;
itemCount: number;
total: number;
currency: string;
shippingMethod: string;
createdAt: string;
updatedAt: string;
}PATCH /api/v1/admin/orders/:id
Обновление заказа.
Аутентификация: Требуется (ADMIN)
Лимит запросов: 200 запросов в минуту
Заголовки запроса
Authorization: Bearer <access_token>Path параметры
| Параметр | Тип | Описание |
|---|---|---|
| id | string (UUID) | ID заказа |
Тело запроса
interface AdminUpdateOrderRequest {
status?: 'PROCESSING' | 'SHIPPED' | 'DELIVERED' | 'CANCELLED';
trackingNumber?: string;
trackingUrl?: string;
note?: string;
notifyCustomer?: boolean;
}Query параметры
Отсутствуют
Ответ (200 OK)
interface AdminUpdateOrderResponse {
id: string;
orderNumber: string;
status: string;
trackingNumber: string | null;
updatedAt: string;
updatedBy: string;
}Ответы с ошибками
| Статус | Код | Описание |
|---|---|---|
| 400 | VALIDATION_ERROR | Некорректный переход статуса |
| 401 | UNAUTHORIZED | Недействительный или истёкший токен доступа |
| 403 | FORBIDDEN | Недостаточно прав |
| 404 | ORDER_NOT_FOUND | Заказ не найден |
Эндпоинты управления товарами
GET /api/v1/admin/products
Получение списка товаров с административными данными.
Аутентификация: Требуется (ADMIN)
Лимит запросов: 200 запросов в минуту
Заголовки запроса
Authorization: Bearer <access_token>Тело запроса
Отсутствует
Query параметры
| Параметр | Тип | Описание |
|---|---|---|
| page | number | Номер страницы (опционально) |
| pageSize | number | Элементов на странице, макс 100 (опционально) |
| status | string | Фильтр: 'ACTIVE', 'DRAFT', 'ARCHIVED', 'OUT_OF_STOCK', 'ALL' (опционально) |
| categoryId | string | Фильтр по категории (опционально) |
| search | string | Поиск по названию или SKU (опционально) |
Ответ (200 OK)
interface AdminProductsResponse {
products: AdminProduct[];
}
interface AdminProduct {
id: string;
name: string;
sku: string;
status: string;
price: number;
compareAtPrice: number | null;
stockQuantity: number | null;
category: string | null;
ordersCount: number;
totalRevenue: number;
commissionPercentage: number;
createdAt: string;
updatedAt: string;
}POST /api/v1/admin/products
Создание нового товара.
Аутентификация: Требуется (ADMIN)
Лимит запросов: 200 запросов в минуту
Заголовки запроса
Authorization: Bearer <access_token>Тело запроса
interface CreateProductRequest {
name: string;
description: string;
shortDescription?: string;
price: number;
compareAtPrice?: number;
sku: string;
categoryId?: string;
status: 'ACTIVE' | 'DRAFT' | 'ARCHIVED';
stockQuantity?: number;
trackInventory?: boolean;
weight?: number;
dimensions?: {
length: number;
width: number;
height: number;
};
attributes?: Record<string, string>;
tags?: string[];
commissionPercentage: number;
careerPointsPercentage: number;
}Query параметры
Отсутствуют
Ответ (201 Created)
interface CreateProductResponse {
id: string;
name: string;
slug: string;
sku: string;
status: string;
createdAt: string;
createdBy: string;
}Ответы с ошибками
| Статус | Код | Описание |
|---|---|---|
| 400 | VALIDATION_ERROR | Некорректные входные данные |
| 401 | UNAUTHORIZED | Недействительный или истёкший токен доступа |
| 403 | FORBIDDEN | Недостаточно прав |
| 409 | SKU_ALREADY_EXISTS | SKU уже используется |
PATCH /api/v1/admin/products/:id
Обновление товара.
Аутентификация: Требуется (ADMIN)
Лимит запросов: 200 запросов в минуту
Заголовки запроса
Authorization: Bearer <access_token>Path параметры
| Параметр | Тип | Описание |
|---|---|---|
| id | string (UUID) | ID товара |
Тело запроса
interface UpdateProductRequest {
name?: string;
description?: string;
shortDescription?: string;
price?: number;
compareAtPrice?: number | null;
sku?: string;
categoryId?: string | null;
status?: 'ACTIVE' | 'DRAFT' | 'ARCHIVED' | 'OUT_OF_STOCK';
stockQuantity?: number | null;
trackInventory?: boolean;
weight?: number | null;
dimensions?: {
length: number;
width: number;
height: number;
} | null;
attributes?: Record<string, string>;
tags?: string[];
commissionPercentage?: number;
careerPointsPercentage?: number;
}Query параметры
Отсутствуют
Ответ (200 OK)
interface UpdateProductResponse {
id: string;
name: string;
sku: string;
status: string;
updatedAt: string;
updatedBy: string;
}Ответы с ошибками
| Статус | Код | Описание |
|---|---|---|
| 400 | VALIDATION_ERROR | Некорректные входные данные |
| 401 | UNAUTHORIZED | Недействительный или истёкший токен доступа |
| 403 | FORBIDDEN | Недостаточно прав |
| 404 | PRODUCT_NOT_FOUND | Товар не найден |
| 409 | SKU_ALREADY_EXISTS | SKU уже используется |
DELETE /api/v1/admin/products/:id
Удаление товара (мягкое удаление).
Аутентификация: Требуется (ADMIN)
Лимит запросов: 200 запросов в минуту
Заголовки запроса
Authorization: Bearer <access_token>Path параметры
| Параметр | Тип | Описание |
|---|---|---|
| id | string (UUID) | ID товара |
Тело запроса
Отсутствует
Query параметры
Отсутствуют
Ответ (200 OK)
interface DeleteProductResponse {
id: string;
status: 'ARCHIVED';
deletedAt: string;
deletedBy: string;
}Ответы с ошибками
| Статус | Код | Описание |
|---|---|---|
| 401 | UNAUTHORIZED | Недействительный или истёкший токен доступа |
| 403 | FORBIDDEN | Недостаточно прав |
| 404 | PRODUCT_NOT_FOUND | Товар не найден |
| 400 | HAS_PENDING_ORDERS | Нельзя удалить товар с незавершёнными заказами |
Эндпоинты управления стратегиями
GET /api/v1/admin/strategies
Получение списка стратегий с административными данными.
Аутентификация: Требуется (ADMIN)
Лимит запросов: 200 запросов в минуту
Заголовки запроса
Authorization: Bearer <access_token>Тело запроса
Отсутствует
Query параметры
| Параметр | Тип | Описание |
|---|---|---|
| page | number | Номер страницы (опционально) |
| pageSize | number | Элементов на странице, макс 50 (опционально) |
| status | string | Фильтр: 'ACTIVE', 'PAUSED', 'CLOSED', 'ALL' (опционально) |
| categoryId | string | Фильтр по категории (опционально) |
Ответ (200 OK)
interface AdminStrategiesResponse {
strategies: AdminStrategy[];
}
interface AdminStrategy {
id: string;
name: string;
status: string;
riskLevel: string;
returnRate: {
min: number;
max: number;
expected: number;
};
capacity: {
total: number | null;
used: number;
available: number | null;
};
participants: {
total: number;
active: number;
};
financials: {
totalInvested: number;
totalReturnsDistributed: number;
pendingReturns: number;
};
createdAt: string;
updatedAt: string;
}POST /api/v1/admin/strategies
Создание новой стратегии.
Аутентификация: Требуется (SUPER_ADMIN)
Лимит запросов: 200 запросов в минуту
Заголовки запроса
Authorization: Bearer <access_token>Тело запроса
interface CreateStrategyRequest {
name: string;
description: string;
shortDescription: string;
categoryId: string;
returnRate: {
min: number;
max: number;
expected: number;
type: 'FIXED' | 'VARIABLE';
payoutFrequency: 'DAILY' | 'WEEKLY' | 'MONTHLY' | 'END_OF_TERM';
};
duration: {
minDays: number;
maxDays: number;
lockPeriodDays: number;
};
investment: {
minAmount: number;
maxAmount: number | null;
currency: string;
totalCapacity: number | null;
};
riskLevel: 'LOW' | 'MEDIUM' | 'HIGH';
riskDisclosure: string;
terms: {
earlyWithdrawalAllowed: boolean;
earlyWithdrawalPenalty: number | null;
compoundingAvailable: boolean;
automaticReinvestment: boolean;
};
commissionPercentage: number;
careerPointsPercentage: number;
status: 'ACTIVE' | 'PAUSED' | 'CLOSED';
}Query параметры
Отсутствуют
Ответ (201 Created)
interface CreateStrategyResponse {
id: string;
name: string;
slug: string;
status: string;
createdAt: string;
createdBy: string;
}Ответы с ошибками
| Статус | Код | Описание |
|---|---|---|
| 400 | VALIDATION_ERROR | Некорректные входные данные |
| 401 | UNAUTHORIZED | Недействительный или истёкший токен доступа |
| 403 | FORBIDDEN | Требуется роль SUPER_ADMIN |
| 404 | CATEGORY_NOT_FOUND | Категория не найдена |
PATCH /api/v1/admin/strategies/:id
Обновление стратегии.
Аутентификация: Требуется (ADMIN)
Лимит запросов: 200 запросов в минуту
Заголовки запроса
Authorization: Bearer <access_token>Path параметры
| Параметр | Тип | Описание |
|---|---|---|
| id | string (UUID) | ID стратегии |
Тело запроса
interface UpdateStrategyRequest {
name?: string;
description?: string;
shortDescription?: string;
categoryId?: string;
returnRate?: {
min?: number;
max?: number;
expected?: number;
};
investment?: {
minAmount?: number;
maxAmount?: number | null;
totalCapacity?: number | null;
};
riskDisclosure?: string;
terms?: {
earlyWithdrawalAllowed?: boolean;
earlyWithdrawalPenalty?: number | null;
compoundingAvailable?: boolean;
automaticReinvestment?: boolean;
};
commissionPercentage?: number;
careerPointsPercentage?: number;
status?: 'ACTIVE' | 'PAUSED' | 'CLOSED';
}Query параметры
Отсутствуют
Ответ (200 OK)
interface UpdateStrategyResponse {
id: string;
name: string;
status: string;
updatedAt: string;
updatedBy: string;
}Ответы с ошибками
| Статус | Код | Описание |
|---|---|---|
| 400 | VALIDATION_ERROR | Некорректные входные данные |
| 401 | UNAUTHORIZED | Недействительный или истёкший токен доступа |
| 403 | FORBIDDEN | Недостаточно прав |
| 404 | STRATEGY_NOT_FOUND | Стратегия не найдена |
| 400 | HAS_ACTIVE_PARTICIPATIONS | Нельзя закрыть стратегию с активными участиями |
Эндпоинты аналитики
GET /api/v1/admin/analytics/dashboard
Получение статистики дашборда.
Аутентификация: Требуется (ADMIN)
Лимит запросов: 200 запросов в минуту
Заголовки запроса
Authorization: Bearer <access_token>Тело запроса
Отсутствует
Query параметры
| Параметр | Тип | Описание |
|---|---|---|
| period | string | Период: 'TODAY', 'WEEK', 'MONTH', 'QUARTER', 'YEAR' (опционально) |
Ответ (200 OK)
interface DashboardResponse {
period: string;
periodStart: string;
periodEnd: string;
users: {
total: number;
newInPeriod: number;
active: number;
suspended: number;
growth: number; // Процент
};
partners: {
total: number;
newInPeriod: number;
active: number;
growth: number;
};
orders: {
total: number;
inPeriod: number;
revenue: number;
averageOrderValue: number;
growth: number;
};
investments: {
totalParticipations: number;
inPeriod: number;
totalInvested: number;
activeInvestments: number;
growth: number;
};
commissions: {
totalPaid: number;
paidInPeriod: number;
pending: number;
growth: number;
};
payouts: {
totalProcessed: number;
processedInPeriod: number;
pending: number;
pendingAmount: number;
};
quickStats: {
conversionRate: number;
averagePartnerEarnings: number;
partnerRetentionRate: number;
investmentRetentionRate: number;
};
}Ответы с ошибками
| Статус | Код | Описание |
|---|---|---|
| 401 | UNAUTHORIZED | Недействительный или истёкший токен доступа |
| 403 | FORBIDDEN | Недостаточно прав |
GET /api/v1/admin/analytics/sales
Получение аналитики продаж.
Аутентификация: Требуется (ADMIN)
Лимит запросов: 200 запросов в минуту
Заголовки запроса
Authorization: Bearer <access_token>Тело запроса
Отсутствует
Query параметры
| Параметр | Тип | Описание |
|---|---|---|
| period | string | Период: 'WEEK', 'MONTH', 'QUARTER', 'YEAR' (опционально) |
| granularity | string | Гранулярность данных: 'DAY', 'WEEK', 'MONTH' (опционально) |
| categoryId | string | Фильтр по категории товаров (опционально) |
Ответ (200 OK)
interface SalesAnalyticsResponse {
period: string;
periodStart: string;
periodEnd: string;
summary: {
totalRevenue: number;
totalOrders: number;
averageOrderValue: number;
totalCustomers: number;
newCustomers: number;
repeatCustomers: number;
};
timeline: {
date: string;
revenue: number;
orders: number;
averageOrderValue: number;
}[];
byCategory: {
categoryId: string;
categoryName: string;
revenue: number;
orders: number;
percentage: number;
}[];
topProducts: {
productId: string;
productName: string;
revenue: number;
quantity: number;
}[];
byPaymentMethod: {
method: string;
count: number;
amount: number;
percentage: number;
}[];
byRegion: {
region: string;
revenue: number;
orders: number;
}[];
}GET /api/v1/admin/analytics/commissions
Получение аналитики комиссий.
Аутентификация: Требуется (ADMIN)
Лимит запросов: 200 запросов в минуту
Заголовки запроса
Authorization: Bearer <access_token>Тело запроса
Отсутствует
Query параметры
| Параметр | Тип | Описание |
|---|---|---|
| period | string | Период: 'WEEK', 'MONTH', 'QUARTER', 'YEAR' (опционально) |
| granularity | string | Гранулярность данных: 'DAY', 'WEEK', 'MONTH' (опционально) |
Ответ (200 OK)
interface CommissionAnalyticsResponse {
period: string;
periodStart: string;
periodEnd: string;
summary: {
totalGenerated: number;
totalPaid: number;
totalPending: number;
totalReversed: number;
averageCommission: number;
partnersEarning: number;
};
timeline: {
date: string;
generated: number;
paid: number;
reversed: number;
}[];
bySource: {
sourceType: string;
total: number;
count: number;
percentage: number;
}[];
byLevel: {
level: number;
total: number;
count: number;
averageAmount: number;
}[];
byRank: {
rankCode: string;
rankName: string;
partnersCount: number;
totalEarned: number;
averageEarned: number;
}[];
topEarners: {
partnerId: string;
partnerName: string;
rank: string | null;
totalEarned: number;
commissionsCount: number;
}[];
payoutStats: {
totalRequested: number;
totalApproved: number;
totalProcessed: number;
averageProcessingTime: number; // Часы
};
}Ответы с ошибками
| Статус | Код | Описание |
|---|---|---|
| 401 | UNAUTHORIZED | Недействительный или истёкший токен доступа |
| 403 | FORBIDDEN | Недостаточно прав |