Note: when you launch a crypto exchange, the first problem is an empty order book. Without liquidity, traders leave for competitors. We solve this by connecting professional liquidity providers (LP) — within 2–4 weeks you get two‑way quotes with depth comparable to top‑5 exchanges. Finding the right LP is non‑trivial: you must consider spreads, order book depth, response time, and reliability. We have analyzed over 30 providers, including Prime Brokers, aggregated APIs, and DEX/AMM, and selected the best fit for each exchange profile. Our track record: more than 30 LP integrations for exchanges of various scales, from startups to platforms with $50M+ daily volume. We guarantee stability: 99.95% uptime, spreads from 0.01%, and response time <50 ms.
Integration of Liquidity Providers: Full Cycle
Choosing an LP depends on volumes, regulation, and asset types. Let's look at three main categories:
| Provider Type | Examples | Requirements | Integration Speed | Minimum Volume |
|---|---|---|---|---|
| Prime Broker | Wintermute, Jump, Cumberland | KYB, legal entity, legal agreement | 2–4 weeks | $1M/month |
| Aggregated API | B2Broker, FXCM Crypto | KYB, API keys | 1–2 weeks | $100K/month |
| DEX/AMM (0x, 1inch) | Uniswap, Curve | No KYC, only API | 1–3 days | None |
Prime Brokers offer the best spreads but require institutional status. Aggregated APIs are the sweet spot for medium‑sized exchanges. DEX/AMM work well for long‑tail tokens where centralized LPs lack liquidity. Prime Brokers provide spreads 3–5 times tighter than DEX/AMM for major pairs, which is critical for large orders.
| Parameter | CEX LP (Prime Broker) | DEX/AMM (Uniswap) |
|---|---|---|
| Spread (major pairs) | 0.01–0.05% | 0.05–1% |
| Spread (altcoins) | 0.1–0.5% | 0.5–3% |
| Order book depth | 10 BTC+ | 1 BTC+ |
| KYC | Yes | No |
| Minimum volume | $1M/month | None |
| Integration time | 2–4 weeks | 1–3 days |
| Failover | LP chain + DEX fallback | Depends on pool |
How to Choose a Liquidity Provider for Your Exchange?
The process of connecting a Prime Broker consists of four stages: KYB and signing a Master Agreement (1–2 weeks), technical integration via FIX or REST/WebSocket with Heartbeat configuration, depositing or posting collateral from $100K, and go‑live with execution quality monitoring. A typical mistake is ignoring failover. If one LP goes down, orders are lost. We always set up a chain of 3+ providers and a DEX fallback.
What Does a Turnkey LP Integration Include?
A turnkey LP integration includes: analytics — gathering requirements for depth, instruments, and latency; architecture design — aggregation, failover, and Smart Order Routing; implementation via REST/WebSocket/FIX with adapters for each provider; load testing up to 5000 RPS with failure simulation; deployment to production with monitoring (Tenderly, Grafana); API documentation and runbook for incident response; and round‑the‑clock support with incident response.
Typical Mistakes in LP Integration
Common mistakes include ignoring failover — if one LP goes down, orders are lost. Always configure a chain of 3+ providers and a DEX fallback. Another mistake is incorrect SOR: Smart Order Routing without depth awareness can execute an order at a bad price. We use a TWAP algorithm with slicing. Lack of fill quality monitoring is also critical: the difference between quoted and executed price is a metric you must track, otherwise you won't know if an LP is giving bad execution.
How We Build Failover and Resilience
Our architecture can withstand up to 2 simultaneous LP failures without quality loss. Implementation example:
Failover architecture in Python
class ResilientLPManager:
def __init__(self, providers: list, fallback_amm=None):
self.providers = {p.name: p for p in providers}
self.provider_health = {p.name: True for p in providers}
self.fallback_amm = fallback_amm # DEX as fallback
async def get_quote_with_fallback(self, symbol, side, qty) -> LPQuote:
for provider_name, provider in self.providers.items():
if not self.provider_health[provider_name]:
continue
try:
quote = await asyncio.wait_for(
provider.get_quote(symbol, side, qty),
timeout=2.0
)
return quote
except (asyncio.TimeoutError, LPError) as e:
logger.warning(f"LP {provider_name} failed: {e}")
await self.mark_unhealthy(provider_name)
if self.fallback_amm:
return await self.fallback_amm.get_quote(symbol, side, qty)
raise NoLiquidityAvailable("All LP providers failed")
Additionally, we configure heartbeat monitoring: if a provider does not respond for 5 seconds, we automatically exclude it from rotation and notify the on‑call engineer.
Aggregating Liquidity from Multiple Providers
Note: when connecting several LPs, you need to aggregate quotes and select the best. The LiquidityAggregator class implements collection and filtering of stale quotes:
class LiquidityAggregator:
def __init__(self, providers: list[BaseLPClient]):
self.providers = providers
self.quotes: dict[str, list[LPQuote]] = {}
def on_quote_update(self, quote: LPQuote):
symbol = quote.symbol
if symbol not in self.quotes:
self.quotes[symbol] = []
self.quotes[symbol] = [
q for q in self.quotes[symbol]
if q.provider != quote.provider
]
self.quotes[symbol].append(quote)
def get_best_bid_ask(self, symbol: str) -> BestBidAsk:
quotes = self.quotes.get(symbol, [])
valid = [q for q in quotes if not q.is_stale()]
if not valid:
return None
best_bid = max(valid, key=lambda q: q.bid)
best_ask = min(valid, key=lambda q: q.ask)
return BestBidAsk(
bid=best_bid.bid,
bid_size=best_bid.bid_size,
bid_provider=best_bid.provider,
ask=best_ask.ask,
ask_size=best_ask.ask_size,
ask_provider=best_ask.provider,
spread_bps=int((best_ask.ask - best_bid.bid) / best_bid.bid * 10000)
)
What Is Smart Order Routing and How Does It Work?
The SmartOrderRouter selects the best provider for an order. For market orders, we use splitting (TWAP) to avoid slippage:
class SmartOrderRouter:
def route(self, order: ClientOrder, aggregator: LiquidityAggregator) -> RoutingPlan:
available = aggregator.get_all_quotes(order.symbol)
if order.type == 'market':
return self.route_market(order, available)
elif order.type == 'limit':
return self.route_limit(order, available)
def route_market(self, order: ClientOrder, quotes: list[LPQuote]) -> RoutingPlan:
remaining = order.quantity
plan = []
sorted_quotes = sorted(
quotes,
key=lambda q: q.ask if order.side == 'buy' else -q.bid
)
for quote in sorted_quotes:
if remaining <= 0:
break
fill_qty = min(remaining, quote.ask_size if order.side == 'buy' else quote.bid_size)
plan.append(RoutingLeg(
provider=quote.provider,
quantity=fill_qty,
expected_price=quote.ask if order.side == 'buy' else quote.bid
))
remaining -= fill_qty
if remaining > 0:
raise InsufficientLiquidity(f"Could not route full order, {remaining} remaining")
return RoutingPlan(legs=plan, total_quantity=order.quantity)
More on SOR principles can be found on Wikipedia.
What to Choose: CEX LP or DEX/AMM?
Aggregated CEX LP (B2Broker) gives spreads of 0.01–0.05% for top pairs, but requires KYB and monthly volume. DEX/AMM (Uniswap) requires no KYC and is available for any tokens, but spreads can be higher (0.05–1%) and there is impermanent loss risk when using your own pool. The best strategy is to combine: major pairs via CEX LP, long‑tail via DEX. Spread savings can reach 50% compared to market orders without SOR. Average LP integration cost for an exchange ranges from $20,000 to $100,000 depending on complexity, number of providers, and latency requirements.
Process Overview: From Request to Production
The process includes: analytics (1–2 days), design (2–3 days), implementation (1–2 weeks), testing (3–5 days), deployment (1–2 days), and ongoing support. We can assess your project within one day — get in touch for a consultation. Order a turnkey LP integration and receive a ready architecture in 2–4 weeks. Get a production‑ready LP integration with 99.95% uptime guarantee.







