Разработка White-label крипто-обменника
White-label крипто-обменник — это готовая платформа мгновенного обмена криптовалют, которую партнёр разворачивает под своим брендом. В отличие от биржи, обменник не требует регистрации пользователей для базовых операций: ввёл адрес назначения, отправил монеты, получил обмен. Это привлекательный продукт для запуска: низкий порог входа, понятная бизнес-модель.
White-label модели
Три бизнес-модели
Revenue share: платформа обрабатывает транзакции через собственные провайдеры ликвидности, партнёр получает % от каждого обмена. Нулевые операционные затраты для партнёра, но низкая маржа (30-50% от платформенной маржи).
License model: партнёр получает полный исходный код или SaaS решение с admin панелью, самостоятельно подключает провайдеров ликвидности, устанавливает свои маржи. Полный контроль, но нужна техническая команда.
API + UI: backend API в white-label, партнёр строит собственный UI. Максимальная гибкость для технических партнёров.
Что включает WL пакет
Core функциональность:
- Виджет обмена (embeddable) и standalone страница
- Расчёт курса в реальном времени
- Поддержка 100+ криптовалют и токенов
- Мультиязычность и локализация
- Адаптивный дизайн (mobile-first)
Admin панель:
- Управление торговыми парами (включить/выключить, установить маржу)
- Мониторинг транзакций и ручное вмешательство
- Настройка KYC порогов
- Affiliate/referral система
- Финансовая отчётность
Кастомизация бренда:
- Логотип, цветовая схема, шрифты
- Кастомный домен с SSL
- Email шаблоны в стиле бренда
- SEO мета-теги
Техническая архитектура
Многотенантная архитектура
class TenantConfig(BaseModel):
tenant_id: str
domain: str
brand_name: str
logo_url: str
primary_color: str
secondary_color: str
# Торговые настройки
enabled_pairs: list[str]
default_markup_percent: float = 1.5
pair_markups: dict[str, float] = {} # Кастомная маржа по парам
# KYC настройки
kyc_required_above_usd: float = 1000
kyc_provider: str = 'sumsub'
# Провайдеры ликвидности (приоритет)
liquidity_providers: list[str] = ['changenow', 'simpleswap', 'internal']
# Платёжные реквизиты
payout_wallet: str # куда идёт наша маржа
affiliate_rate: float = 0.0 # % для аффилиат партнёров тенанта
Router middleware определяет тенанта по домену:
class TenantMiddleware:
async def __call__(self, request: Request, call_next):
host = request.headers.get('host', '').split(':')[0]
tenant = await self.tenant_registry.get_by_domain(host)
if not tenant:
return JSONResponse({'error': 'Unknown domain'}, status_code=404)
request.state.tenant = tenant
response = await call_next(request)
return response
Провайдеры ликвидности
class ChangeNowProvider:
BASE_URL = "https://api.changenow.io/v2"
async def get_rate(
self,
from_currency: str,
to_currency: str,
amount: Decimal,
flow: str = 'standard' # 'standard' или 'fixed-rate'
) -> RateQuote | None:
try:
response = await self.http.get(
f"{self.BASE_URL}/exchange/estimated-amount",
params={
'fromCurrency': from_currency.lower(),
'toCurrency': to_currency.lower(),
'fromAmount': str(amount),
'flow': flow,
'type': 'direct',
},
headers={'x-changenow-api-key': self.api_key}
)
data = response.json()
return RateQuote(
provider='changenow',
to_amount=Decimal(str(data['toAmount'])),
rate=Decimal(str(data['toAmount'])) / amount,
min_amount=Decimal(str(data.get('minAmount', 0))),
expires_in_seconds=600
)
except Exception as e:
logger.error(f"ChangeNow rate error: {e}")
return None
async def create_exchange(self, params: ExchangeParams) -> ExchangeOrder:
response = await self.http.post(
f"{self.BASE_URL}/exchange",
json={
'fromCurrency': params.from_currency.lower(),
'toCurrency': params.to_currency.lower(),
'fromAmount': str(params.from_amount),
'address': params.to_address,
'flow': 'standard',
},
headers={'x-changenow-api-key': self.api_key}
)
data = response.json()
return ExchangeOrder(
provider_order_id=data['id'],
deposit_address=data['payinAddress'],
expected_amount=Decimal(str(data['fromAmount'])),
receive_amount=Decimal(str(data['toAmount'])),
status='waiting'
)
Применение маржи тенанта
def apply_tenant_markup(
provider_quote: RateQuote,
tenant: TenantConfig,
pair: str
) -> AdjustedQuote:
"""Применяем маржу тенанта поверх курса провайдера"""
markup_percent = tenant.pair_markups.get(pair, tenant.default_markup_percent)
markup_multiplier = 1 - (markup_percent / 100)
adjusted_to_amount = provider_quote.to_amount * Decimal(str(markup_multiplier))
return AdjustedQuote(
original_to_amount=provider_quote.to_amount,
displayed_to_amount=adjusted_to_amount,
markup_percent=markup_percent,
margin_amount=provider_quote.to_amount - adjusted_to_amount,
provider=provider_quote.provider
)
Embeddable виджет
Ключевое преимущество white-label обменника — его можно встроить в любой сайт:
<!-- Партнёр вставляет на свой сайт -->
<div id="crypto-exchanger"></div>
<script>
ExchangerWidget.init({
container: '#crypto-exchanger',
apiKey: 'partner_api_key_here',
fromCurrency: 'BTC',
toCurrency: 'USDT',
theme: 'dark',
primaryColor: '#FF6B00',
lang: 'ru',
onComplete: (txId) => {
console.log('Exchange created:', txId);
}
});
</script>
<script src="https://widget.yourexchanger.com/v2/widget.js"></script>
Виджет загружается из iframe или как JavaScript инжект в зависимости от требований к безопасности. Iframe изолирован и безопаснее, JavaScript инжект позволяет более глубокую кастомизацию.
Мониторинг и алерты
class ExchangeMonitor:
async def check_stuck_orders(self):
"""Ищем транзакции, зависшие без обновления статуса"""
stuck_threshold = timedelta(hours=2)
stuck_orders = await self.db.get_orders_by_status(
status='waiting',
older_than=stuck_threshold
)
for order in stuck_orders:
# Проверяем статус у провайдера
provider_status = await self.get_provider_status(order)
if provider_status.is_completed:
await self.complete_order(order, provider_status)
elif provider_status.is_failed:
await self.fail_order(order, provider_status.error)
else:
# Всё ещё ждём — алертим оператора
await self.alert_operator(order, f"Stuck for {stuck_threshold}")
Мониторинг критически важен: транзакции в блокчейне задерживаются, провайдеры иногда зависают. Без автоматического мониторинга и ручной обработки исключений — плохая репутация и недовольные клиенты.
Прайсинг white-label
| Тариф | Что включено | Стоимость |
|---|---|---|
| Starter | SaaS + базовая кастомизация | $500-2,000/мес |
| Business | Self-hosted + full source | $10,000-50,000 единоразово |
| Enterprise | Кастомная разработка | от $50,000 |
Основные вендоры: ChangeNow WL, StealthEX WL, GodEx WL, SimpleSwap WL. Кастомная разработка оправдана при специфических требованиях к интеграциям или бизнес-логике.







