Інтеграція обмінника з агрегаторами курсів
Агрегатори курсів (rate aggregators) — це сервісу, які збирають котировки від безлічі обмінників та відображають найкращий курс. Інтеграції з CoinGecko, CoinMarketCap, Swapzone, Changelly Affiliate та іншими агрегаторами забезпечують трафік обміннику без прямих маркетингових затрат.
Основні агрегатори та типи інтеграцій
Swapzone / Changehero / Letsexchange
Ці агрегатори спеціалізуються саме на crypto-to-crypto обмінниках. Бізнес-модель: агрегатор показує ваш курс серед інших, користувач натискає "Exchange" — редирект до вас. Агрегатор отримує CPA або % від трансакції.
Інтеграція через API:
class SwapzoneProvider:
"""Надаємо Swapzone дані про наші курси"""
async def handle_rate_request(self, request: RateRequest) -> RateResponse:
"""Swapzone запитує наш курс для пари"""
rate = await self.calculator.get_rate(
from_currency=request.from_currency,
to_currency=request.to_currency,
from_amount=request.amount
)
return RateResponse(
from_amount=str(request.amount),
to_amount=str(rate.to_amount),
rate=str(rate.rate),
min_amount=str(self.get_min_amount(request.from_currency)),
max_amount=str(self.get_max_amount(request.from_currency)),
estimated_time_minutes=self.estimate_time(request.from_currency),
partner_id=self.PARTNER_ID,
partner_extra={} # кастомні дані
)
async def handle_create_order(self, order_data: dict) -> CreateOrderResponse:
"""Swapzone створює обмін від імені користувача"""
order = await self.exchange_service.create_order(
from_currency=order_data['from'],
to_currency=order_data['to'],
from_amount=Decimal(order_data['amount']),
to_address=order_data['address'],
refund_address=order_data.get('refund_address'),
source='swapzone' # відстежуємо джерело
)
return CreateOrderResponse(
order_id=order.id,
deposit_address=order.deposit_address,
deposit_amount=str(order.from_amount),
receive_amount=str(order.to_amount)
)
CoinGecko Exchange API
Реєстрація біржи/обмінника на CoinGecko дає органічний трафік через їхні сторінки:
class CoinGeckoExchangeAPI:
"""Endpoints які CoinGecko вимагає від листингованих обмінників"""
async def get_tickers(self) -> list[dict]:
"""GET /api/v1/tickers — список активних торговельних пар з обсягами"""
pairs = await self.db.get_active_pairs_with_stats()
return [
{
"base": pair.base_currency,
"target": pair.quote_currency,
"market": {"name": self.EXCHANGE_NAME, "identifier": self.EXCHANGE_ID},
"last": str(pair.last_rate),
"volume": str(pair.volume_24h),
"bid_ask_spread_percentage": str(pair.spread_percent),
"timestamp": datetime.utcnow().isoformat() + "Z",
"is_anomaly": False,
"is_stale": pair.last_updated < datetime.utcnow() - timedelta(minutes=5)
}
for pair in pairs
]
Webhook зворотних сповіщень
Агрегатори часто вимагають webhook для оновлення статусу трансакції:
@app.post("/webhooks/swapzone/status")
async def swapzone_status_webhook(data: dict):
"""Swapzone сповіщує нас про дії користувача"""
order_id = data['order_id']
event = data['event'] # 'payment_sent', 'cancelled', etc.
order = await db.get_order(order_id)
if event == 'payment_sent':
logger.info(f"Swapzone confirmed payment sent for order {order_id}")
elif event == 'cancelled':
await exchange_service.cancel_order(order_id)
@app.get("/webhooks/swapzone/order/{order_id}")
async def get_order_status(order_id: str):
"""Swapzone запитує статус нашого замовлення"""
order = await db.get_order(order_id)
return {
"status": map_status(order.status), # 'waiting', 'confirming', 'finished', 'failed'
"out_tx_hash": order.output_tx_hash,
"in_tx_hash": order.input_tx_hash
}
UTM та аналітика конверсій
Кожен агрегатор повинен бути помічений UTM-параметрами для точного обліку конверсій:
SOURCE_CONFIGS = {
'swapzone': {'utm_source': 'swapzone', 'revenue_share': 0.40},
'changehero': {'utm_source': 'changehero', 'revenue_share': 0.35},
'letsexchange': {'utm_source': 'letsexchange', 'revenue_share': 0.30},
'coingecko': {'utm_source': 'coingecko', 'revenue_share': 0.0}, # CPA модель
}
def track_conversion(order: Order, source: str):
config = SOURCE_CONFIGS.get(source, {})
margin = calculate_margin(order)
partner_payout = margin * Decimal(str(config.get('revenue_share', 0)))
db.create_affiliate_earning(source, order.id, partner_payout)
Інтеграція з 5-7 крупними агрегаторами забезпечує постійний потік трансакцій без прямих рекламних затрат. Ключова метрика: конверсія з переходу до завершеної угоди обміну. Зазвичай 15-35% — головна втрата на KYC friction та застарілому курсі до моменту платежу.







