Methodology
SwapBench continuously polls each provider's quote API on a fixed schedule (a "round", every 5 minutes by default) for a given chain, token pair and amount, then ranks providers on four metrics.
Scoring · % of Best
Rather than only counting outright wins (which collapses to 100% for one provider and 0% for everyone else), we score how close each provider is to the best one in every round, then average across the window. A score of 100% means the provider was the best (or tied) that round; a slightly worse quote scores slightly below 100%, so the real gap is visible.
- Price & Latency — ratio to the round's best (
value / bestfor price,best / valuefor latency). If the top output is 10 and a provider quotes 9.9, it scores 99%.
Providers with no comparable value for a metric are shown as n/a rather than scored.
Metrics
- Latency — wall-clock milliseconds to receive a quote (lower is better), measured from a persistent worker with keep-alive so cold-connection time doesn't pollute the number.
- Price — the quoted output amount, normalized to human units of the buy token. The highest output wins. Only compared within a chain group.
- Accuracy — how close the quoted output is to what the swap actually produces. See the tiers below.
- Stability — the share of rounds in which the provider returned a usable quote (HTTP 2xx, liquidity available, positive output). Errors, timeouts and rate-limits count as failures.
Accuracy tiers (honest by design)
True accuracy requires the quote's executable calldata, which only some APIs return. We never fabricate a number:
- on-chain — for 0x on EVM ERC20 pairs (e.g. USDC → WETH): we take 0x's returned transaction and simulate it on-chain (
eth_simulateV1) against current chain state, measuring the real balance delta. Accuracy = |(executed − quoted) / quoted| in bps. - spread — when only a slippage floor is exposed (Jupiter's
otherAmountThreshold): the gap between the quote and its guaranteed floor. Labeled as a proxy, not an execution measurement. - n/a — when a provider returns neither calldata nor a slippage floor (Chainworks), accuracy is shown as n/a rather than guessed.
Providers & the cross-chain problem
0x quotes EVM chains, Jupiter quotes Solana, and Chainworks quotes native-asset ↔ token swaps on both. Because the chains share no liquidity, providers are only ranked within a chain group: 0x vs Chainworks on EVM, Jupiter vs Chainworks on Solana. The benchmark pair is "sell N USDC for the chain's native asset" (USDC → ETH/BNB on EVM, USDC → SOL on Solana) — the one shape all three can quote.
- 0x — Swap API v2 (
/swap/allowance-holder/quote) on EVM chains. - Jupiter — Swap API v1 (
lite-api.jup.ag) on Solana. - Chainworks (WS) — the Socket.IO transport (
api.chainworks.co), native ↔ token, on both EVM and Solana. - Chainworks (HTTP) — the same aggregator over its REST transport (
POST /{evm|svm}/{buy|sell}/quote). Benchmarked as a separate entry so the two transports can be compared head-to-head (notably on latency) for the identical backend.
The amount parameter
?amount= is the sell amount in 6-decimal USDC base units: 500000000 = 500 USDC, 50000000000 = 50,000 USDC. On chains where USDC has different decimals (BSC), the notional is rescaled automatically.
Extensible by design
New aggregators can be added without changing the methodology: each provider declares which chains it supports, and the dashboard renders whatever chain groups exist.
All providers are benchmarked using their standard API configuration. No fees waived or negotiated.