> ## Documentation Index
> Fetch the complete documentation index at: https://docs.routeur.app/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> Prices are US dollars per contract that pays $1: 0.46 means 46 cents. Spread is the Yes ask plus the No ask minus $1. Liquidity grades are deep, tradeable and thin; lists hide thin markets unless include_thin=true. Relations are proven from contract terms, never inferred from wording; a lead marked informational is never executable. Every figure carries a graph_run; read /agents/reading-order first, then /concepts/relations and /concepts/liquidity.

# Liquidity

> How much a market trades, what a round trip costs, and how that grades what the API suggests.

A price nobody can trade at is not a price. Every object that names a market carries the money behind it: what traded in the last 24 hours, what is held, what a round trip costs, and a one-word grade. Lists that suggest something to act on leave `thin` markets out unless you ask for them.

## Volume

| Field               | Meaning                                                    |
| ------------------- | ---------------------------------------------------------- |
| `volume_24h_usd`    | Traded in the last 24 hours, in USD.                       |
| `volume_source`     | Where that figure comes from: `venue` or `trades`.         |
| `total_volume_usd`  | Traded over the market's life, where the venue reports it. |
| `open_interest_usd` | Contracts currently held, at face value. Kalshi only.      |
| `trades_24h`        | Public fills Routeur recorded in the last 24 hours.        |

`volume_24h_usd` prefers the venue's own 24-hour figure. When a venue publishes none, it falls back to the notional of the fills Routeur recorded, and `volume_source` says which you got:

| `volume_source` | Figure                                                                                                                                   |
| --------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| `venue`         | The venue's own 24-hour volume. Kalshi counts contracts at their \$1 face value, as its own site does; Polymarket reports USDC notional. |
| `trades`        | Price × quantity summed over the public fills recorded in the last 24 hours.                                                             |

Where both venues list one outcome (an event's `twin`), volumes and open interest add up and the spread is the better of the two, because that is the venue the outcome would be traded on.

## Spread

Spread is the round trip: what it costs to buy a contract and sell it straight back, in dollars of the \$1 it pays.

| Field            | Meaning                                                |
| ---------------- | ------------------------------------------------------ |
| `spread_usd`     | Yes ask + No ask − \$1. Absent when a side has no ask. |
| `yes_spread_usd` | Yes ask − Yes bid, where the venue publishes a bid.    |
| `no_spread_usd`  | No ask − No bid.                                       |

Buying Yes at 55¢ and buying No at 46¢ costs $1.01 for a pair that pays $1, so the round trip is 1¢. The per-side spreads say the same thing from one ladder: on a venue that matches Yes bids against No bids, all three are usually equal.

## Grades

`liquidity` is `deep`, `tradeable` or `thin`, from the fields above:

| Grade       | 24-hour volume **or** open interest       | Round trip                   |
| ----------- | ----------------------------------------- | ---------------------------- |
| `deep`      | at least $25,000 traded, or $250,000 held | 2¢ or less                   |
| `tradeable` | at least $1,000 traded, or $25,000 held   | 5¢ or less                   |
| `thin`      | anything less                             | any, or no quoted round trip |

Both conditions must hold for a grade: a market that traded \$30,000 with a 4¢ round trip is `tradeable`, not `deep`. Open interest stands in for a market that is held rather than churned: a large book with a quiet day is still somewhere size can be moved. A market with no round trip, because one side has no ask, is `thin` however much it traded, since nothing can be bought and sold back at a price we know.

The grade is computed when a response is built, from the latest crawl's asks. On `GET /v1/markets/{venue}/{id}/book` the recorded book's own spread grades the market instead, because it is fresher than the crawl.

## What is filtered by default

Lists that suggest something to look at keep only markets that are at least `tradeable`, and rank what is left by the money behind it. The filter is applied inside the query, so a thin market is never read only to be dropped:

| Endpoint                                  | What it lists                                  |
| ----------------------------------------- | ---------------------------------------------- |
| `GET /v1/opportunities`                   | Leads                                          |
| `GET /v1/insights`                        | The overview: gaps, movers, flows and the rest |
| `GET /v1/insights/moves`                  | What is moving                                 |
| `GET /v1/insights/tape`                   | Large fills                                    |
| `GET /v1/insights/flows`                  | One-sided money                                |
| `GET /v1/insights/closing`                | Closing soon                                   |
| `GET /v1/insights/strategies` and `/{id}` | Strategy matches                               |

Search and event listings do not filter: they show thin markets, ranked below the ones that can be traded.

Three parameters change the floor wherever it applies:

| Parameter        | Default | Effect                                                                                                                                     |
| ---------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| `min_volume_usd` | `1000`  | Only markets that traded at least this much in the last 24 hours (or, where the venue's figure is missing, whose recorded fills total it). |
| `max_spread_usd` | `0.05`  | Only markets whose round trip costs at most this. Requires both asks to be quoted.                                                         |
| `include_thin`   | `false` | `true` drops both floors and shows every market.                                                                                           |

`include_thin=true` resets both floors to zero; either bound can then be set again explicitly, so `include_thin=true&max_spread_usd=0.10` shows everything with a round trip of 10¢ or less, whatever it traded.

```bash theme={null}
# Movers with real size only: $25,000 traded and a 2¢ round trip
curl "https://api.routeur.app/v1/insights/moves?min_volume_usd=25000&max_spread_usd=0.02" \
  -H "X-API-Key: $ROUTEUR_API_KEY"
```

<Warning>
  Passing `min_volume_usd=0` alone keeps the 5¢ spread floor; passing `include_thin=true` is what removes both.
</Warning>

## Book depth fields

Where a market's order book is recorded (see [Order books](/concepts/order-books)), five more fields come from the book itself, not the crawl:

| Field                   | Meaning                                                                                                                     |
| ----------------------- | --------------------------------------------------------------------------------------------------------------------------- |
| `book_spread_usd`       | Best Yes ask − best Yes bid.                                                                                                |
| `book_yes_depth_5c_usd` | USD resting to buy Yes within 5¢ of the best Yes bid.                                                                       |
| `book_no_depth_5c_usd`  | USD resting to buy No within 5¢ of the best No bid, which is money waiting to sell Yes.                                     |
| `book_imbalance`        | (Yes depth − No depth) / (Yes depth + No depth) over those 5¢ windows, from −1 (all the money is on No) to +1 (all on Yes). |
| `book_at`               | When the recorded book last changed.                                                                                        |

They are omitted for markets with no recorded book, and can be older than the crawl's asks for markets in the polled tier. Compare `book_at` with `quote.observed_at` when it matters.

## Example

An MLB total on Kalshi, read from `GET /v1/markets/kalshi/KXMLBTOTAL-26SEP171235MILPIT-9/book` (liquidity fields only):

```json theme={null}
{
  "volume_24h_usd": "16742.70",
  "volume_source": "venue",
  "total_volume_usd": "16966.44",
  "open_interest_usd": "15593.36",
  "spread_usd": "0.01",
  "yes_spread_usd": "0.01",
  "no_spread_usd": "0.01",
  "trades_24h": 94,
  "liquidity": "tradeable",
  "book_spread_usd": "0.01",
  "book_yes_depth_5c_usd": "56704.17",
  "book_no_depth_5c_usd": "72750.02",
  "book_imbalance": "-0.124",
  "book_at": "2026-09-17T12:42:01.052454Z"
}
```

$16,743 traded and a 1¢ round trip: tradeable, not deep, because it is short of the $25,000 the top grade needs. $57,000 rests within 5¢ on the Yes side and $73,000 on the No side, so the book leans slightly toward sellers of Yes.

## Related

* [Order books](/concepts/order-books): where the `book_*` fields come from.
* [Leads](/concepts/leads): why only tradeable markets become opportunities, and how `depth` sizes them.
* [Quotes and trades](/concepts/history): the asks and fills the figures are read from.
* [Data freshness](/freshness): how old each figure can be.
