API Пользователей
Общая информация
Базовый URL
/api/v1/usersЗаголовок аутентификации
Authorization: Bearer <access_token>Формат ответа
Все ответы следуют стандартному формату:
// Успешный ответ
interface SuccessResponse<T> {
success: true;
data: T;
meta?: {
pagination?: PaginationMeta;
[key: string]: unknown;
};
}
// Ответ с ошибкой
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;
}Ограничения запросов
| Эндпоинт | Лимит |
|---|---|
| Все эндпоинты пользователей | 100/мин |
| Загрузка аватара | 10/час |
| Отправка KYC | 5/день |
Эндпоинты
GET /api/v1/users/me
Получение профиля текущего аутентифицированного пользователя.
Аутентификация: Обязательна
Лимит запросов: 100 запросов в минуту
Заголовки запроса
Authorization: Bearer <access_token>Тело запроса
Нет
Параметры запроса
Нет
Ответ (200 OK)
interface UserProfileResponse {
id: string;
email: string;
phone: string | null;
status: 'PENDING_VERIFICATION' | 'ACTIVE' | 'SUSPENDED' | 'BANNED';
emailVerifiedAt: string | null;
phoneVerifiedAt: string | null;
lastLoginAt: string | null;
profile: {
firstName: string;
lastName: string;
middleName: string | null;
dateOfBirth: string | null; // YYYY-MM-DD
avatarUrl: string | null;
language: string;
timezone: string;
};
kyc: {
status: string;
level: string;
};
roles: string[];
twoFactorEnabled: boolean;
createdAt: string;
updatedAt: string;
}Ответы с ошибками
| Статус | Код | Описание |
|---|---|---|
| 401 | UNAUTHORIZED | Недействительный или истекший access token |
Пример
Запрос:
curl -X GET https://api.iwm-platform.com/api/v1/users/me \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..."Ответ:
{
"success": true,
"data": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"email": "user@example.com",
"phone": "+79991234567",
"status": "ACTIVE",
"emailVerifiedAt": "2024-01-15T10:35:00Z",
"phoneVerifiedAt": null,
"lastLoginAt": "2024-01-15T14:00:00Z",
"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": {
"status": "APPROVED",
"level": "STANDARD"
},
"roles": ["USER"],
"twoFactorEnabled": true,
"createdAt": "2024-01-15T10:30:00Z",
"updatedAt": "2024-01-15T12:00:00Z"
}
}PATCH /api/v1/users/me
Обновление профиля текущего пользователя.
Аутентификация: Обязательна
Лимит запросов: 100 запросов в минуту
Заголовки запроса
Authorization: Bearer <access_token>Тело запроса
interface UpdateProfileRequest {
firstName?: string; // 2-100 символов
lastName?: string; // 2-100 символов
middleName?: string | null; // 2-100 символов или null
dateOfBirth?: string; // Формат YYYY-MM-DD
phone?: string; // Формат E.164
language?: string; // ISO 639-1 (например, 'ru', 'en')
timezone?: string; // Часовой пояс IANA (например, 'Europe/Moscow')
}Параметры запроса
Нет
Ответ (200 OK)
interface UpdateProfileResponse {
id: string;
email: string;
phone: string | null;
profile: {
firstName: string;
lastName: string;
middleName: string | null;
dateOfBirth: string | null;
avatarUrl: string | null;
language: string;
timezone: string;
};
updatedAt: string;
}Ответы с ошибками
| Статус | Код | Описание |
|---|---|---|
| 400 | VALIDATION_ERROR | Неверные входные данные |
| 401 | UNAUTHORIZED | Недействительный или истекший access token |
| 409 | PHONE_ALREADY_EXISTS | Номер телефона уже используется |
Пример
Запрос:
curl -X PATCH https://api.iwm-platform.com/api/v1/users/me \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..." \
-H "Content-Type: application/json" \
-d '{
"firstName": "John",
"lastName": "Smith",
"language": "en",
"timezone": "Europe/London"
}'Ответ:
{
"success": true,
"data": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"email": "user@example.com",
"phone": "+79991234567",
"profile": {
"firstName": "John",
"lastName": "Smith",
"middleName": null,
"dateOfBirth": "1990-05-15",
"avatarUrl": "https://cdn.iwm-platform.com/avatars/550e8400.jpg",
"language": "en",
"timezone": "Europe/London"
},
"updatedAt": "2024-01-15T15:00:00Z"
}
}POST /api/v1/users/me/avatar
Загрузка нового изображения аватара.
Аутентификация: Обязательна
Лимит запросов: 10 запросов в час
Заголовки запроса
Authorization: Bearer <access_token>
Content-Type: multipart/form-dataТело запроса
// multipart/form-data
interface AvatarUploadRequest {
avatar: File; // Файл изображения (JPEG, PNG, WebP)
// Макс. размер: 5MB
// Мин. размеры: 100x100
// Макс. размеры: 2000x2000
}Параметры запроса
Нет
Ответ (200 OK)
interface AvatarUploadResponse {
avatarUrl: string;
thumbnailUrl: string;
}Ответы с ошибками
| Статус | Код | Описание |
|---|---|---|
| 400 | VALIDATION_ERROR | Файл не предоставлен |
| 400 | INVALID_FILE_TYPE | Тип файла не поддерживается |
| 400 | FILE_TOO_LARGE | Файл превышает лимит 5MB |
| 400 | INVALID_DIMENSIONS | Размеры изображения вне допустимого диапазона |
| 401 | UNAUTHORIZED | Недействительный или истекший access token |
| 429 | RATE_LIMIT_EXCEEDED | Слишком много попыток загрузки |
Пример
Запрос:
curl -X POST https://api.iwm-platform.com/api/v1/users/me/avatar \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..." \
-F "avatar=@/path/to/image.jpg"Ответ:
{
"success": true,
"data": {
"avatarUrl": "https://cdn.iwm-platform.com/avatars/550e8400-full.jpg",
"thumbnailUrl": "https://cdn.iwm-platform.com/avatars/550e8400-thumb.jpg"
}
}DELETE /api/v1/users/me/avatar
Удаление текущего аватара.
Аутентификация: Обязательна
Лимит запросов: 100 запросов в минуту
Заголовки запроса
Authorization: Bearer <access_token>Тело запроса
Нет
Параметры запроса
Нет
Ответ (200 OK)
interface RemoveAvatarResponse {
message: string;
}Ответы с ошибками
| Статус | Код | Описание |
|---|---|---|
| 401 | UNAUTHORIZED | Недействительный или истекший access token |
| 404 | NO_AVATAR | Нет аватара для удаления |
Пример
Запрос:
curl -X DELETE https://api.iwm-platform.com/api/v1/users/me/avatar \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..."Ответ:
{
"success": true,
"data": {
"message": "Avatar removed successfully"
}
}GET /api/v1/users/me/kyc
Получение статуса и деталей KYC верификации.
Аутентификация: Обязательна
Лимит запросов: 100 запросов в минуту
Заголовки запроса
Authorization: Bearer <access_token>Тело запроса
Нет
Параметры запроса
Нет
Ответ (200 OK)
interface KycStatusResponse {
status: 'NOT_STARTED' | 'DOCUMENTS_PENDING' | 'SUBMITTED' | 'UNDER_REVIEW' | 'APPROVED' | 'REJECTED' | 'NEEDS_INFO';
level: 'NONE' | 'BASIC' | 'STANDARD' | 'ENHANCED';
submittedAt: string | null;
reviewedAt: string | null;
expiresAt: string | null;
rejectionReason: string | null;
requiredDocuments: {
type: string;
status: 'REQUIRED' | 'PENDING' | 'VERIFIED' | 'REJECTED';
rejectionReason: string | null;
}[];
limits: {
dailyWithdrawal: number;
monthlyWithdrawal: number;
singleTransaction: number;
};
}Ответы с ошибками
| Статус | Код | Описание |
|---|---|---|
| 401 | UNAUTHORIZED | Недействительный или истекший access token |
Пример
Запрос:
curl -X GET https://api.iwm-platform.com/api/v1/users/me/kyc \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..."Ответ:
{
"success": true,
"data": {
"status": "APPROVED",
"level": "STANDARD",
"submittedAt": "2024-01-10T14:00:00Z",
"reviewedAt": "2024-01-12T09:30:00Z",
"expiresAt": "2025-01-12T09:30:00Z",
"rejectionReason": null,
"requiredDocuments": [
{
"type": "PASSPORT",
"status": "VERIFIED",
"rejectionReason": null
},
{
"type": "SELFIE",
"status": "VERIFIED",
"rejectionReason": null
},
{
"type": "UTILITY_BILL",
"status": "REQUIRED",
"rejectionReason": null
}
],
"limits": {
"dailyWithdrawal": 100000,
"monthlyWithdrawal": 1000000,
"singleTransaction": 500000
}
}
}POST /api/v1/users/me/kyc
Отправка документов KYC для верификации.
Аутентификация: Обязательна
Лимит запросов: 5 запросов в день
Заголовки запроса
Authorization: Bearer <access_token>
Content-Type: multipart/form-dataТело запроса
// multipart/form-data
interface KycSubmissionRequest {
personalInfo: {
firstName: string;
lastName: string;
middleName?: string;
dateOfBirth: string; // YYYY-MM-DD
nationality: string; // ISO 3166-1 alpha-2
documentNumber: string;
documentType: 'PASSPORT' | 'ID_CARD' | 'DRIVER_LICENSE';
documentIssueDate: string; // YYYY-MM-DD
documentExpiryDate: string; // YYYY-MM-DD
address: {
country: string; // ISO 3166-1 alpha-2
region: string;
city: string;
street: string;
building: string;
apartment?: string;
postalCode: string;
};
};
documents: {
type: 'PASSPORT' | 'ID_CARD' | 'DRIVER_LICENSE' | 'UTILITY_BILL' | 'BANK_STATEMENT' | 'SELFIE';
file: File; // Файл изображения (JPEG, PNG, PDF для документов)
// Макс. размер: 10MB на файл
}[];
}Параметры запроса
Нет
Ответ (201 Created)
interface KycSubmissionResponse {
verificationId: string;
status: 'SUBMITTED';
estimatedReviewTime: string; // например, "24-48 hours"
documentsSubmitted: {
type: string;
status: 'PENDING';
}[];
}Ответы с ошибками
| Статус | Код | Описание |
|---|---|---|
| 400 | VALIDATION_ERROR | Неверные входные данные |
| 400 | MISSING_DOCUMENTS | Не предоставлены обязательные документы |
| 400 | INVALID_FILE_TYPE | Тип файла не поддерживается |
| 400 | FILE_TOO_LARGE | Файл превышает лимит 10MB |
| 401 | UNAUTHORIZED | Недействительный или истекший access token |
| 409 | KYC_PENDING | KYC верификация уже на рассмотрении |
| 409 | KYC_APPROVED | KYC уже одобрена для этого уровня |
| 429 | RATE_LIMIT_EXCEEDED | Слишком много попыток отправки |
Пример
Запрос:
curl -X POST https://api.iwm-platform.com/api/v1/users/me/kyc \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..." \
-F 'personalInfo={"firstName":"John","lastName":"Doe",...}' \
-F "documents[0][type]=PASSPORT" \
-F "documents[0][file]=@/path/to/passport.jpg" \
-F "documents[1][type]=SELFIE" \
-F "documents[1][file]=@/path/to/selfie.jpg"Ответ:
{
"success": true,
"data": {
"verificationId": "770e8400-e29b-41d4-a716-446655440000",
"status": "SUBMITTED",
"estimatedReviewTime": "24-48 hours",
"documentsSubmitted": [
{
"type": "PASSPORT",
"status": "PENDING"
},
{
"type": "SELFIE",
"status": "PENDING"
}
]
}
}GET /api/v1/users/me/notifications
Получение уведомлений пользователя.
Аутентификация: Обязательна
Лимит запросов: 100 запросов в минуту
Заголовки запроса
Authorization: Bearer <access_token>Тело запроса
Нет
Параметры запроса
| Параметр | Тип | Описание |
|---|---|---|
| page | number | Номер страницы (опционально) |
| pageSize | number | Элементов на странице, макс. 50 (опционально) |
| status | string | Фильтр по статусу: 'UNREAD', 'READ', 'ALL' (опционально) |
| type | string | Фильтр по типу (опционально) |
Ответ (200 OK)
interface NotificationsResponse {
notifications: Notification[];
unreadCount: number;
}
interface Notification {
id: string;
type: 'SYSTEM' | 'ORDER' | 'COMMISSION' | 'PAYOUT' | 'KYC' | 'SECURITY' | 'PROMO';
title: string;
message: string;
data: Record<string, unknown> | null;
isRead: boolean;
readAt: string | null;
createdAt: string;
}Ответы с ошибками
| Статус | Код | Описание |
|---|---|---|
| 401 | UNAUTHORIZED | Недействительный или истекший access token |
Пример
Запрос:
curl -X GET "https://api.iwm-platform.com/api/v1/users/me/notifications?status=UNREAD&page=1&pageSize=20" \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..."Ответ:
{
"success": true,
"data": {
"notifications": [
{
"id": "880e8400-e29b-41d4-a716-446655440000",
"type": "COMMISSION",
"title": "New Commission Received",
"message": "You earned 500 RUB commission from a referral purchase",
"data": {
"commissionId": "990e8400-e29b-41d4-a716-446655440000",
"amount": 500
},
"isRead": false,
"readAt": null,
"createdAt": "2024-01-15T14:30:00Z"
}
],
"unreadCount": 5
},
"meta": {
"pagination": {
"total": 25,
"page": 1,
"pageSize": 20,
"totalPages": 2,
"hasNext": true,
"hasPrevious": false
}
}
}PATCH /api/v1/users/me/notifications/preferences
Обновление настроек уведомлений.
Аутентификация: Обязательна
Лимит запросов: 100 запросов в минуту
Заголовки запроса
Authorization: Bearer <access_token>Тело запроса
interface NotificationPreferencesRequest {
email: {
orders?: boolean;
commissions?: boolean;
payouts?: boolean;
security?: boolean;
marketing?: boolean;
newsletter?: boolean;
};
push: {
orders?: boolean;
commissions?: boolean;
payouts?: boolean;
security?: boolean;
marketing?: boolean;
};
sms: {
security?: boolean; // OTP, уведомления о входе
payouts?: boolean; // Подтверждения выплат
};
}Параметры запроса
Нет
Ответ (200 OK)
interface NotificationPreferencesResponse {
email: {
orders: boolean;
commissions: boolean;
payouts: boolean;
security: boolean;
marketing: boolean;
newsletter: boolean;
};
push: {
orders: boolean;
commissions: boolean;
payouts: boolean;
security: boolean;
marketing: boolean;
};
sms: {
security: boolean;
payouts: boolean;
};
updatedAt: string;
}Ответы с ошибками
| Статус | Код | Описание |
|---|---|---|
| 400 | VALIDATION_ERROR | Неверный формат настроек |
| 401 | UNAUTHORIZED | Недействительный или истекший access token |
Пример
Запрос:
curl -X PATCH https://api.iwm-platform.com/api/v1/users/me/notifications/preferences \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..." \
-H "Content-Type: application/json" \
-d '{
"email": {
"marketing": false,
"newsletter": false
},
"push": {
"marketing": false
}
}'Ответ:
{
"success": true,
"data": {
"email": {
"orders": true,
"commissions": true,
"payouts": true,
"security": true,
"marketing": false,
"newsletter": false
},
"push": {
"orders": true,
"commissions": true,
"payouts": true,
"security": true,
"marketing": false
},
"sms": {
"security": true,
"payouts": true
},
"updatedAt": "2024-01-15T15:30:00Z"
}
}GET /api/v1/users/me/addresses
Получение списка сохраненных адресов.
Аутентификация: Обязательна
Лимит запросов: 100 запросов в минуту
Заголовки запроса
Authorization: Bearer <access_token>Тело запроса
Нет
Параметры запроса
Нет
Ответ (200 OK)
interface AddressesResponse {
addresses: Address[];
}
interface Address {
id: string;
label: string; // например, "Дом", "Офис"
isDefault: boolean;
country: string; // ISO 3166-1 alpha-2
region: string;
city: string;
street: string;
building: string;
apartment: string | null;
postalCode: string;
phone: string | null;
recipientName: string | null;
createdAt: string;
updatedAt: string;
}Ответы с ошибками
| Статус | Код | Описание |
|---|---|---|
| 401 | UNAUTHORIZED | Недействительный или истекший access token |
Пример
Запрос:
curl -X GET https://api.iwm-platform.com/api/v1/users/me/addresses \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..."Ответ:
{
"success": true,
"data": {
"addresses": [
{
"id": "aa0e8400-e29b-41d4-a716-446655440000",
"label": "Home",
"isDefault": true,
"country": "RU",
"region": "Moscow Oblast",
"city": "Moscow",
"street": "Tverskaya",
"building": "15",
"apartment": "42",
"postalCode": "125009",
"phone": "+79991234567",
"recipientName": "John Doe",
"createdAt": "2024-01-10T10:00:00Z",
"updatedAt": "2024-01-10T10:00:00Z"
}
]
}
}POST /api/v1/users/me/addresses
Добавление нового адреса.
Аутентификация: Обязательна
Лимит запросов: 100 запросов в минуту
Заголовки запроса
Authorization: Bearer <access_token>Тело запроса
interface CreateAddressRequest {
label: string; // например, "Дом", "Офис"
isDefault?: boolean; // Если true, устанавливается как адрес по умолчанию
country: string; // ISO 3166-1 alpha-2
region: string;
city: string;
street: string;
building: string;
apartment?: string;
postalCode: string;
phone?: string;
recipientName?: string;
}Параметры запроса
Нет
Ответ (201 Created)
interface CreateAddressResponse {
id: string;
label: string;
isDefault: boolean;
country: string;
region: string;
city: string;
street: string;
building: string;
apartment: string | null;
postalCode: string;
phone: string | null;
recipientName: string | null;
createdAt: string;
updatedAt: string;
}Ответы с ошибками
| Статус | Код | Описание |
|---|---|---|
| 400 | VALIDATION_ERROR | Неверные входные данные |
| 401 | UNAUTHORIZED | Недействительный или истекший access token |
| 400 | MAX_ADDRESSES_REACHED | Максимум 10 адресов разрешено |
Пример
Запрос:
curl -X POST https://api.iwm-platform.com/api/v1/users/me/addresses \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..." \
-H "Content-Type: application/json" \
-d '{
"label": "Office",
"isDefault": false,
"country": "RU",
"region": "Moscow Oblast",
"city": "Moscow",
"street": "Arbat",
"building": "25",
"apartment": "100",
"postalCode": "119002",
"phone": "+79999876543",
"recipientName": "John Doe"
}'Ответ:
{
"success": true,
"data": {
"id": "bb0e8400-e29b-41d4-a716-446655440000",
"label": "Office",
"isDefault": false,
"country": "RU",
"region": "Moscow Oblast",
"city": "Moscow",
"street": "Arbat",
"building": "25",
"apartment": "100",
"postalCode": "119002",
"phone": "+79999876543",
"recipientName": "John Doe",
"createdAt": "2024-01-15T16:00:00Z",
"updatedAt": "2024-01-15T16:00:00Z"
}
}PATCH /api/v1/users/me/addresses/:id
Обновление существующего адреса.
Аутентификация: Обязательна
Лимит запросов: 100 запросов в минуту
Заголовки запроса
Authorization: Bearer <access_token>Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
| id | string (UUID) | ID адреса |
Тело запроса
interface UpdateAddressRequest {
label?: string;
isDefault?: boolean;
country?: string;
region?: string;
city?: string;
street?: string;
building?: string;
apartment?: string | null;
postalCode?: string;
phone?: string | null;
recipientName?: string | null;
}Параметры запроса
Нет
Ответ (200 OK)
interface UpdateAddressResponse {
id: string;
label: string;
isDefault: boolean;
country: string;
region: string;
city: string;
street: string;
building: string;
apartment: string | null;
postalCode: string;
phone: string | null;
recipientName: string | null;
createdAt: string;
updatedAt: string;
}Ответы с ошибками
| Статус | Код | Описание |
|---|---|---|
| 400 | VALIDATION_ERROR | Неверные входные данные |
| 401 | UNAUTHORIZED | Недействительный или истекший access token |
| 404 | ADDRESS_NOT_FOUND | Адрес не найден |
Пример
Запрос:
curl -X PATCH https://api.iwm-platform.com/api/v1/users/me/addresses/bb0e8400-e29b-41d4-a716-446655440000 \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..." \
-H "Content-Type: application/json" \
-d '{
"isDefault": true,
"apartment": "101"
}'Ответ:
{
"success": true,
"data": {
"id": "bb0e8400-e29b-41d4-a716-446655440000",
"label": "Office",
"isDefault": true,
"country": "RU",
"region": "Moscow Oblast",
"city": "Moscow",
"street": "Arbat",
"building": "25",
"apartment": "101",
"postalCode": "119002",
"phone": "+79999876543",
"recipientName": "John Doe",
"createdAt": "2024-01-15T16:00:00Z",
"updatedAt": "2024-01-15T16:30:00Z"
}
}DELETE /api/v1/users/me/addresses/:id
Удаление адреса.
Аутентификация: Обязательна
Лимит запросов: 100 запросов в минуту
Заголовки запроса
Authorization: Bearer <access_token>Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
| id | string (UUID) | ID адреса |
Тело запроса
Нет
Параметры запроса
Нет
Ответ (200 OK)
interface DeleteAddressResponse {
message: string;
addressId: string;
}Ответы с ошибками
| Статус | Код | Описание |
|---|---|---|
| 401 | UNAUTHORIZED | Недействительный или истекший access token |
| 404 | ADDRESS_NOT_FOUND | Адрес не найден |
| 400 | CANNOT_DELETE_DEFAULT | Нельзя удалить адрес по умолчанию при наличии других адресов |
Пример
Запрос:
curl -X DELETE https://api.iwm-platform.com/api/v1/users/me/addresses/bb0e8400-e29b-41d4-a716-446655440000 \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..."Ответ:
{
"success": true,
"data": {
"message": "Address deleted successfully",
"addressId": "bb0e8400-e29b-41d4-a716-446655440000"
}
}