Skip to content

Admin API

Общая информация

Базовый URL

/api/v1/admin

Заголовок аутентификации

Authorization: Bearer <access_token>

Требуемые роли

Все эндпоинты в этом API требуют одну из следующих ролей:

  • ADMIN - Стандартный доступ администратора
  • SUPER_ADMIN - Полный административный доступ

Некоторые эндпоинты могут требовать именно SUPER_ADMIN. Это указано в документации эндпоинта.

Формат ответа

Все ответы следуют стандартному формату:

typescript
// 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[]>;
  };
}

Формат пагинации

typescript
interface PaginationMeta {
  total: number;
  page: number;
  pageSize: number;
  totalPages: number;
  hasNext: boolean;
  hasPrevious: boolean;
}

Лимиты запросов

ЭндпоинтЛимит
Общие админ эндпоинты200/мин
POST /commissions/:id/adjust10/мин
POST /payouts/:id/process5/мин
Массовые операции30/мин

Аудит-логирование

Все административные операции логируются с указанием:

  • ID администратора
  • Временная метка
  • Выполненное действие
  • ID затронутой сущности
  • Предыдущие и новые значения (для обновлений)
  • IP-адрес

Эндпоинты управления пользователями

GET /api/v1/admin/users

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

Аутентификация: Требуется (ADMIN)

Лимит запросов: 200 запросов в минуту

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

Authorization: Bearer <access_token>

Тело запроса

Отсутствует

Query параметры

ПараметрТипОписание
pagenumberНомер страницы (опционально)
pageSizenumberЭлементов на странице, макс 100 (опционально)
statusstringФильтр: 'PENDING_VERIFICATION', 'ACTIVE', 'SUSPENDED', 'BANNED', 'ALL' (опционально)
rolestringФильтр по роли: 'USER', 'ADMIN', 'SUPER_ADMIN' (опционально)
kycStatusstringФильтр по статусу KYC (опционально)
searchstringПоиск по email, имени или телефону (опционально)
dateFromstringДата регистрации от (ISO 8601) (опционально)
dateTostringДата регистрации до (ISO 8601) (опционально)
sortBystringПоле сортировки: 'createdAt', 'email', 'status', 'lastLoginAt' (опционально)
sortOrderstringНаправление сортировки: 'asc', 'desc' (опционально)

Ответ (200 OK)

typescript
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;
}

Ответы с ошибками

СтатусКодОписание
400VALIDATION_ERRORНекорректные query параметры
401UNAUTHORIZEDНедействительный или истёкший токен доступа
403FORBIDDENНедостаточно прав

Пример

Запрос:

bash
curl -X GET "https://api.iwm-platform.com/api/v1/admin/users?status=ACTIVE&page=1&pageSize=20" \
  -H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..."

Ответ:

json
{
  "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 параметры

ПараметрТипОписание
idstring (UUID)ID пользователя

Тело запроса

Отсутствует

Query параметры

Отсутствуют

Ответ (200 OK)

typescript
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;
}

Ответы с ошибками

СтатусКодОписание
401UNAUTHORIZEDНедействительный или истёкший токен доступа
403FORBIDDENНедостаточно прав
404USER_NOT_FOUNDПользователь не найден

Пример

Запрос:

bash
curl -X GET https://api.iwm-platform.com/api/v1/admin/users/550e8400-e29b-41d4-a716-446655440000 \
  -H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..."

Ответ:

json
{
  "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 параметры

ПараметрТипОписание
idstring (UUID)ID пользователя

Тело запроса

typescript
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)

typescript
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;
}

Ответы с ошибками

СтатусКодОписание
400VALIDATION_ERRORНекорректные входные данные
401UNAUTHORIZEDНедействительный или истёкший токен доступа
403FORBIDDENНедостаточно прав
403CANNOT_MODIFY_SUPER_ADMINНельзя изменять SUPER_ADMIN пользователя
404USER_NOT_FOUNDПользователь не найден
409EMAIL_ALREADY_EXISTSEmail уже используется

Пример

Запрос:

bash
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"
  }'

Ответ:

json
{
  "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 параметры

ПараметрТипОписание
idstring (UUID)ID пользователя

Тело запроса

typescript
interface SuspendUserRequest {
  reason: string;                   // Причина приостановки
  duration?: number;                // Длительность в днях (null = бессрочно)
  notifyUser?: boolean;             // Отправить уведомление на email
}

Query параметры

Отсутствуют

Ответ (200 OK)

typescript
interface SuspendUserResponse {
  userId: string;
  status: 'SUSPENDED';
  reason: string;
  suspendedAt: string;
  suspendedBy: string;
  suspendedUntil: string | null;
  sessionsRevoked: number;
}

Ответы с ошибками

СтатусКодОписание
400VALIDATION_ERRORПричина не указана
401UNAUTHORIZEDНедействительный или истёкший токен доступа
403FORBIDDENНедостаточно прав
403CANNOT_SUSPEND_ADMINНельзя приостановить администратора
404USER_NOT_FOUNDПользователь не найден
400ALREADY_SUSPENDEDПользователь уже приостановлен

Пример

Запрос:

bash
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
  }'

Ответ:

json
{
  "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 параметры

ПараметрТипОписание
idstring (UUID)ID пользователя

Тело запроса

typescript
interface ActivateUserRequest {
  note?: string;                    // Опциональная заметка
  notifyUser?: boolean;             // Отправить уведомление на email
}

Query параметры

Отсутствуют

Ответ (200 OK)

typescript
interface ActivateUserResponse {
  userId: string;
  status: 'ACTIVE';
  activatedAt: string;
  activatedBy: string;
}

Ответы с ошибками

СтатусКодОписание
401UNAUTHORIZEDНедействительный или истёкший токен доступа
403FORBIDDENНедостаточно прав
404USER_NOT_FOUNDПользователь не найден
400NOT_SUSPENDEDПользователь не приостановлен

Пример

Запрос:

bash
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
  }'

Ответ:

json
{
  "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 параметры

ПараметрТипОписание
pagenumberНомер страницы (опционально)
pageSizenumberЭлементов на странице, макс 50 (опционально)
statusstringФильтр: 'SUBMITTED', 'UNDER_REVIEW', 'NEEDS_INFO' (опционально)
prioritystringФильтр: 'HIGH', 'NORMAL', 'LOW' (опционально)
sortBystringПоле сортировки: 'submittedAt', 'priority' (опционально)
sortOrderstringНаправление сортировки: 'asc', 'desc' (опционально)

Ответ (200 OK)

typescript
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;               // Часы
}

Ответы с ошибками

СтатусКодОписание
401UNAUTHORIZEDНедействительный или истёкший токен доступа
403FORBIDDENНедостаточно прав

Пример

Запрос:

bash
curl -X GET "https://api.iwm-platform.com/api/v1/admin/kyc/queue?status=SUBMITTED&sortBy=submittedAt&sortOrder=asc" \
  -H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..."

Ответ:

json
{
  "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 параметры

ПараметрТипОписание
idstring (UUID)ID KYC-верификации

Тело запроса

Отсутствует

Query параметры

Отсутствуют

Ответ (200 OK)

typescript
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;
}

Ответы с ошибками

СтатусКодОписание
401UNAUTHORIZEDНедействительный или истёкший токен доступа
403FORBIDDENНедостаточно прав
404KYC_NOT_FOUNDKYC-верификация не найдена

POST /api/v1/admin/kyc/:id/approve

Одобрение KYC-заявки.

Аутентификация: Требуется (ADMIN)

Лимит запросов: 200 запросов в минуту

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

Authorization: Bearer <access_token>

Path параметры

ПараметрТипОписание
idstring (UUID)ID KYC-верификации

Тело запроса

typescript
interface ApproveKycRequest {
  level: 'BASIC' | 'STANDARD' | 'ENHANCED';
  note?: string;
  expiresAt?: string;               // Переопределить срок истечения (ISO 8601)
}

Query параметры

Отсутствуют

Ответ (200 OK)

typescript
interface ApproveKycResponse {
  id: string;
  userId: string;
  status: 'APPROVED';
  level: string;
  approvedAt: string;
  approvedBy: string;
  expiresAt: string;
}

Ответы с ошибками

СтатусКодОписание
400VALIDATION_ERRORНекорректный уровень
401UNAUTHORIZEDНедействительный или истёкший токен доступа
403FORBIDDENНедостаточно прав
404KYC_NOT_FOUNDKYC-верификация не найдена
400NOT_REVIEWABLEKYC не находится в статусе для проверки

Пример

Запрос:

bash
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"
  }'

Ответ:

json
{
  "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 параметры

ПараметрТипОписание
idstring (UUID)ID KYC-верификации

Тело запроса

typescript
interface RejectKycRequest {
  reason: string;                   // Причина отклонения
  rejectedDocuments?: {
    documentId: string;
    reason: string;
  }[];
  allowResubmission?: boolean;      // Разрешить повторную подачу
}

Query параметры

Отсутствуют

Ответ (200 OK)

typescript
interface RejectKycResponse {
  id: string;
  userId: string;
  status: 'REJECTED';
  reason: string;
  rejectedAt: string;
  rejectedBy: string;
  canResubmit: boolean;
}

Ответы с ошибками

СтатусКодОписание
400VALIDATION_ERRORПричина не указана
401UNAUTHORIZEDНедействительный или истёкший токен доступа
403FORBIDDENНедостаточно прав
404KYC_NOT_FOUNDKYC-верификация не найдена
400NOT_REVIEWABLEKYC не находится в статусе для проверки

Эндпоинты управления партнёрами

GET /api/v1/admin/partners

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

Аутентификация: Требуется (ADMIN)

Лимит запросов: 200 запросов в минуту

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

Authorization: Bearer <access_token>

Тело запроса

Отсутствует

Query параметры

ПараметрТипОписание
pagenumberНомер страницы (опционально)
pageSizenumberЭлементов на странице, макс 100 (опционально)
statusstringФильтр: 'ACTIVE', 'SUSPENDED', 'TERMINATED', 'ALL' (опционально)
rankstringФильтр по коду ранга (опционально)
searchstringПоиск по имени или реферальному коду (опционально)
sortBystringПоле сортировки: 'createdAt', 'totalEarned', 'networkSize' (опционально)
sortOrderstringНаправление сортировки: 'asc', 'desc' (опционально)

Ответ (200 OK)

typescript
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;
}

Ответы с ошибками

СтатусКодОписание
401UNAUTHORIZEDНедействительный или истёкший токен доступа
403FORBIDDENНедостаточно прав

GET /api/v1/admin/partners/:id

Получение деталей партнёра.

Аутентификация: Требуется (ADMIN)

Лимит запросов: 200 запросов в минуту

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

Authorization: Bearer <access_token>

Path параметры

ПараметрТипОписание
idstring (UUID)ID партнёра

Тело запроса

Отсутствует

Query параметры

Отсутствуют

Ответ (200 OK)

typescript
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;
}

Ответы с ошибками

СтатусКодОписание
401UNAUTHORIZEDНедействительный или истёкший токен доступа
403FORBIDDENНедостаточно прав
404PARTNER_NOT_FOUNDПартнёр не найден

GET /api/v1/admin/partners/:id/network

Получение дерева сети партнёра.

Аутентификация: Требуется (ADMIN)

Лимит запросов: 200 запросов в минуту

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

Authorization: Bearer <access_token>

Path параметры

ПараметрТипОписание
idstring (UUID)ID партнёра

Тело запроса

Отсутствует

Query параметры

ПараметрТипОписание
depthnumberМаксимальная глубина, 1-10 (опционально)
pagenumberНомер страницы (опционально)
pageSizenumberЭлементов на странице, макс 100 (опционально)

Ответ (200 OK)

typescript
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;
}

Ответы с ошибками

СтатусКодОписание
401UNAUTHORIZEDНедействительный или истёкший токен доступа
403FORBIDDENНедостаточно прав
404PARTNER_NOT_FOUNDПартнёр не найден

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

GET /api/v1/admin/commissions

Получение списка всех комиссионных транзакций.

Аутентификация: Требуется (ADMIN)

Лимит запросов: 200 запросов в минуту

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

Authorization: Bearer <access_token>

Тело запроса

Отсутствует

Query параметры

ПараметрТипОписание
pagenumberНомер страницы (опционально)
pageSizenumberЭлементов на странице, макс 100 (опционально)
statusstringФильтр: 'PENDING', 'APPROVED', 'PAID', 'HELD', 'REVERSED', 'ALL' (опционально)
sourceTypestringФильтр: 'ORDER', 'INVESTMENT', 'BONUS', 'RANK_BONUS' (опционально)
partnerIdstringФильтр по UUID партнёра (опционально)
dateFromstringНачальная дата (ISO 8601) (опционально)
dateTostringКонечная дата (ISO 8601) (опционально)
minAmountnumberФильтр по минимальной сумме (опционально)
sortBystringПоле сортировки: 'createdAt', 'amount', 'status' (опционально)
sortOrderstringНаправление сортировки: 'asc', 'desc' (опционально)

Ответ (200 OK)

typescript
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;
}

Ответы с ошибками

СтатусКодОписание
401UNAUTHORIZEDНедействительный или истёкший токен доступа
403FORBIDDENНедостаточно прав

POST /api/v1/admin/commissions/:id/adjust

Корректировка комиссионной транзакции.

Аутентификация: Требуется (ADMIN)

Лимит запросов: 10 запросов в минуту

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

Authorization: Bearer <access_token>

Path параметры

ПараметрТипОписание
idstring (UUID)ID комиссии

Тело запроса

typescript
interface AdjustCommissionRequest {
  action: 'APPROVE' | 'HOLD' | 'REVERSE' | 'ADJUST_AMOUNT';
  newAmount?: number;               // Для действия ADJUST_AMOUNT
  reason: string;                   // Причина корректировки
}

Query параметры

Отсутствуют

Ответ (200 OK)

typescript
interface AdjustCommissionResponse {
  id: string;
  previousStatus: string;
  newStatus: string;
  previousAmount: number | null;
  newAmount: number | null;
  adjustedAt: string;
  adjustedBy: string;
  reason: string;
}

Ответы с ошибками

СтатусКодОписание
400VALIDATION_ERRORНекорректное действие или причина не указана
401UNAUTHORIZEDНедействительный или истёкший токен доступа
403FORBIDDENНедостаточно прав
404COMMISSION_NOT_FOUNDКомиссия не найдена
400CANNOT_ADJUSTКомиссия не может быть скорректирована в текущем статусе

Эндпоинты управления выплатами

GET /api/v1/admin/payouts

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

Аутентификация: Требуется (ADMIN)

Лимит запросов: 200 запросов в минуту

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

Authorization: Bearer <access_token>

Тело запроса

Отсутствует

Query параметры

ПараметрТипОписание
pagenumberНомер страницы (опционально)
pageSizenumberЭлементов на странице, макс 100 (опционально)
statusstringФильтр: 'PENDING', 'APPROVED', 'PROCESSING', 'COMPLETED', 'REJECTED', 'CANCELLED', 'ALL' (опционально)
partnerIdstringФильтр по UUID партнёра (опционально)
dateFromstringНачальная дата (ISO 8601) (опционально)
dateTostringКонечная дата (ISO 8601) (опционально)
minAmountnumberФильтр по минимальной сумме (опционально)

Ответ (200 OK)

typescript
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;
}

Ответы с ошибками

СтатусКодОписание
401UNAUTHORIZEDНедействительный или истёкший токен доступа
403FORBIDDENНедостаточно прав

POST /api/v1/admin/payouts/:id/approve

Одобрение запроса на выплату.

Аутентификация: Требуется (ADMIN)

Лимит запросов: 200 запросов в минуту

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

Authorization: Bearer <access_token>

Path параметры

ПараметрТипОписание
idstring (UUID)ID запроса на выплату

Тело запроса

typescript
interface ApprovePayoutRequest {
  note?: string;
}

Query параметры

Отсутствуют

Ответ (200 OK)

typescript
interface ApprovePayoutResponse {
  id: string;
  status: 'APPROVED';
  approvedAt: string;
  approvedBy: string;
}

Ответы с ошибками

СтатусКодОписание
401UNAUTHORIZEDНедействительный или истёкший токен доступа
403FORBIDDENНедостаточно прав
404PAYOUT_NOT_FOUNDЗапрос на выплату не найден
400NOT_PENDINGВыплата не в статусе ожидания

POST /api/v1/admin/payouts/:id/reject

Отклонение запроса на выплату.

Аутентификация: Требуется (ADMIN)

Лимит запросов: 200 запросов в минуту

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

Authorization: Bearer <access_token>

Path параметры

ПараметрТипОписание
idstring (UUID)ID запроса на выплату

Тело запроса

typescript
interface RejectPayoutRequest {
  reason: string;                   // Причина отклонения
  returnToBalance?: boolean;        // Вернуть средства на баланс партнёра
}

Query параметры

Отсутствуют

Ответ (200 OK)

typescript
interface RejectPayoutResponse {
  id: string;
  status: 'REJECTED';
  reason: string;
  rejectedAt: string;
  rejectedBy: string;
  fundsReturned: boolean;
}

Ответы с ошибками

СтатусКодОписание
400VALIDATION_ERRORПричина не указана
401UNAUTHORIZEDНедействительный или истёкший токен доступа
403FORBIDDENНедостаточно прав
404PAYOUT_NOT_FOUNDЗапрос на выплату не найден
400NOT_REJECTABLEВыплата не может быть отклонена в текущем статусе

POST /api/v1/admin/payouts/:id/process

Обработка выплаты (инициирование платежа).

Аутентификация: Требуется (ADMIN)

Лимит запросов: 5 запросов в минуту

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

Authorization: Bearer <access_token>

Path параметры

ПараметрТипОписание
idstring (UUID)ID запроса на выплату

Тело запроса

typescript
interface ProcessPayoutRequest {
  externalReference?: string;       // Внешний референс транзакции
}

Query параметры

Отсутствуют

Ответ (200 OK)

typescript
interface ProcessPayoutResponse {
  id: string;
  status: 'PROCESSING' | 'COMPLETED';
  externalReference: string | null;
  processedAt: string;
  processedBy: string;
  estimatedCompletion: string | null;
}

Ответы с ошибками

СтатусКодОписание
401UNAUTHORIZEDНедействительный или истёкший токен доступа
403FORBIDDENНедостаточно прав
404PAYOUT_NOT_FOUNDЗапрос на выплату не найден
400NOT_APPROVEDВыплата должна быть сначала одобрена
400PAYMENT_FAILEDОшибка обработки платежа

Эндпоинты управления заказами

GET /api/v1/admin/orders

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

Аутентификация: Требуется (ADMIN)

Лимит запросов: 200 запросов в минуту

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

Authorization: Bearer <access_token>

Тело запроса

Отсутствует

Query параметры

ПараметрТипОписание
pagenumberНомер страницы (опционально)
pageSizenumberЭлементов на странице, макс 100 (опционально)
statusstringФильтр по статусу заказа (опционально)
paymentStatusstringФильтр по статусу оплаты (опционально)
userIdstringФильтр по UUID пользователя (опционально)
dateFromstringНачальная дата (ISO 8601) (опционально)
dateTostringКонечная дата (ISO 8601) (опционально)
searchstringПоиск по номеру заказа или email пользователя (опционально)

Ответ (200 OK)

typescript
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 параметры

ПараметрТипОписание
idstring (UUID)ID заказа

Тело запроса

typescript
interface AdminUpdateOrderRequest {
  status?: 'PROCESSING' | 'SHIPPED' | 'DELIVERED' | 'CANCELLED';
  trackingNumber?: string;
  trackingUrl?: string;
  note?: string;
  notifyCustomer?: boolean;
}

Query параметры

Отсутствуют

Ответ (200 OK)

typescript
interface AdminUpdateOrderResponse {
  id: string;
  orderNumber: string;
  status: string;
  trackingNumber: string | null;
  updatedAt: string;
  updatedBy: string;
}

Ответы с ошибками

СтатусКодОписание
400VALIDATION_ERRORНекорректный переход статуса
401UNAUTHORIZEDНедействительный или истёкший токен доступа
403FORBIDDENНедостаточно прав
404ORDER_NOT_FOUNDЗаказ не найден

Эндпоинты управления товарами

GET /api/v1/admin/products

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

Аутентификация: Требуется (ADMIN)

Лимит запросов: 200 запросов в минуту

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

Authorization: Bearer <access_token>

Тело запроса

Отсутствует

Query параметры

ПараметрТипОписание
pagenumberНомер страницы (опционально)
pageSizenumberЭлементов на странице, макс 100 (опционально)
statusstringФильтр: 'ACTIVE', 'DRAFT', 'ARCHIVED', 'OUT_OF_STOCK', 'ALL' (опционально)
categoryIdstringФильтр по категории (опционально)
searchstringПоиск по названию или SKU (опционально)

Ответ (200 OK)

typescript
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>

Тело запроса

typescript
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)

typescript
interface CreateProductResponse {
  id: string;
  name: string;
  slug: string;
  sku: string;
  status: string;
  createdAt: string;
  createdBy: string;
}

Ответы с ошибками

СтатусКодОписание
400VALIDATION_ERRORНекорректные входные данные
401UNAUTHORIZEDНедействительный или истёкший токен доступа
403FORBIDDENНедостаточно прав
409SKU_ALREADY_EXISTSSKU уже используется

PATCH /api/v1/admin/products/:id

Обновление товара.

Аутентификация: Требуется (ADMIN)

Лимит запросов: 200 запросов в минуту

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

Authorization: Bearer <access_token>

Path параметры

ПараметрТипОписание
idstring (UUID)ID товара

Тело запроса

typescript
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)

typescript
interface UpdateProductResponse {
  id: string;
  name: string;
  sku: string;
  status: string;
  updatedAt: string;
  updatedBy: string;
}

Ответы с ошибками

СтатусКодОписание
400VALIDATION_ERRORНекорректные входные данные
401UNAUTHORIZEDНедействительный или истёкший токен доступа
403FORBIDDENНедостаточно прав
404PRODUCT_NOT_FOUNDТовар не найден
409SKU_ALREADY_EXISTSSKU уже используется

DELETE /api/v1/admin/products/:id

Удаление товара (мягкое удаление).

Аутентификация: Требуется (ADMIN)

Лимит запросов: 200 запросов в минуту

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

Authorization: Bearer <access_token>

Path параметры

ПараметрТипОписание
idstring (UUID)ID товара

Тело запроса

Отсутствует

Query параметры

Отсутствуют

Ответ (200 OK)

typescript
interface DeleteProductResponse {
  id: string;
  status: 'ARCHIVED';
  deletedAt: string;
  deletedBy: string;
}

Ответы с ошибками

СтатусКодОписание
401UNAUTHORIZEDНедействительный или истёкший токен доступа
403FORBIDDENНедостаточно прав
404PRODUCT_NOT_FOUNDТовар не найден
400HAS_PENDING_ORDERSНельзя удалить товар с незавершёнными заказами

Эндпоинты управления стратегиями

GET /api/v1/admin/strategies

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

Аутентификация: Требуется (ADMIN)

Лимит запросов: 200 запросов в минуту

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

Authorization: Bearer <access_token>

Тело запроса

Отсутствует

Query параметры

ПараметрТипОписание
pagenumberНомер страницы (опционально)
pageSizenumberЭлементов на странице, макс 50 (опционально)
statusstringФильтр: 'ACTIVE', 'PAUSED', 'CLOSED', 'ALL' (опционально)
categoryIdstringФильтр по категории (опционально)

Ответ (200 OK)

typescript
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>

Тело запроса

typescript
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)

typescript
interface CreateStrategyResponse {
  id: string;
  name: string;
  slug: string;
  status: string;
  createdAt: string;
  createdBy: string;
}

Ответы с ошибками

СтатусКодОписание
400VALIDATION_ERRORНекорректные входные данные
401UNAUTHORIZEDНедействительный или истёкший токен доступа
403FORBIDDENТребуется роль SUPER_ADMIN
404CATEGORY_NOT_FOUNDКатегория не найдена

PATCH /api/v1/admin/strategies/:id

Обновление стратегии.

Аутентификация: Требуется (ADMIN)

Лимит запросов: 200 запросов в минуту

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

Authorization: Bearer <access_token>

Path параметры

ПараметрТипОписание
idstring (UUID)ID стратегии

Тело запроса

typescript
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)

typescript
interface UpdateStrategyResponse {
  id: string;
  name: string;
  status: string;
  updatedAt: string;
  updatedBy: string;
}

Ответы с ошибками

СтатусКодОписание
400VALIDATION_ERRORНекорректные входные данные
401UNAUTHORIZEDНедействительный или истёкший токен доступа
403FORBIDDENНедостаточно прав
404STRATEGY_NOT_FOUNDСтратегия не найдена
400HAS_ACTIVE_PARTICIPATIONSНельзя закрыть стратегию с активными участиями

Эндпоинты аналитики

GET /api/v1/admin/analytics/dashboard

Получение статистики дашборда.

Аутентификация: Требуется (ADMIN)

Лимит запросов: 200 запросов в минуту

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

Authorization: Bearer <access_token>

Тело запроса

Отсутствует

Query параметры

ПараметрТипОписание
periodstringПериод: 'TODAY', 'WEEK', 'MONTH', 'QUARTER', 'YEAR' (опционально)

Ответ (200 OK)

typescript
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;
  };
}

Ответы с ошибками

СтатусКодОписание
401UNAUTHORIZEDНедействительный или истёкший токен доступа
403FORBIDDENНедостаточно прав

GET /api/v1/admin/analytics/sales

Получение аналитики продаж.

Аутентификация: Требуется (ADMIN)

Лимит запросов: 200 запросов в минуту

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

Authorization: Bearer <access_token>

Тело запроса

Отсутствует

Query параметры

ПараметрТипОписание
periodstringПериод: 'WEEK', 'MONTH', 'QUARTER', 'YEAR' (опционально)
granularitystringГранулярность данных: 'DAY', 'WEEK', 'MONTH' (опционально)
categoryIdstringФильтр по категории товаров (опционально)

Ответ (200 OK)

typescript
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 параметры

ПараметрТипОписание
periodstringПериод: 'WEEK', 'MONTH', 'QUARTER', 'YEAR' (опционально)
granularitystringГранулярность данных: 'DAY', 'WEEK', 'MONTH' (опционально)

Ответ (200 OK)

typescript
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;   // Часы
  };
}

Ответы с ошибками

СтатусКодОписание
401UNAUTHORIZEDНедействительный или истёкший токен доступа
403FORBIDDENНедостаточно прав

Связанные документы