# Matched-board filters

> The four filters and the kick-off window on the six matched boards: caps, the trimming rule and dutching.

## One route per board

GET /v2/odds/{board} serves `standard`, `2up`, `dutching`, `each-way`, `extra-place` and `bog`. There is one route per board and no event-id filter on them: per-event reads use GET /v2/odds/event/{id}.

## The filters and their caps

Values are comma-separated and lowercased. /v2/sports and /v2/bookmakers list the values.

- sports, at most 20: a sport key or a prefix of one (`soccer`, `soccer_epl`).
- bookmakers, at most 40: keeps back offers from those bookmakers.
- exchanges, at most 4: keeps lay offers from those exchanges, each-way win and place included.
- markets, at most 20: keeps those markets.
- commenceTimeFrom and commenceTimeTo: the kick-off window, ISO-8601 UTC. The window is never priced.

## The trimming rule

A filtered reply is the whole board filtered by hand. Events are cut by sport and kick-off, then markets, then back offers by bookmaker and lay offers by exchange. An outcome left without a back offer, or without a lay offer, goes; then empty markets, then empty events. Event order stays kick-off, then id.

On dutching a dutch is kept only when every one of its legs is a named venue. A call that leaves nothing is an empty reply, and free.

## Unknown and absent values

A value the catalogue doesn't know is a 400 (`unknown_sport`, `unknown_market`, `unknown_bookmaker`, `unknown_exchange`) listing the valid ones in `valid`. A known value with nothing on the board today is an empty 200, free. A bookmaker outside the call's region is 403 `bookmaker_not_in_region`.

## No per-price time stamp

Matched offers carry no time of their own. The board's time is meta.processed_at, and meta.last_seen gives each venue and sport's last read. The freshness guide covers both.

Source: https://oddsrelay.io/docs/guides/matched-board-filters · the API contract: https://api.oddsrelay.io/v2/openapi.json
