Как подключиться к Reptiloid P2P Gateway
Полное руководство по интеграции. От регистрации до первого платежа — без помощи поддержки.
Введение
Что такое Reptiloid P2P Gateway?
Reptiloid — это платёжный шлюз для приёма платежей через P2P-обмен. Ваши клиенты платят в рублях (переводом на карту, через СБП и другие методы), а вы получаете средства в USDT на баланс мерчанта.
Как это работает:
- Вы создаёте платёж через API — система находит трейдера
- Клиент получает реквизиты для оплаты (номер карты, СБП и т.д.)
- Клиент переводит деньги — трейдер подтверждает получение
- Вам начисляются USDT на баланс, вы получаете webhook-уведомление
Две среды работы
Система имеет две полностью изолированные среды:
Sandbox (тестовая)
Для разработки и тестирования. Тестовые ключи, тестовые платежи. Начинайте здесь.
https://sandbox.reptiloid.vgProduction (боевая)
Для реальных платежей. Боевые ключи, реальные деньги. Только после успешного тестирования.
https://reptiloid.vgБыстрая интеграция
REST API + HMAC-SHA256 подпись. Готовые примеры на Python, JS, PHP, curl.
Безопасность
API Key + Secret Key + подпись каждого запроса. HTTPS обязателен.
Webhook уведомления
Автоматические уведомления о статусе. 8 уровней retry. Подпись callback.
Шаг 1: Регистрация в Sandbox
Для начала работы зарегистрируйте аккаунт мерчанта в тестовой среде (Sandbox).
Откройте страницу регистрации
Перейдите по ссылке: https://sandbox.reptiloid.vg/merchant/register
Заполните форму
Укажите логин, email, название компании и пароль. Все поля обязательны.
Дождитесь одобрения
Администратор проверит заявку и активирует ваш аккаунт. В sandbox это обычно происходит быстро.
Войдите в личный кабинет
После одобрения войдите на https://sandbox.reptiloid.vg/auth с вашими данными.
Шаг 2: Получение API-ключей
Где найти ключи
После одобрения аккаунта вам будут выданы два ключа. Они доступны в личном кабинете мерчанта в разделе «Настройки» или «API».
| Ключ | Формат | Назначение |
|---|---|---|
| API Key (публичный) | pk_live_XXXXXX |
Передаётся в заголовке X-Api-Key каждого запроса |
| Secret Key (секретный) | sk_live_XXXXXX |
Используется для генерации HMAC-SHA256 подписи. Никогда не передаётся в запросах! |
| Merchant ID | merch_XXXXXX |
Ваш уникальный идентификатор в системе |
Как использовать ключи
POST /api/v1/invoice/create HTTP/1.1
Host: sandbox.reptiloid.vg
Content-Type: application/json
X-Api-Key: pk_live_ваш_api_ключ
{
"merchant_id": "merch_ваш_id",
"order_id": "order_001",
"amount": 1000,
"currency": "RUB",
"callback_url": "https://your-site.com/webhook",
"sign": "hmac_sha256_подпись"
}
• Не передавайте Secret Key в заголовках или параметрах запроса
• Не коммитьте ключи в Git-репозиторий
• Все запросы к API должны идти только с вашего бэкенда (сервер-сервер)
Шаг 3: Создание тестового платежа
Эндпоинт
POST /api/v1/invoice/create
Создаёт инвойс на оплату и возвращает ссылку для перенаправления клиента на страницу оплаты.
Параметры запроса (Body JSON)
| Параметр | Тип | Обяз. | Описание |
|---|---|---|---|
merchant_id | string | * | Ваш ID мерчанта |
order_id | string | * | Уникальный ID заказа в вашей системе |
amount | number | * | Сумма к оплате в рублях (мин. 100) |
currency | string | — | Валюта (по умолчанию «RUB») |
user_id | string | — | ID пользователя в вашей системе |
callback_url | string | * | URL для webhook уведомлений |
description | string | — | Описание платежа |
payment_method | string | — | Метод: card, sbp, sim, qr_code, mono_bank, sng_sbp, sng_card |
sign | string | * | HMAC-SHA256 подпись (см. раздел Безопасность) |
Примеры кода
curl -X POST https://sandbox.reptiloid.vg/api/v1/invoice/create \
-H "Content-Type: application/json" \
-H "X-Api-Key: pk_live_ваш_api_ключ" \
-d '{
"merchant_id": "merch_abc123",
"order_id": "order_001",
"amount": 1000,
"currency": "RUB",
"callback_url": "https://your-site.com/webhook",
"description": "Оплата заказа #001",
"sign": "вычисленная_hmac_подпись"
}'
import requests
import hmac
import hashlib
API_KEY = "pk_live_ваш_api_ключ"
SECRET_KEY = "sk_live_ваш_секретный_ключ"
BASE_URL = "https://sandbox.reptiloid.vg" # Для тестов
# === Генерация подписи ===
def generate_signature(data: dict, secret_key: str) -> str:
SIGN_FIELDS = ['merchant_id', 'order_id', 'amount', 'currency',
'user_id', 'callback_url']
sign_data = {}
for k, v in data.items():
if k not in SIGN_FIELDS or v is None:
continue
if isinstance(v, float) and v == int(v):
v = int(v)
sign_data[k] = v
sorted_params = sorted(sign_data.items())
sign_string = '&'.join(f"{k}={v}" for k, v in sorted_params)
sign_string += secret_key
return hmac.new(
secret_key.encode('utf-8'),
sign_string.encode('utf-8'),
hashlib.sha256
).hexdigest()
# === Создание платежа ===
data = {
"merchant_id": "merch_abc123",
"order_id": "order_001",
"amount": 1000,
"currency": "RUB",
"callback_url": "https://your-site.com/webhook",
"description": "Оплата заказа #001"
}
data["sign"] = generate_signature(data, SECRET_KEY)
response = requests.post(
f"{BASE_URL}/api/v1/invoice/create",
json=data,
headers={"X-Api-Key": API_KEY}
)
result = response.json()
print(result)
# Ответ:
# {
# "status": "success",
# "payment_id": "inv_20250315_A1B2C3D4",
# "payment_url": "https://..../select-operator/inv_20250315_A1B2C3D4",
# "details": {
# "original_amount": 1000,
# "total_amount": 1012, # с маркером
# "marker": 12,
# "amount_usdt": 12.97,
# "expires_at": "2025-03-15T13:30:00+00:00"
# }
# }
# Перенаправьте клиента на payment_url
print(f"Ссылка для оплаты: {result['payment_url']}")
const crypto = require('crypto');
const axios = require('axios');
const API_KEY = 'pk_live_ваш_api_ключ';
const SECRET_KEY = 'sk_live_ваш_секретный_ключ';
const BASE_URL = 'https://sandbox.reptiloid.vg'; // Для тестов
// === Генерация подписи ===
function generateSignature(data, secretKey) {
const SIGN_FIELDS = ['merchant_id', 'order_id', 'amount', 'currency',
'user_id', 'callback_url'];
const signData = {};
for (const [k, v] of Object.entries(data)) {
if (!SIGN_FIELDS.includes(k) || v === null || v === undefined) continue;
signData[k] = (typeof v === 'number' && v === Math.floor(v))
? Math.floor(v) : v;
}
const sorted = Object.entries(signData).sort(([a], [b]) => a.localeCompare(b));
let signString = sorted.map(([k, v]) => `${k}=${v}`).join('&');
signString += secretKey;
return crypto.createHmac('sha256', secretKey)
.update(signString, 'utf8')
.digest('hex');
}
// === Создание платежа ===
async function createPayment() {
const data = {
merchant_id: 'merch_abc123',
order_id: 'order_001',
amount: 1000,
currency: 'RUB',
callback_url: 'https://your-site.com/webhook',
description: 'Оплата заказа #001'
};
data.sign = generateSignature(data, SECRET_KEY);
const response = await axios.post(
`${BASE_URL}/api/v1/invoice/create`,
data,
{ headers: { 'X-Api-Key': API_KEY } }
);
console.log(response.data);
// Перенаправьте клиента на response.data.payment_url
}
createPayment();
<?php
$apiKey = 'pk_live_ваш_api_ключ';
$secretKey = 'sk_live_ваш_секретный_ключ';
$baseUrl = 'https://sandbox.reptiloid.vg'; // Для тестов
// === Генерация подписи ===
function generateSignature(array $data, string $secretKey): string {
$signFields = ['merchant_id', 'order_id', 'amount', 'currency',
'user_id', 'callback_url'];
$signData = [];
foreach ($data as $k => $v) {
if (!in_array($k, $signFields) || $v === null) continue;
if (is_float($v) && $v == intval($v)) $v = intval($v);
$signData[$k] = $v;
}
ksort($signData);
$signString = http_build_query($signData, '', '&');
$signString .= $secretKey;
return hash_hmac('sha256', $signString, $secretKey);
}
// === Создание платежа ===
$data = [
'merchant_id' => 'merch_abc123',
'order_id' => 'order_001',
'amount' => 1000,
'currency' => 'RUB',
'callback_url' => 'https://your-site.com/webhook',
'description' => 'Оплата заказа #001'
];
$data['sign'] = generateSignature($data, $secretKey);
$ch = curl_init("$baseUrl/api/v1/invoice/create");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($data),
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
"X-Api-Key: $apiKey"
],
CURLOPT_RETURNTRANSFER => true,
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
echo "Payment URL: " . $response['payment_url'];
?>
Ответ сервера
{
"status": "success",
"payment_id": "inv_20250315_A1B2C3D4",
"payment_url": "https://secure-payments.st/select-operator/inv_20250315_A1B2C3D4",
"details": {
"type": "waiting",
"message": "Ожидание реквизитов. Откройте страницу оплаты.",
"original_amount": 1000,
"total_amount": 1012,
"marker": 12,
"amount_usdt": 12.97,
"expires_at": "2025-03-15T13:30:00+00:00"
}
}
total_amount = amount + marker. Клиент должен перевести именно total_amount.Проверка статуса платежа
GET /api/v1/invoice/status?order_id=order_001
# Проверка по order_id
response = requests.get(
f"{BASE_URL}/api/v1/invoice/status",
params={"order_id": "order_001"},
headers={"X-Api-Key": API_KEY}
)
# Или по payment_id
response = requests.get(
f"{BASE_URL}/api/v1/invoice/status",
params={"payment_id": "inv_20250315_A1B2C3D4"},
headers={"X-Api-Key": API_KEY}
)
Статусы платежа
| Статус | Описание |
|---|---|
waiting_requisites | Ожидание выбора метода оплаты |
pending | Ожидает оплаты клиентом |
paid | Клиент отметил оплату, ожидает подтверждения трейдера |
completed | Платёж завершён, USDT зачислен |
expired | Платёж истёк (не оплачен вовремя) |
cancelled | Платёж отменён |
disputed | Открыт спор по платежу |
Шаг 4: Настройка Webhook
Что такое Webhook?
Webhook — это автоматическое HTTP-уведомление (POST-запрос), которое система отправляет на ваш сервер при изменении статуса платежа. Это основной способ получения информации о результате оплаты.
Как указать URL: передайте callback_url при создании платежа. На этот URL будут приходить все уведомления по данному платежу.
Какие события приходят
| Статус | Когда приходит | Дополнительные поля |
|---|---|---|
pending | Найден трейдер, клиенту показаны реквизиты | — |
paid | Клиент отметил что оплатил | — |
completed | Трейдер подтвердил получение средств | Бухгалтерские данные (см. ниже) |
expired | Платёж истёк | reason, expired_at |
cancelled | Платёж отменён | reason, cancelled_at |
disputed | Открыт спор | reason, disputed_at, disputed_by |
Формат Webhook (пример для completed)
// POST на ваш callback_url
// Content-Type: application/json
// Все временные метки в московском времени (UTC+3)
{
"order_id": "DEMO_123",
"payment_id": "inv_20260320_A1B2C3D4",
"status": "completed",
"amount": 2000, // сумма запроса (= original_amount_rub)
"amount_usdt": 23.45, // общая сумма сделки (USDT)
// === Бухгалтерские данные (только для completed) ===
"original_amount_rub": 2000, // сумма, которую запросил мерчант (RUB)
"client_paid_rub": 2298, // сколько клиент фактически заплатил (RUB)
"merchant_received_usdt": 18.61, // чистая сумма мерчанту (USDT)
"merchant_received_rub": 1600, // чистая сумма мерчанту (RUB)
"commission_percent": 20, // процент комиссии
"commission_usdt": 4.84, // комиссия (USDT)
"commission_rub": 400, // комиссия (RUB)
"base_rate": 85.3, // базовый курс платформы из payout_settings (USDT/RUB)
"trader_rate": 98, // курс трейдера (USDT/RUB)
"trade_id": "trd_abc12345",
"completed_at": "2026-03-20T07:12:01+03:00",
"timestamp": "2026-03-20T07:12:01+03:00",
"sign": "a1b2c3d4e5f6..."
}
original_amount_rub, client_paid_rub, merchant_received_*, commission_*, base_rate, trader_rate) присутствуют только в статусе completed• Все временные метки в московском времени (UTC+3)
•
amount = original_amount_rub — сумма, запрошенная мерчантом•
client_paid_rub — фактическая сумма от клиента (включая маркер)•
base_rate — базовый курс платформы из payout_settings (Rapira)•
trader_rate — курс трейдера, по которому клиент фактически платит
Обработка Webhook (пример)
import hmac, hashlib
from flask import Flask, request, jsonify
app = Flask(__name__)
SECRET_KEY = "sk_live_ваш_секретный_ключ"
def verify_webhook(payload: dict, secret_key: str) -> bool:
"""Проверка HMAC-подписи webhook"""
SIGN_FIELDS = ['order_id', 'payment_id', 'status',
'amount', 'amount_usdt', 'timestamp']
provided_sign = payload.get("sign", "")
sign_data = {}
for k, v in payload.items():
if k not in SIGN_FIELDS or k == 'sign' or v is None:
continue
if isinstance(v, float) and v == int(v):
v = int(v)
sign_data[k] = v
sorted_params = sorted(sign_data.items())
sign_string = '&'.join(f"{k}={v}" for k, v in sorted_params)
sign_string += secret_key
expected_sign = hmac.new(
secret_key.encode('utf-8'),
sign_string.encode('utf-8'),
hashlib.sha256
).hexdigest()
return hmac.compare_digest(expected_sign, provided_sign)
@app.route('/webhook', methods=['POST'])
def handle_webhook():
payload = request.json
# 1. Проверяем подпись
if not verify_webhook(payload, SECRET_KEY):
return jsonify({"status": "error"}), 403
# 2. Обрабатываем статус
status = payload["status"]
order_id = payload["order_id"]
if status == "completed":
amount = payload["amount"]
amount_usdt = payload["amount_usdt"]
# Зачислить средства пользователю
print(f"Заказ {order_id} оплачен: {amount} RUB / {amount_usdt} USDT")
# credit_user(order_id, amount)
elif status == "expired":
print(f"Заказ {order_id} истёк")
elif status == "cancelled":
print(f"Заказ {order_id} отменён")
# 3. Обязательно вернуть {"status": "ok"} и HTTP 200
return jsonify({"status": "ok"})
const express = require('express');
const crypto = require('crypto');
const app = express();
app.use(express.json());
const SECRET_KEY = 'sk_live_ваш_секретный_ключ';
function verifyWebhook(payload, secretKey) {
const SIGN_FIELDS = ['order_id', 'payment_id', 'status',
'amount', 'amount_usdt', 'timestamp'];
const providedSign = payload.sign || '';
const signData = {};
for (const [k, v] of Object.entries(payload)) {
if (!SIGN_FIELDS.includes(k) || k === 'sign' || v == null) continue;
signData[k] = (typeof v === 'number' && v === Math.floor(v))
? Math.floor(v) : v;
}
const sorted = Object.entries(signData).sort(([a], [b]) => a.localeCompare(b));
let signString = sorted.map(([k, v]) => `${k}=${v}`).join('&');
signString += secretKey;
const expectedSign = crypto.createHmac('sha256', secretKey)
.update(signString, 'utf8')
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(expectedSign), Buffer.from(providedSign)
);
}
app.post('/webhook', (req, res) => {
const payload = req.body;
if (!verifyWebhook(payload, SECRET_KEY)) {
return res.status(403).json({ status: 'error' });
}
if (payload.status === 'completed') {
console.log(`Заказ ${payload.order_id} оплачен: ${payload.amount} RUB`);
// creditUser(payload.order_id, payload.amount);
}
res.json({ status: 'ok' });
});
app.listen(3000);
<?php
$secretKey = 'sk_live_ваш_секретный_ключ';
$payload = json_decode(file_get_contents('php://input'), true);
// Проверка подписи
$signFields = ['order_id', 'payment_id', 'status',
'amount', 'amount_usdt', 'timestamp'];
$signData = [];
foreach ($payload as $k => $v) {
if (!in_array($k, $signFields) || $k === 'sign' || $v === null) continue;
if (is_float($v) && $v == intval($v)) $v = intval($v);
$signData[$k] = $v;
}
ksort($signData);
$signString = http_build_query($signData, '', '&') . $secretKey;
$expectedSign = hash_hmac('sha256', $signString, $secretKey);
if (!hash_equals($expectedSign, $payload['sign'] ?? '')) {
http_response_code(403);
echo json_encode(['status' => 'error']);
exit;
}
// Обработка
if ($payload['status'] === 'completed') {
// Зачислить средства
error_log("Заказ {$payload['order_id']} оплачен: {$payload['amount']} RUB");
}
echo json_encode(['status' => 'ok']);
?>
Политика повторных попыток
Ваш сервер должен вернуть HTTP 200 с {"status": "ok"}. Если ответ не получен, система повторяет отправку:
| Попытка | Задержка |
|---|---|
| 1 | 1 минута |
| 2 | 5 минут |
| 3 | 15 минут |
| 4 | 1 час |
| 5 | 2 часа |
| 6 | 4 часа |
| 7 | 12 часов |
| 8 (последняя) | 24 часа |
GET /api/v1/invoice/status в качестве fallback.Шаг 5: Полное тестирование
Чек-лист тестирования
Перед переходом в Production вы обязаны протестировать все сценарии в Sandbox:
- Создание платежа — вызовите
POST /create, убедитесь что получаетеpayment_url - Проверка статуса — вызовите
GET /status, убедитесь что получаете актуальный статус - Получение webhook — убедитесь что ваш сервер получает POST-запрос на
callback_url - Проверка подписи — убедитесь что
signв webhook проходит верификацию на вашей стороне - Корректность данных — проверьте что
order_id,amount,statusсовпадают с ожидаемыми - Обработка expired — проверьте как ваша система реагирует на истёкший платёж
- Обработка cancelled — проверьте отмену платежа
- Обработка disputed — проверьте открытие спора
- Дублирование webhook — убедитесь что повторный webhook не приводит к двойному зачислению
Демо-магазин
🏫 Демонстрационный магазин
Мы предоставляем готовый демо-магазин, который наглядно показывает весь процесс интеграции. Это лучший способ понять, как работает система, прежде чем писать собственный код.
Что можно сделать в демо-магазине
Создать тестовый платёж
Введите сумму и создайте платёж прямо через интерфейс. Увидите API-запрос и ответ.
Пройти полный цикл
Создание → оплата → подтверждение → зачисление. Весь путь от начала до конца.
Увидеть Webhook
Демо-магазин показывает все полученные webhook-уведомления в реальном времени с полным payload.
Как использовать
Откройте демо-магазин
Перейдите на sandbox.reptiloid.vg/demo-shop
Введите ваш API Key
Вставьте ваш тестовый pk_live_... ключ для привязки к мерчанту
Создайте платёж
Укажите сумму и нажмите «Создать». Система покажет ссылку для оплаты.
Наблюдайте за webhook-ами
В разделе «История webhook» отображаются все уведомления с полным payload включая бухгалтерские данные.
Типичные ошибки
Ошибки при интеграции и их решения
INVALID_API_KEY (401)
Причина: неверный или отсутствующий API ключ в заголовке X-Api-Key
Решение: проверьте что ключ скопирован полностью, без пробелов. Убедитесь что используете ключ от правильной среды (sandbox / production).
INVALID_SIGNATURE (400)
Причина: HMAC-подпись не совпадает с ожидаемой
Решение:
• Проверьте что Secret Key правильный
• Проверьте порядок полей (должны быть отсортированы по алфавиту)
• Проверьте что float значения без дробной части конвертируются в int (1000.0 → 1000)
• Проверьте что Secret Key добавляется в конец строки (без &)
Не приходит Webhook
Возможные причины:
• callback_url недоступен из интернета (проверьте файрвол)
• Сервер возвращает не HTTP 200 (проверьте логи)
• Сервер отвечает, но не {"status": "ok"} (будут retry)
• HTTPS сертификат невалидный на вашем callback URL
• Таймаут ответа (сервер думает дольше 10 секунд)
DUPLICATE_ORDER_ID (400)
Причина: заказ с таким order_id уже существует
Решение: каждый order_id должен быть уникальным. Используйте UUID или инкрементальные ID из вашей системы.
MERCHANT_MISMATCH (400)
Причина: merchant_id в теле запроса не соответствует API ключу
Решение: убедитесь что merchant_id и X-Api-Key принадлежат одному и тому же мерчанту.
INVALID_AMOUNT (400)
Причина: сумма меньше минимальной
Решение: минимальная сумма платежа — 100 RUB. Проверьте что amount ≥ 100.
Все коды ошибок API
| HTTP | Код | Описание |
|---|---|---|
| 401 | INVALID_API_KEY | Неверный API ключ |
| 400 | INVALID_SIGNATURE | Неверная HMAC подпись |
| 400 | MERCHANT_MISMATCH | Merchant ID не соответствует API ключу |
| 403 | MERCHANT_TRAFFIC_DISABLED | Трафик мерчанта отключён |
| 400 | DUPLICATE_ORDER_ID | Заказ с таким order_id уже существует |
| 400 | INVALID_AMOUNT | Сумма меньше минимальной (100 RUB) |
| 400 | INVALID_PAYMENT_METHOD | Недопустимый метод оплаты |
| 400 | MISSING_IDENTIFIER | Не указан order_id или payment_id |
| 404 | NOT_FOUND | Платёж не найден |
| 400 | ALREADY_DISPUTED | Спор уже открыт |
| 429 | RATE_LIMIT_EXCEEDED | Превышен лимит запросов |
Безопасность
Проверка HMAC-подписи
Каждый запрос к API и каждый входящий webhook подписаны HMAC-SHA256. Это гарантирует что запрос не был подделан.
Алгоритм создания подписи для запросов:
Берём поля для подписи
merchant_id, order_id, amount, currency, user_id, callback_url
Убираем null-значения
Поля со значением null или undefined исключаются
Сортируем по ключу (алфавит)
Результат: amount=1000&callback_url=...¤cy=RUB&merchant_id=...&order_id=...
Добавляем Secret Key в конец
...&order_id=order_001sk_live_ваш_секрет (без разделителя &)
Вычисляем HMAC-SHA256
Ключ — secret_key, сообщение — полученная строка. Результат — 64-символьный hex.
Поля для подписи Webhook (входящего):
order_id, payment_id, status, amount, amount_usdt, timestamp
Правила хранения ключей
✅ Правильно
- Хранить в переменных окружения (
.env) - Использовать vault / secrets manager
- Ограничить доступ к ключам
- Ротировать ключи при утечке
❌ Неправильно
- Хардкодить в исходном коде
- Коммитить в Git-репозиторий
- Использовать на фронтенде
- Передавать в URL или логах
HTTPS обязателен
Все запросы к API и callback URL должны использовать HTTPS. HTTP-запросы будут отклонены. Убедитесь что ваш callback_url имеет валидный SSL-сертификат.
Переход в Production
Пошаговый план перехода
Завершите тестирование в Sandbox
Убедитесь что все сценарии из чек-листа (раздел 6) пройдены успешно.
Свяжитесь с администратором
Запросите перевод в Production. Администратор проверит вашу интеграцию и создаст боевой аккаунт.
Получите Production-ключи
Вам будут выданы новые pk_live_... и sk_live_... ключи для боевой среды.
Переключите Base URL
Замените в вашем коде:
// Было (sandbox): BASE_URL = "https://sandbox.reptiloid.vg" // Стало (production): BASE_URL = "https://reptiloid.vg"
Замените API-ключи
Обновите API_KEY и SECRET_KEY на production-версии.
Проведите первый реальный платёж
Сделайте тестовый платёж на минимальную сумму (100 RUB) чтобы убедиться что всё работает.
URL среды
API Base URLs
| Среда | Base URL | Пример |
|---|---|---|
| Sandbox | https://sandbox.reptiloid.vg/api/v1/invoice |
POST .../invoice/create |
| Production | https://reptiloid.vg/api/v1/invoice |
POST .../invoice/create |
Reptiloid P2P Gateway — Документация v2.0
Sandbox · Production · Docs