Skip to content

How CLV grading works

Send the prices you took; get CLV against the close.

Last updated 20 October 2026.

Each price you send POST /v1/clv (with its taken_at) comes back with CLV, whether it was on offer, and our fair price at that time. Reference: docs.

Takeable grading: Being finalised: sections 3 to 5 describe how takeable grading will work on Pro. Until it is switched on, every graded price says takeable: "unchecked" and takeable_basis is null. CLV and the fair price at taken_at are served now.

1

CLV against the close

clv = odds × (1 / consensus_close) − 1, as a fraction (0.05 = 5 % better than the close). The close is the same consensus closing price /v1/closeserves for that selection: the margin-free probabilities of at least 3 independent sources’ last prices before kick-off, one vote per odds desk. With fewer than 3 there is no close and no grade (no_consensus), never an estimate.

2

Checks before a grade

  • taken_at is required, as ISO 8601 with a timezone. Without it a price is invalid.
  • A price taken less than 60 seconds before kick-off, or later, is not graded (taken_after_kickoff): the close is the last price, and a price in its last minute shows nothing about it.
  • A price more than 25 % above the margin-free closing price is not graded (implausible_price).
  • Only a finished match is graded. A postponed or cancelled match has no close; a match that has not finished yet is graded once it has (not_closed_yet).

3

Was the price seen at our sources?

For every graded price we look up the state of each of our input sources at taken_at: the last price we logged for that selection at or before that time, and whether the selection was open. Sources on the same odds desk count as one. We compare your price with the best open price among them (it is never served) and answer with a band in takeable:

  • seen, seen at our sources: at least one of our sources had an open price at or above yours.
  • near, near our sources’ best price: your price is above the best, by at most 4 %.
  • not_seen, not at our sources: your price is more than 4 % above the best, or none of our sources had the selection open.
  • unknown: fewer than 3 of our sources have a known state at that time and your price was not seen (takeable_reason: thin_coverage; we make no negative claim from thin coverage), none is known (too_few_sources), or the check limit below was reached. We do not guess.

Our sources are the European bookmakers our consensus is built from: a bet at a book we don't collect can show "not at our sources".

When a source’s price counts as known. When taken_atfalls inside a stretch of our continuous reads of that source’s market, or its last read ended at most 900 seconds (15 minutes) before taken_at; or when taken_at lies between two of our reads of it that are at most twice its normal polling interval apart (at most 2 hours) and the price did not change between them. Otherwise that source is not used.

Why bands, and why a check limit. A yes or no against an exact price would let a series of checks find that price. The bands and the limit of 2 checksper selection answer the question a grader needs without giving away any one source’s price.

Our input sources are not every bookmaker. The answer is indicative and only about the sources we observe; it says nothing about any other book.

4

Pro only, two checks per selection

  • Takeable grading is part of the Pro and Business plans. On other plans takeable is unchecked with takeable_reason: plan; CLV and the fair price at taken_at are still graded.
  • Each account can have at most 2 different prices checked for the same fixture, market, line and selection, over all time and all keys of that account. Sending the same price again does not count. Further prices come back unknown with takeable_reason: probe_limit.

5

The takeable fields

  • takeable_basis.n_sources: how many independent sources had a known state at taken_at (4 means 4 or more).
  • takeable_basis.max_read_age_s: seconds between taken_atand the oldest of those sources’ last reads; 0 when taken_at falls inside continuous reads.
  • takeable_reason: why the answer is unknown or unchecked (plan, probe_limit, too_few_sources, thin_coverage, unavailable, no_account); null otherwise.

These fields are null unless the status is graded.

6

Fair price at taken_at

fair_at_taken_at is our fair price for the selection as it stood at taken_at: the figure /v1/fair?as_of= serves for that time (figures are published on a 5-minute grid, so the time is taken down to the 5 minutes). You can check it with that call. Null when we had no figure then, when it was withheld, or when we cannot show it was still being re-checked at that time (we do not present a figure nobody was checking as the fair price then).

edge_vs_fair_at_taken_at_pct = (odds / fair_at_taken_at − 1) × 100, 2 decimal places: your price against our fair price at the moment you took it. CLV compares the price with the close; this compares it with the fair price at the time. Both are measurements of the price, not forecasts.

7

Why no source is named

The API serves derived figures, not bookmakers’ prices. So the evidence behind takeableis given as a count and a read age, never as a list of who offered what, and never as any one source’s price: the price your odds are compared with is used to reach the answer and is not served. The same rule holds for every figure we serve.

8

What a grade is not

  • Not a verification of a betting record. takeable: seensays the price was seen at our sources at the time you sent; it does not show that you took it. The terms forbid presenting a grade as "verified by OddsIntel".
  • Not betting advice, and not a forecast of results.

Questions about a grade: [email protected].