Обзор
Заявки на выплаты (direction: "out") позволяют отправлять USDT клиентам на их криптокошельки для возвратов, вывода средств или выплаты вознаграждений. При создании заявки система проверяет баланс мерчанта и создает задачу на выплату для трейдеров.
Время жизни: Заявка действительна 5 часов. После истечения средства возвращаются на баланс мерчанта.
Создание заявки
Endpoint для создания заявки на выплату:POST https://api.meridian.vip/api/v1/invoices
Обязательные параметры
| Параметр | Тип | Описание |
|---|---|---|
internalId | string | Уникальный идентификатор заявки в вашей системе для защиты от дубликатов. Используется для идемпотентности - повторные запросы с тем же internalId вернут существующую заявку. Пример: "order-12345", "payment-uuid-123" |
direction | string | Направление платежа. Для выплат используйте "out". Допустимые значения: "in" (входящий), "out" (исходящий) |
amount | number | Сумма платежа в рублях (НЕ в копейках). Примеры: 1000 = 1000 RUB |
currency | string | Код валюты ISO 4217. Пока доступно: "RUB" |
paymentRequisites | object|string | Обязательно для выплат! Реквизиты получателя платежа (клиента). Можно передать как объект или JSON-строку. Обязательные поля: • fullName (string) - ФИО получателя• cardNumber (string) - номер карты ИЛИ phoneNumber (string) - телефон для СБП ИЛИ accountNumber (string) - номер банковского счёта (10-34 цифры)Для paymentMethod="TO_ACCOUNT" поле accountNumber обязательно — карта и телефон не позволяют адресовать банковский счёт.Примеры: • Для карты: {"fullName": "Иван Иванов", "cardNumber": "1234567890123456"}• Для СБП: {"fullName": "Иван Иванов", "phoneNumber": "+79001234567"}• Для перевода по счёту: {"fullName": "Иван Иванов", "accountNumber": "40817810123456789012"} |
paymentMethod | string | Обязательно для выплат! Метод платежа: "SBP" (Система быстрых платежей, рекомендуется), "TO_CARD" (перевод на карту), "TO_ACCOUNT" (перевод по номеру счёта — требует paymentRequisites.accountNumber) |
paymentOption | string | Обязательно для выплат! Банк для платежа (зависит от доступности реквизитов): "sberbank", "tinkoff", "alfa", "vtb", "raiffeisen" |
notificationUrl | string | URL для webhook уведомлений о смене статуса заявки. Требования: валидный HTTPS URL. Пример: "https://your-site.com/webhooks/meridian" |
notificationToken | string | Секретный токен для HMAC-SHA256 подписи webhook. Требования: 32-255 символов |
Пример запроса
const crypto = require('crypto');
// Функция для расчета подписи
function calculateSignature(method, url, body, secret) {
const stringToSign = method + url + (body || '');
const hmac = crypto.createHmac('sha256', secret);
hmac.update(stringToSign);
return hmac.digest('base64');
}
// Данные заявки
const method = 'POST';
const url = 'https://api.meridian.vip/api/v1/invoices';
const body = JSON.stringify({
internalId: 'payout-12345',
direction: 'out',
amount: 1000,
currency: 'RUB',
// Реквизиты получателя (клиента) - ОБЯЗАТЕЛЬНО для выплат
// Вариант 1: Перевод на карту
paymentRequisites: {
fullName: 'Иван Иванов',
cardNumber: '1234567890123456'
},
// ИЛИ Вариант 2: СБП (используйте номер телефона):
// paymentRequisites: {
// fullName: 'Иван Иванов',
// phoneNumber: '+79001234567'
// },
paymentMethod: 'TO_CARD',
paymentOption: 'sberbank',
notificationUrl: 'https://your-site.com/webhooks/meridian',
notificationToken: 'your-secret-webhook-token-min-32-chars'
});
// Ваш API ключ
const apiKey = 'luma_abc123...:luma_xyz789...';
const [keyId, secret] = apiKey.split(':');
const signature = calculateSignature(method, url, body, secret);
// Отправка запроса
const response = await fetch(url, {
method,
headers: {
'Content-Type': 'application/json',
'X-API-Key': apiKey,
'X-Signature': signature
},
body
});
const result = await response.json();
console.log(result);
import hmac
import hashlib
import base64
import requests
import json
# Функция для расчета подписи
def calculate_signature(method, url, body, secret):
string_to_sign = method + url + (body or '')
signature = hmac.new(
secret.encode('utf-8'),
string_to_sign.encode('utf-8'),
hashlib.sha256
).digest()
return base64.b64encode(signature).decode('utf-8')
# Данные заявки
method = 'POST'
url = 'https://api.meridian.vip/api/v1/invoices'
body = json.dumps({
'internalId': 'payout-12345',
'direction': 'out',
'amount': 1000, # 1000 RUB (в рублях, НЕ в копейках)
'currency': 'RUB',
# Реквизиты получателя (клиента) - ОБЯЗАТЕЛЬНО для выплат
# Вариант 1: Перевод на карту
'paymentRequisites': {
'fullName': 'Иван Иванов',
'cardNumber': '1234567890123456'
},
# ИЛИ Вариант 2: СБП (используйте номер телефона):
# 'paymentRequisites': {
# 'fullName': 'Иван Иванов',
# 'phoneNumber': '+79001234567'
# },
'paymentMethod': 'TO_CARD',
'paymentOption': 'sberbank',
'notificationUrl': 'https://your-site.com/webhooks/meridian',
'notificationToken': 'your-secret-webhook-token-min-32-chars'
})
# Ваш API ключ
api_key = 'luma_abc123...:luma_xyz789...'
key_id, secret = api_key.split(':')
signature = calculate_signature(method, url, body, secret)
# Отправка запроса
response = requests.post(
url,
headers={
'Content-Type': 'application/json',
'X-API-Key': api_key,
'X-Signature': signature
},
data=body
)
result = response.json()
print(result)
<?php
function calculateSignature($method, $url, $body, $secret) {
$stringToSign = $method . $url . ($body ?? '');
$signature = hash_hmac('sha256', $stringToSign, $secret, true);
return base64_encode($signature);
}
// Данные заявки
$method = 'POST';
$url = 'https://api.meridian.vip/api/v1/invoices';
$body = json_encode([
'internalId' => 'payout-12345',
'direction' => 'out',
'amount' => 1000, // 1000 RUB (в рублях, НЕ в копейках)
'currency' => 'RUB',
// Реквизиты получателя (клиента) - ОБЯЗАТЕЛЬНО для выплат
// Вариант 1: Перевод на карту
'paymentRequisites' => [
'fullName' => 'Иван Иванов',
'cardNumber' => '1234567890123456'
],
// ИЛИ Вариант 2: СБП (используйте номер телефона):
// 'paymentRequisites' => [
// 'fullName' => 'Иван Иванов',
// 'phoneNumber' => '+79001234567'
// ],
'paymentMethod' => 'TO_CARD',
'paymentOption' => 'sberbank',
'notificationUrl' => 'https://your-site.com/webhooks/meridian',
'notificationToken' => 'your-secret-webhook-token-min-32-chars'
]);
// Ваш API ключ
$apiKey = 'meridian_abc123...:meridian_xyz789...';
list($keyId, $secret) = explode(':', $apiKey);
$signature = calculateSignature($method, $url, $body, $secret);
// Отправка запроса
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'X-API-Key: ' . $apiKey,
'X-Signature: ' . $signature
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
print_r($result);
?>
Пример ответа
HTTP Status: 200 OK{
"id": "cm3k8x7y80001z8j4k5m6n7o8",
"direction": "out",
"status": "new",
"paymentMethod": "TO_CARD",
"paymentOption": "sberbank",
"amount": "1000",
"currency": "RUB",
"newStatusExpiresAt": "2025-11-03T20:00:00.000Z",
"dealRequisites": {
"fullName": "Иван Иванов",
"cardNumber": "1234567890123456"
},
"dealRate": "95.50",
"createdAt": "2025-11-03T15:00:00.000Z",
"updatedAt": "2025-11-03T15:00:00.000Z",
"internalId": "payout-12345",
"merchantName": "MerchantName"
}
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
id | string | Уникальный идентификатор заявки в системе Meridian. Используйте для проверки статуса через GET /api/v1/invoices/:id |
direction | string | Направление платежа: "out" (исходящий - выплата клиенту) |
status | string | Текущий статус заявки. Для direction="out": "new" (создана, ожидает трейдера), "processing" (трейдер взял в работу), "review" (ожидает проверки админом), "paid" (выплачена), "canceled" (отменена), "dispute" (открыт спор). Типичный путь: new → processing → review → paid |
amount | string | Сумма заявки в указанной валюте (строка для точности) |
currency | string | Код валюты: "RUB", "USD", "EUR", "USDT" |
paymentMethod | string | Метод платежа: "SBP" (Система быстрых платежей) или "TO_CARD" (перевод на карту) |
paymentOption | string | Выбранный банк для платежа (например, "sberbank", "tinkoff") |
dealRequisites | object | Объект с реквизитами получателя. Содержит fullName (ФИО) и либо cardNumber (номер карты) либо phoneNumber (телефон для СБП). Это реквизиты клиента, которому нужно выплатить средства |
dealRate | string | Курс обмена USDT/RUB на момент создания заявки |
newStatusExpiresAt | string | Время истечения заявки в статусе "new" (ISO 8601). Для OUT: истекает через 5 часов. После истечения средства возвращаются на баланс мерчанта |
transactionProofUrl | string (optional) | Presigned S3 URL для доступа к доказательству оплаты (скриншот/чек), загруженному трейдером. Присутствует только в статусах review и paid. URL действителен 14 дней |
rejectionReason | string (optional) | Причина отклонения выплаты администратором. Присутствует после отклонения - выплата возвращается в статус new для повторной обработки трейдером |
createdAt | string | Время создания заявки в формате ISO 8601 |
updatedAt | string | Время последнего обновления заявки в формате ISO 8601 |
internalId | string | Уникальный идентификатор заявки в вашей системе (тот же, что был передан при создании). Используйте для сопоставления с вашими внутренними записями |
merchantName | string | Отображаемое имя мерчанта (ваша организация) |