---
title: "Get Protocol Slippage Scores"
method: GET
path: "/api/v1/protocols"
tags: ["Execution Benchmarks"]
---

# Get Protocol Slippage Scores

`GET /api/v1/protocols`

## Request

- Base URL: `https://cleartracedata.com` (the document declares no server; this is the origin it was published from)
- URL: `https://cleartracedata.com/api/v1/protocols`
- Auth: none declared

**Public API: Returns a ranked list of protocols by Slippage Score.**

The Slippage Score (0-100) is derived from each protocol's **median realized
slippage** versus a minute-level off-chain reference price (`100 - slippage_bps`,
clipped), so a higher score means lower slippage. The reference price is Dune
`prices.usd`, which Dune documents as a view of its Coinpaprika feed of
exchange-aggregate market data at 5-minute intervals, interpolated to the minute.
It is not a VWAP and it is not an on-chain price.

Scores are available **per chain**. Pass `?chain=arbitrum` (or `base`,
`optimism`, `ethereum`) for a single-chain ranking, or omit it for the
blended cross-chain rollup (`chain=all`). Per-chain scores differ from the
blend — a protocol's execution quality is not uniform across chains.

This is a **slippage-only** metric. MEV (sandwich) exposure and transaction
revert rates are tracked as **separate** metrics — they are NOT folded into
this score. Use `median_abs_gap_bps` for the raw underlying figure. (`avg_slippage_bps` is
the same number under a deprecated name that wrongly says "average"; it is
served until 2027-03-31.)

**Absence is a statement.** A protocol missing from this list either sits under
the 1,000-transaction floor, or was withdrawn because its measurement is not an
execution cost. Withdrawals are **per chain**, so a venue can be published on
one chain and withdrawn on another. Withdrawn on 2026-09-09:

* `swaap` (every chain) — in 40 of 40 sampled transactions no party to the
  trade held any of the traded tokens. An arbitrage population with no trader
  in it; the figure was the distance between a bot's fill price and the oracle.
* `1inch-LOP` (every chain) — 38% of fills are one market maker at a flat
  −8.41 bps, whose maker-side edge `ABS()` folded in as if it were taker cost.
  That **flattered** the venue: 13.27 bps as published, 29.73 over the
  population that is left. A blend of the two is not a taker cost.
* `dodo` on **arbitrum** and in the cross-chain `all` blend — 45.8% of the
  arbitrum cell is a staking vault rebalancing itself. **`dodo` on ethereum is
  unaffected and still published**; the `all` row goes only because a median
  over pooled fills cannot have one chain subtracted from it.

## Query parameters

- `chain` 'all' | 'ethereum' | 'base' | 'arbitrum' | 'optimism': Chain scope: 'all' (blended cross-chain rollup, the default) or a single chain.
- `limit` integer: The maximum number of top protocols to return.
- `offset` integer: Pagination offset.

## Response `200`

A ranked array of protocols and their slippage-based execution scores.

- ProtocolsResponse
  - `protocols` ProtocolScore[], required: Protocols ordered by median_abs_gap_bps ascending (equivalently by Slippage Score, highest first). ⚠ THIS ORDER IS NOT A RANKING OF EXECUTION COST and must not be presented as one. The figure it sorts on is a median ABSOLUTE gap, so it includes the minute oracle's own dispersion and any integrator fee charged inside the fill: a venue whose true cost is below that dispersion sorts to the TOP on a number that is not a cost it charged. Read signed_median_bps and dispersion_ratio for each venue before ordering them by quality, and see exec-slippage-includes-integrator-fees-and-drops-sign-2026-09-09 in app/metric_findings.json.
    - `name` string, required: The name of the protocol or aggregator.
    - `category` string, required: The category of the protocol (e.g., Aggregator, DEX, Bridge).
    - `median_abs_gap_bps` number, required: Median ABSOLUTE gap between the minute-oracle USD value of the token received and of the token given, in basis points (lower is better). The minute oracle is an OFF-CHAIN reference price, Dune prices.usd, documented by Dune as a view of its Coinpaprika feed of exchange-aggregate market data at 5-minute intervals, interpolated to the minute. It is NOT a VWAP, whatever older copy said. This is the correctly named field for the figure `avg_slippage_bps` has always carried: the two are IDENTICAL IN VALUE and this one describes the quantity. It is a MEDIAN, not a mean, and it is a median of the ABSOLUTE gap, so it is not a signed execution cost -- read `signed_median_bps` for the venue's central tendency and `dispersion_ratio` for how much of this figure is the oracle's own dispersion. Read the three limits before ranking venues on it. (1) It includes explicit integrator FEES: a fee charged inside the fill is indistinguishable from execution cost here and is published as execution cost. (2) It discards DIRECTION: the gap is absolute, so a venue whose takers systematically receive MORE than oracle value reads the same as one whose takers lose. (3) It has a NOISE FLOOR: for a gap distribution centred near zero, the median of the absolute value equals the 75th percentile of the signed gap, so a venue whose true cost is below the minute oracle's own dispersion publishes that dispersion instead of a cost -- low single-digit values rank venues by how quietly their token pairs are priced, not by execution. Registered as exec-slippage-includes-integrator-fees-and-drops-sign-2026-09-09 in app/metric_findings.json.
    - `avg_slippage_bps` number, required: DEPRECATED, use `median_abs_gap_bps` instead. Identical value, kept for backward compatibility, and served until 2027-03-31. THIS IS NOT AN AVERAGE: the name says mean and the quantity is APPROX_PERCENTILE(ABS(gap), 0.5), a MEDIAN of an ABSOLUTE gap. Two independent readers took the name at face value on 2026-09-25 -- one quoted a spread across it as an execution cost in outreach copy, the other concluded from the same endpoint that it was a mean -- so the name is not a cosmetic problem, it is the field's primary failure mode. `median_abs_gap_bps` carries the full definition, including that the baseline is Dune prices.usd and is NOT a VWAP (finding exec-slippage-baseline-is-not-a-vwap-2026-09-25). Read the three limits before ranking venues on it. (1) It includes explicit integrator FEES: a fee charged inside the fill is indistinguishable from execution cost here and is published as execution cost. (2) It discards DIRECTION: the gap is absolute, so a venue whose takers systematically receive MORE than oracle value reads the same as one whose takers lose. (3) It has a NOISE FLOOR: for a gap distribution centred near zero, the median of the absolute value equals the 75th percentile of the signed gap, so a venue whose true cost is below the minute oracle's own dispersion publishes that dispersion instead of a cost -- low single-digit values rank venues by how quietly their token pairs are priced, not by execution. Registered as exec-slippage-includes-integrator-fees-and-drops-sign-2026-09-09 in app/metric_findings.json.
    - `slippage_score` number, required: Slippage Score from 0.0 to 100.0, derived as 100 - median slippage (bps), clipped to [0,100] — higher means lower slippage. Inherits every limit documented on median_abs_gap_bps, including that it scores integrator fees as execution cost. SATURATES: any venue above 100 bps scores 0 and any below 0 bps scores 100, so within those groups the score cannot separate venues — read median_abs_gap_bps for the true magnitude and ordering. This is a slippage-only metric; MEV exposure and revert rates are reported separately.
    - `total_trades_analyzed` integer, required: The number of trades analyzed to compute this score.
    - `signed_median_bps` number, nullable: Estimated SIGNED median gap in basis points, positive when takers pay and negative when they receive more than oracle value. This is the venue's central tendency; median_abs_gap_bps above is the median of the ABSOLUTE gap and is a different quantity. A measured percentile since execution_slippage.sql v3.0 (2026-09-23); read signed_median_measured to tell. On rows written before that deploy it falls back to interpolating (p25+p75)/2 from the quartiles, which can be off by several bps and can invert the sign. null when unmeasured, never 0.0.
    - `dispersion_ratio` number, nullable: How many times larger the published median_abs_gap_bps is than signed_median_bps. 1.0 means the published figure IS the cost. A large value means it is mostly the minute oracle's own dispersion, converted into apparent cost by the absolute value: for a gap distribution centred on zero, median(|x|) equals p75(x) exactly. On the 2026-09-22 data dodo/ethereum reads about 8.6 here while uniswap's aggregator figure reads about 1.08. NO THRESHOLD IS APPLIED AND NONE IS IMPLIED: the ratio is reported so the reader can judge, and null means the signed median is too close to zero to divide by, which is the most dispersion-dominated case of all rather than a clean one.
    - `slippage_direction` string, nullable: 'cost' when takers pay on balance, 'gain' when they receive more than oracle value on balance, null when unmeasured. A venue whose takers gain on balance, published as if it charged a cost, is sign-wrong; the venues where that dominates (swaap, 1inch-LOP, tokenlon, dodo on arbitrum) are already withdrawn from this endpoint.
    - `signed_median_measured` boolean, nullable: TRUE when signed_median_bps is a measured percentile (execution_slippage.sql v3.0, deployed 2026-09-23). FALSE means it was interpolated from the signed quartiles as (p25+p75)/2, which assumes a symmetry these distributions do not have: measured against the true median over 103 live cells the interpolation was off by a median of 2.44 bps, and it can invert the SIGN, so slippage_direction and dispersion_ratio derived from it may be wrong. Treat a false here as an estimate, not a measurement.
    - `pct_positive` number, nullable: Share of scored fills where the taker paid (the gap was positive). Near 50 means the signed distribution straddles zero, so the published absolute median is measuring spread rather than a systematic cost.
  - `total` integer, required: Total number of protocols available.
  - `chain` string: The chain scope of these scores: 'all' is the blended cross-chain rollup; otherwise a single chain (ethereum, base, arbitrum, optimism).
  - `limit` integer, required: The maximum number of protocols returned.
  - `offset` integer, required: The offset used for pagination.

---

[API](https://skmtc.dev/cleartracedata/apis/cleartrace-api.md) · [All operations](https://skmtc.dev/cleartracedata/apis/cleartrace-api/llms.txt) · [OpenAPI document](https://skmtc.dev/cleartracedata/apis/cleartrace-api/revisions/2073a5a38ab5?raw)
