Розробка 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'
) -> 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
Застосування маржи тенанта
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}")
Моніторинг критично важливий: трансакції в blockchain затримуються, провайдери іноді зависають. Без автоматичного моніторингу та ручної обробки виключень — погана репутація та недовільні клієнти.
Прайсинг 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. Кастомна розробка оправдана при специфічних вимогах до інтеграцій або бізнес-логіки.







