Integration of Exchanger with Rate Aggregators
Rate aggregators (rate aggregators) are services that collect quotes from multiple exchangers and display the best rate. Integrations with CoinGecko, CoinMarketCap, Swapzone, Changelly Affiliate and others provide traffic to your exchanger without direct marketing costs.
Main Aggregators and Integration Types
Swapzone / Changehero / Letsexchange
These aggregators specialize specifically in crypto-to-crypto exchangers. Business model: aggregator shows your rate among others, user clicks "Exchange"—redirect to you. Aggregator gets CPA or % of transaction.
Integration via API:
class SwapzoneProvider:
"""Provide Swapzone with data about our rates"""
async def handle_rate_request(self, request: RateRequest) -> RateResponse:
"""Swapzone requests our rate for a pair"""
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={} # custom data
)
async def handle_create_order(self, order_data: dict) -> CreateOrderResponse:
"""Swapzone creates exchange on behalf of user"""
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' # track source
)
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
Registering your exchange on CoinGecko gives organic traffic through their pages:
class CoinGeckoExchangeAPI:
"""Endpoints CoinGecko requires from listed exchangers"""
async def get_tickers(self) -> list[dict]:
"""GET /api/v1/tickers — list of active trading pairs with volumes"""
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 Notifications
Aggregators often require webhook for transaction status updates:
@app.post("/webhooks/swapzone/status")
async def swapzone_status_webhook(data: dict):
"""Swapzone notifies us about user actions"""
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 requests status of our order"""
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 and Conversion Analytics
Each aggregator should be marked with UTM parameters for precise conversion tracking:
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 model
}
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)
Integration with 5-7 major aggregators provides a steady stream of transactions without direct advertising costs. Key metric: conversion from click to completed exchange. Usually 15-35%—main loss is due to KYC friction and stale rate at payment time.







