Admin Withdrawal Management Endpoints¶
Аудитория: разработчики, разработчики админских панелей Последнее обновление: 2025-11-17 Краткое содержание: Детальная документация Admin Withdrawal Management endpoints — список выводов, одобрение/отклонение/исполнение ожидающих запросов, управление жизненным циклом выводов. Полное руководство по интеграции для admin withdrawal операций.
Обзор Endpoints¶
| Метод | Endpoint | Описание | Auth Required | Permission |
|---|---|---|---|---|
| GET | /api/admin/withdrawals |
Список всех выводов | ✅ Admin | withdrawals:read |
| GET | /api/admin/withdrawals/pending |
Ожидающие выводы | ✅ Admin | withdrawals:read |
| GET | /api/admin/withdrawals/:id |
Детали вывода | ✅ Admin | withdrawals:read |
| PUT | /api/admin/withdrawals/:id/approve |
Одобрить вывод | ✅ Admin | withdrawals:approve |
| PUT | /api/admin/withdrawals/:id/execute |
Исполнить вывод | ✅ Admin | withdrawals:approve |
| PUT | /api/admin/withdrawals/:id/reject |
Отклонить вывод | ✅ Admin | withdrawals:approve |
💸 GET /api/admin/withdrawals¶
Получить постраничный список всех выводов платформы с фильтрацией и сортировкой.
Запрос¶
GET /api/admin/withdrawals?page=1&limit=50&status=pending&userId=user_123abc&minAmount=1000
Authorization: Bearer <admin_jwt_token>
Заголовки:
| Заголовок | Значение | Обязательно | Описание |
|---|---|---|---|
Authorization |
Bearer <admin_token> |
✅ Да | Admin JWT токен |
Query параметры:
| Параметр | Тип | Обязательно | Описание | По умолчанию |
|---|---|---|---|---|
page |
number | ❌ Нет | Номер страницы (начинается с 1) | 1 |
limit |
number | ❌ Нет | Элементов на странице (макс: 100) | 50 |
status |
string | ❌ Нет | Фильтр по статусу: pending, approved, processing, completed, failed, rejected, cancelled |
Все |
userId |
string | ❌ Нет | Фильтр по user ID | Все |
minAmount |
string | ❌ Нет | Фильтр минимальной суммы вывода | - |
sortBy |
string | ❌ Нет | Поле сортировки: createdAt, amount, completedAt |
createdAt |
orderBy |
string | ❌ Нет | Порядок сортировки: asc, desc |
desc |
createdAfter |
string | ❌ Нет | Фильтр выводов после даты (ISO 8601) | - |
Ответ¶
Успех (200 OK):
{
"success": true,
"data": [
{
"id": "wdr_abc123",
"userId": "user_123abc",
"userEmail": "john@example.com",
"walletAddress": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0",
"amount": "1000.00",
"currency": "USDC",
"destinationAddress": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0",
"source": "available",
"status": "completed",
"gasFee": "0.005 ETH",
"txHash": "0xabcd1234...",
"createdAt": "2025-10-02T10:00:00Z",
"approvedAt": "2025-10-02T10:05:00Z",
"approvedBy": "admin_456def",
"executedAt": "2025-10-02T10:10:00Z",
"completedAt": "2025-10-02T10:15:00Z",
"note": null
},
{
"id": "wdr_def456",
"userId": "user_456def",
"userEmail": "jane@example.com",
"walletAddress": "0x8ba1f109551bD432803012645Ac136ddd64DBA72",
"amount": "500.00",
"currency": "USDC",
"destinationAddress": "0x8ba1f109551bD432803012645Ac136ddd64DBA72",
"source": "available",
"status": "pending",
"gasFee": "0.005 ETH",
"txHash": null,
"createdAt": "2025-10-03T11:00:00Z",
"approvedAt": null,
"approvedBy": null,
"executedAt": null,
"completedAt": null,
"note": "User requested withdrawal to personal wallet"
}
],
"summary": {
"totalWithdrawals": 450,
"totalWithdrawnValue": "2500000.00",
"pendingWithdrawals": 12,
"pendingValue": "8500.00",
"completedToday": 45,
"completedTodayValue": "125000.00",
"averageWithdrawal": "5555.56",
"averageProcessingTime": "15 minutes"
},
"pagination": {
"page": 1,
"limit": 50,
"total": 450,
"totalPages": 9,
"hasNext": true,
"hasPrevious": false
},
"timestamp": "2025-10-03T12:34:56Z"
}
Поля ответа:
| Поле | Тип | Описание |
|---|---|---|
data[].source |
string | Источник вывода: available, investment |
data[].gasFee |
string | Оценочная комиссия blockchain gas |
data[].txHash |
string | On-chain transaction hash (null если не исполнен) |
summary.totalWithdrawnValue |
string | Общая выведенная сумма за всё время |
summary.pendingValue |
string | Общая сумма ожидающих выводов |
summary.averageProcessingTime |
string | Среднее время завершения вывода |
Ошибки:
| Код статуса | Код ошибки | Описание |
|---|---|---|
| 401 | TOKEN_EXPIRED |
Admin JWT токен истёк |
| 403 | PERMISSION_DENIED |
Недостаточно разрешений (требуется withdrawals:read) |
| 400 | INVALID_PAGINATION |
Невалидные page или limit |
Пример cURL¶
ADMIN_TOKEN="eyJhbGciOiJIUzI1NiIs..."
# Получить все ожидающие выводы
curl -X GET "https://app.saga.surf/api/admin/withdrawals?status=pending" \
-H "Authorization: Bearer $ADMIN_TOKEN"
# Крупные выводы (> $5K)
curl -X GET "https://app.saga.surf/api/admin/withdrawals?minAmount=5000&sortBy=amount&orderBy=desc" \
-H "Authorization: Bearer $ADMIN_TOKEN"
# Выводы конкретного пользователя
curl -X GET "https://app.saga.surf/api/admin/withdrawals?userId=user_123abc" \
-H "Authorization: Bearer $ADMIN_TOKEN"
Пример TypeScript¶
const fetchAllWithdrawals = async (filters = {}) => {
const params = new URLSearchParams({
page: '1',
limit: '50',
...filters
});
const response = await fetch(`/api/admin/withdrawals?${params}`, {
headers: {
'Authorization': `Bearer ${adminToken}`
}
});
const { data: withdrawals, summary, pagination } = await response.json();
console.log('Platform Withdrawal Summary:');
console.log(' Total Withdrawals:', summary.totalWithdrawals);
console.log(' Total Value: $', summary.totalWithdrawnValue);
console.log(' Pending:', summary.pendingWithdrawals, '($' + summary.pendingValue + ')');
console.log(' Avg Processing:', summary.averageProcessingTime);
withdrawals.forEach(wdr => {
console.log(`\n${wdr.userEmail}`);
console.log(` Amount: $${wdr.amount} (${wdr.status})`);
console.log(` Destination: ${wdr.destinationAddress}`);
console.log(` Gas Fee: ${wdr.gasFee}`);
if (wdr.txHash) console.log(` TX: ${wdr.txHash}`);
});
return { withdrawals, summary, pagination };
};
⏳ GET /api/admin/withdrawals/pending¶
Получить список выводов ожидающих одобрения админа.
Запрос¶
GET /api/admin/withdrawals/pending?sortBy=createdAt&orderBy=asc
Authorization: Bearer <admin_jwt_token>
Query параметры:
| Параметр | Тип | Обязательно | Описание | По умолчанию |
|---|---|---|---|---|
sortBy |
string | ❌ Нет | Поле сортировки: createdAt, amount |
createdAt |
orderBy |
string | ❌ Нет | Порядок сортировки: asc, desc |
asc |
Ответ¶
Успех (200 OK):
{
"success": true,
"data": [
{
"id": "wdr_pending_001",
"userId": "user_789ghi",
"userEmail": "alice@example.com",
"walletAddress": "0x95222290DD7278Aa3Ddd389Cc1E1d165CC4BAfe5",
"amount": "3000.00",
"currency": "USDC",
"destinationAddress": "0x95222290DD7278Aa3Ddd389Cc1E1d165CC4BAfe5",
"source": "available",
"gasFee": "0.005 ETH",
"createdAt": "2025-10-03T09:00:00Z",
"limits": {
"dailyLimit": "10000.00",
"usedToday": "3000.00",
"remainingToday": "7000.00"
},
"userBalance": {
"available": "5000.00",
"invested": "2000.00"
},
"complianceChecks": {
"kycStatus": "not_required",
"amlChecks": "passed",
"sanctionsList": "clear",
"riskLevel": "low"
}
},
{
"id": "wdr_pending_002",
"userId": "user_101jkl",
"userEmail": "bob@example.com",
"walletAddress": "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC",
"amount": "1500.00",
"currency": "USDC",
"destinationAddress": "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC",
"source": "available",
"gasFee": "0.005 ETH",
"createdAt": "2025-10-03T10:30:00Z",
"limits": {
"dailyLimit": "10000.00",
"usedToday": "1500.00",
"remainingToday": "8500.00"
},
"userBalance": {
"available": "3000.00",
"invested": "1000.00"
},
"complianceChecks": {
"kycStatus": "not_required",
"amlChecks": "passed",
"sanctionsList": "clear",
"riskLevel": "low"
}
}
],
"summary": {
"totalPending": 12,
"totalPendingValue": "8500.00",
"oldestPending": "2025-10-02T14:00:00Z",
"averageWaitTime": "3.5 hours"
},
"timestamp": "2025-10-03T12:34:56Z"
}
Поля ответа:
| Поле | Тип | Описание |
|---|---|---|
data[].limits |
object | Дневные лимиты вывода пользователя |
data[].userBalance |
object | Текущий баланс пользователя breakdown |
data[].complianceChecks |
object | Статус KYC/AML соответствия |
summary.totalPending |
number | Общее количество ожидающих выводов |
summary.totalPendingValue |
string | Общая ожидающая сумма |
Ошибки:
| Код статуса | Код ошибки | Описание |
|---|---|---|
| 403 | PERMISSION_DENIED |
Недостаточно разрешений |
Пример cURL¶
ADMIN_TOKEN="eyJhbGciOiJIUzI1NiIs..."
curl -X GET https://app.saga.surf/api/admin/withdrawals/pending \
-H "Authorization: Bearer $ADMIN_TOKEN"
Пример TypeScript¶
const fetchPendingWithdrawals = async () => {
const response = await fetch('/api/admin/withdrawals/pending', {
headers: {
'Authorization': `Bearer ${adminToken}`
}
});
const { data: pending, summary } = await response.json();
console.log('🔔 Pending Withdrawal Approvals:');
console.log(` Total: ${summary.totalPending}`);
console.log(` Value: $${summary.totalPendingValue}`);
console.log(` Avg Wait: ${summary.averageWaitTime}`);
pending.forEach(wdr => {
console.log(`\n📋 ${wdr.id}`);
console.log(` User: ${wdr.userEmail}`);
console.log(` Amount: $${wdr.amount}`);
console.log(` Balance: $${wdr.userBalance.available} available`);
console.log(` Daily Limit: $${wdr.limits.remainingToday} remaining`);
console.log(` Compliance: ${wdr.complianceChecks.amlChecks}`);
});
return { pending, summary };
};
GET /api/admin/withdrawals/:id¶
Получить детальную информацию о конкретном выводе.
Запрос¶
Path параметры:
| Параметр | Тип | Обязательно | Описание |
|---|---|---|---|
id |
string | ✅ Да | ID вывода (например, wdr_abc123) |
Ответ¶
Успех (200 OK):
{
"success": true,
"data": {
"id": "wdr_abc123",
"userId": "user_123abc",
"user": {
"id": "user_123abc",
"email": "john@example.com",
"walletAddress": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0",
"verificationStatus": "verified",
"accountCreated": "2025-09-01T10:00:00Z"
},
"withdrawal": {
"amount": "1000.00",
"currency": "USDC",
"destinationAddress": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0",
"source": "available",
"gasFee": "0.005 ETH",
"netAmount": "999.95",
"note": "Withdrawal to personal wallet"
},
"limits": {
"dailyLimit": "10000.00",
"usedToday": "1000.00",
"remainingToday": "9000.00",
"lifetimeWithdrawn": "5000.00"
},
"status": "completed",
"lifecycle": {
"createdAt": "2025-10-02T10:00:00Z",
"approvedAt": "2025-10-02T10:05:00Z",
"approvedBy": "admin_456def",
"executedAt": "2025-10-02T10:10:00Z",
"completedAt": "2025-10-02T10:15:00Z",
"processingTime": "15 minutes"
},
"blockchain": {
"txHash": "0xabcd1234...",
"blockNumber": 12345678,
"confirmations": 25,
"gasUsed": "21000",
"effectiveGasPrice": "0.000000025 ETH",
"networkFee": "0.000525 ETH"
},
"complianceInfo": {
"kycStatus": "not_required",
"amlChecks": "passed",
"sanctionsList": "clear",
"riskLevel": "low",
"lastChecked": "2025-10-02T10:00:00Z"
},
"auditTrail": [
{
"action": "created",
"timestamp": "2025-10-02T10:00:00Z",
"actor": "user_123abc",
"details": "Withdrawal request created"
},
{
"action": "approved",
"timestamp": "2025-10-02T10:05:00Z",
"actor": "admin_456def",
"details": "Withdrawal approved by admin"
},
{
"action": "executed",
"timestamp": "2025-10-02T10:10:00Z",
"actor": "system",
"details": "Blockchain transaction submitted"
},
{
"action": "completed",
"timestamp": "2025-10-02T10:15:00Z",
"actor": "system",
"details": "Transaction confirmed on blockchain"
}
]
},
"timestamp": "2025-10-03T12:34:56Z"
}
Поля ответа:
| Поле | Тип | Описание |
|---|---|---|
data.limits |
object | Лимиты вывода пользователя и использование |
data.blockchain |
object | Детали on-chain транзакции |
data.complianceInfo |
object | Детали проверки соответствия |
data.auditTrail |
array | Полный audit trail жизненного цикла |
Ошибки:
| Код статуса | Код ошибки | Описание |
|---|---|---|
| 403 | PERMISSION_DENIED |
Недостаточно разрешений |
| 404 | WITHDRAWAL_NOT_FOUND |
ID вывода не существует |
Пример cURL¶
ADMIN_TOKEN="eyJhbGciOiJIUzI1NiIs..."
curl -X GET https://app.saga.surf/api/admin/withdrawals/wdr_abc123 \
-H "Authorization: Bearer $ADMIN_TOKEN"
PUT /api/admin/withdrawals/:id/approve¶
Одобрить ожидающий вывод (не исполняет - требует отдельного исполнения).
Запрос¶
PUT /api/admin/withdrawals/wdr_pending_001/approve
Authorization: Bearer <admin_jwt_token>
Content-Type: application/json
{
"note": "User balance verified, compliance checks passed",
"notifyUser": true
}
Схема тела запроса:
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
note |
string | ❌ Нет | Заметка об одобрении админа (внутренняя) |
notifyUser |
boolean | ❌ Нет | Отправить email уведомление (по умолчанию: true) |
Ответ¶
Успех (200 OK):
{
"success": true,
"data": {
"withdrawalId": "wdr_pending_001",
"status": "approved",
"approvedAt": "2025-10-03T12:34:56Z",
"approvedBy": "admin_456def",
"amount": "3000.00",
"destinationAddress": "0x95222290DD7278Aa3Ddd389Cc1E1d165CC4BAfe5",
"estimatedGasFee": "0.005 ETH",
"expectedExecutionTime": "Within 5 minutes",
"user": {
"email": "alice@example.com",
"notified": true
}
},
"timestamp": "2025-10-03T12:34:56Z"
}
Поля ответа:
| Поле | Тип | Описание |
|---|---|---|
data.estimatedGasFee |
string | Оценочная комиссия blockchain gas |
data.expectedExecutionTime |
string | Ожидаемое время исполнения |
data.user.notified |
boolean | Статус отправки email уведомления |
Ошибки:
| Код статуса | Код ошибки | Описание |
|---|---|---|
| 400 | INVALID_STATUS |
Вывод не в статусе pending |
| 403 | PERMISSION_DENIED |
Недостаточно разрешений (требуется withdrawals:approve) |
| 404 | WITHDRAWAL_NOT_FOUND |
ID вывода не существует |
| 422 | INSUFFICIENT_BALANCE |
Недостаточный баланс пользователя |
| 422 | DAILY_LIMIT_EXCEEDED |
Превышен дневной лимит вывода |
Пример cURL¶
ADMIN_TOKEN="eyJhbGciOiJIUzI1NiIs..."
curl -X PUT https://app.saga.surf/api/admin/withdrawals/wdr_pending_001/approve \
-H "Authorization: Bearer $ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"note": "User balance verified, compliance checks passed",
"notifyUser": true
}'
Пример TypeScript¶
const approveWithdrawal = async (withdrawalId: string, note?: string) => {
const response = await fetch(`/api/admin/withdrawals/${withdrawalId}/approve`, {
method: 'PUT',
headers: {
'Authorization': `Bearer ${adminToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
note,
notifyUser: true
})
});
if (!response.ok) {
const error = await response.json();
throw new Error(error.error.message);
}
const { data } = await response.json();
console.log('✅ Withdrawal Approved:');
console.log(` Withdrawal ID: ${data.withdrawalId}`);
console.log(` Status: ${data.status}`);
console.log(` Amount: $${data.amount}`);
console.log(` Destination: ${data.destinationAddress}`);
console.log(` Approved By: ${data.approvedBy}`);
console.log(` Gas Fee: ${data.estimatedGasFee}`);
console.log(` Expected Execution: ${data.expectedExecutionTime}`);
console.log(`\n📧 User notified: ${data.user.notified}`);
return data;
};
// Usage
await approveWithdrawal('wdr_pending_001', 'Balance verified');
PUT /api/admin/withdrawals/:id/execute¶
Исполнить одобренный вывод на blockchain.
Запрос¶
PUT /api/admin/withdrawals/wdr_pending_001/execute
Authorization: Bearer <admin_jwt_token>
Content-Type: application/json
{
"gasLimit": 100000,
"priorityFee": "normal"
}
Схема тела запроса:
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
gasLimit |
number | ❌ Нет | Пользовательский gas limit (по умолчанию: auto-estimate) |
priorityFee |
string | ❌ Нет | Приоритет: low, normal, high (по умолчанию: normal) |
Ответ¶
Успех (200 OK):
{
"success": true,
"data": {
"withdrawalId": "wdr_pending_001",
"status": "processing",
"executedAt": "2025-10-03T12:34:56Z",
"executedBy": "admin_456def",
"blockchain": {
"txHash": "0xabcd1234...",
"from": "0xHotWalletAddress...",
"to": "0x95222290DD7278Aa3Ddd389Cc1E1d165CC4BAfe5",
"amount": "3000.00",
"gasLimit": 100000,
"gasPrice": "0.000000025 ETH",
"estimatedGasFee": "0.0025 ETH",
"network": "mainnet",
"explorerUrl": "https://etherscan.io/tx/0xabcd1234..."
},
"expectedCompletionAt": "2025-10-03T12:40:00Z",
"user": {
"email": "alice@example.com",
"notified": true
}
},
"timestamp": "2025-10-03T12:34:56Z"
}
Поля ответа:
| Поле | Тип | Описание |
|---|---|---|
data.blockchain.txHash |
string | On-chain transaction hash |
data.blockchain.explorerUrl |
string | URL blockchain explorer |
data.expectedCompletionAt |
string | Ожидаемая временная метка завершения |
Ошибки:
| Код статуса | Код ошибки | Описание |
|---|---|---|
| 400 | INVALID_STATUS |
Вывод не в статусе approved |
| 403 | PERMISSION_DENIED |
Недостаточно разрешений (требуется withdrawals:approve) |
| 404 | WITHDRAWAL_NOT_FOUND |
ID вывода не существует |
| 422 | BLOCKCHAIN_ERROR |
Blockchain транзакция провалилась |
| 422 | GAS_ESTIMATION_FAILED |
Невозможно оценить gas |
| 503 | BLOCKCHAIN_UNAVAILABLE |
Blockchain нода недоступна |
Пример cURL¶
ADMIN_TOKEN="eyJhbGciOiJIUzI1NiIs..."
curl -X PUT https://app.saga.surf/api/admin/withdrawals/wdr_pending_001/execute \
-H "Authorization: Bearer $ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"gasLimit": 100000,
"priorityFee": "normal"
}'
Пример TypeScript¶
const executeWithdrawal = async (
withdrawalId: string,
options?: { gasLimit?: number; priorityFee?: 'low' | 'normal' | 'high' }
) => {
const response = await fetch(`/api/admin/withdrawals/${withdrawalId}/execute`, {
method: 'PUT',
headers: {
'Authorization': `Bearer ${adminToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify(options || {})
});
if (!response.ok) {
const error = await response.json();
throw new Error(error.error.message);
}
const { data } = await response.json();
console.log('🚀 Withdrawal Executed:');
console.log(` Withdrawal ID: ${data.withdrawalId}`);
console.log(` Status: ${data.status}`);
console.log(` TX Hash: ${data.blockchain.txHash}`);
console.log(` Explorer: ${data.blockchain.explorerUrl}`);
console.log('\n⛽ Gas Details:');
console.log(` Limit: ${data.blockchain.gasLimit}`);
console.log(` Price: ${data.blockchain.gasPrice}`);
console.log(` Estimated Fee: ${data.blockchain.estimatedGasFee}`);
console.log(`\n⏱️ Expected Completion: ${data.expectedCompletionAt}`);
console.log(`📧 User notified: ${data.user.notified}`);
return data;
};
// Usage
await executeWithdrawal('wdr_pending_001', { priorityFee: 'high' });
PUT /api/admin/withdrawals/:id/reject¶
Отклонить ожидающий вывод с указанием причины.
Запрос¶
PUT /api/admin/withdrawals/wdr_pending_002/reject
Authorization: Bearer <admin_jwt_token>
Content-Type: application/json
{
"reason": "Suspicious activity detected, compliance review required",
"notifyUser": true
}
Схема тела запроса:
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
reason |
string | ✅ Да | Причина отклонения (видна пользователю) |
notifyUser |
boolean | ❌ Нет | Отправить email уведомление (по умолчанию: true) |
Ответ¶
Успех (200 OK):
{
"success": true,
"data": {
"withdrawalId": "wdr_pending_002",
"status": "rejected",
"rejectedAt": "2025-10-03T12:34:56Z",
"rejectedBy": "admin_456def",
"reason": "Suspicious activity detected, compliance review required",
"amount": "1500.00",
"refundedToBalance": true,
"user": {
"email": "bob@example.com",
"notified": true,
"newBalance": {
"available": "3000.00",
"invested": "1000.00"
}
}
},
"timestamp": "2025-10-03T12:34:56Z"
}
Поля ответа:
| Поле | Тип | Описание |
|---|---|---|
data.refundedToBalance |
boolean | Сумма возвращена на баланс пользователя |
data.user.newBalance |
object | Обновленный баланс пользователя после возврата |
data.reason |
string | Причина отклонения (видна пользователю) |
Ошибки:
| Код статуса | Код ошибки | Описание |
|---|---|---|
| 400 | INVALID_STATUS |
Вывод не в статусе pending/approved |
| 400 | REASON_REQUIRED |
Причина отклонения обязательна |
| 403 | PERMISSION_DENIED |
Недостаточно разрешений (требуется withdrawals:approve) |
| 404 | WITHDRAWAL_NOT_FOUND |
ID вывода не существует |
Пример cURL¶
ADMIN_TOKEN="eyJhbGciOiJIUzI1NiIs..."
curl -X PUT https://app.saga.surf/api/admin/withdrawals/wdr_pending_002/reject \
-H "Authorization: Bearer $ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"reason": "Suspicious activity detected, compliance review required",
"notifyUser": true
}'
Пример TypeScript¶
const rejectWithdrawal = async (withdrawalId: string, reason: string) => {
const response = await fetch(`/api/admin/withdrawals/${withdrawalId}/reject`, {
method: 'PUT',
headers: {
'Authorization': `Bearer ${adminToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
reason,
notifyUser: true
})
});
if (!response.ok) {
const error = await response.json();
throw new Error(error.error.message);
}
const { data } = await response.json();
console.log('❌ Withdrawal Rejected:');
console.log(` Withdrawal ID: ${data.withdrawalId}`);
console.log(` Rejected By: ${data.rejectedBy}`);
console.log(` Reason: ${data.reason}`);
console.log('\n💰 Refund:');
console.log(` Amount: $${data.amount}`);
console.log(` Refunded to Balance: ${data.refundedToBalance}`);
console.log(` New Balance: $${data.user.newBalance.available}`);
console.log(`\n📧 User notified: ${data.user.notified}`);
return data;
};
// Usage
await rejectWithdrawal(
'wdr_pending_002',
'Suspicious activity detected, compliance review required'
);
Связанная документация¶
Другие Admin Endpoints:
- Admin Auth - Админская аутентификация
- Admin Users - Управление пользователями
- Admin Investments - Управление инвестициями
- Admin Dashboard - Метрики панели управления
User Endpoints:
- User Withdrawals - Пользовательские операции вывода
- User Balance - Баланс и транзакции
Архитектура:
- Withdrawal Lifecycle - Жизненный цикл вывода
- Admin Approval Process - Workflow одобрения
- Blockchain Integration - On-chain исполнение
📋 Метаданные¶
Версия: 2.6.268
Обновлено: 2025-10-21
Статус: Published