Интеграция обменника с агрегаторами курсов
Агрегаторы курсов (rate aggregators) — это сервисы, которые собирают котировки от множества обменников и отображают лучший курс. Integrations с 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 и устаревшем курсе к моменту оплаты.







