Corners & Cards Odds API: The Three-Day Clock on Side Markets

Corners & Cards Odds API - OddsPapi API Blog
How To Guides August 27, 2026

Query a football fixture a week before kickoff, look for corner totals, and you get nothing. Look for booking markets and you get nothing again. Most developers conclude the feed does not carry them and move on.

It does carry them. On Valencia against Real Betis, Pinnacle opened the three-way on 6 July, 50 days before kickoff. It opened the corner market on 23 August at 06:01 UTC, two and a half days out. It opened bookings on 24 August at 16:16 UTC, just over a day out. Same fixture, same book, three different clocks.

Side markets in this feed run on a schedule you can set a timer by. This guide measures that schedule, shows which books price corners and cards on which competitions, and gives you the two parsing guards that stop a corner ladder from reading as free money. Everything below comes from live calls made on 24 August 2026 against the OddsPapi free tier and its 350+ bookmakers, across 30 fixtures in ten competitions: the Premier League, LaLiga, Serie A, Ligue 1, the Bundesliga, the Champions League, the Europa League, the Championship, the Eredivisie and the Brasileiro Serie A, three fixtures each.

What the board actually looks like

One number frames everything else in this guide. On 24 August 2026 those 30 fixtures returned 1,762,429 prices between them.

Measure 30 fixtures, 24 August 2026
Books on a fixture 178 median, 161 min, 195 max
Books quoting corners 92 median, 50 min, 156 max
Books quoting cards or bookings 0 min, 138 max
Distinct market IDs per fixture 560 median, 859 max
Corner markets per fixture 3,044 median, 6,769 max
Side-market families 22 corners, 21 bookings, 2 player-card
Prices active 86.0% median

The spread on those minimums and maximums is not a league quality ranking. It is the clock. A fixture two days from kickoff carries corner and card markets; a fixture six days out does not, and it is the same competition either way.

The market-open clock

/historical-odds records the first time each market was seen, so the open time of every market family is recoverable at no cost. Across the 30 fixtures:

Pinnacle market family Median open Range Fixtures with it
Match markets (1X2, totals, handicap) T-6.07 days fixture-dependent, see below 30 of 30
Corners T-2.77 days 1.00 to 4.00 days 10 of 30
Bookings T-1.11 days 1.06 to 2.08 days 3 of 30

Corners never opened earlier than 4.00 days out on any fixture in the sample, and the 20 fixtures with no corner market were all more than four days from kickoff. That is the whole story: the market was not missing, it had not opened yet.

The match-market number needs a label, because it is the one figure here that moves. The median match open on this regular round was 6.07 days, but the spread is enormous. Valencia against Real Betis opened 50.50 days out and Bayern against Stuttgart 53.45 days out, while Crystal Palace against Manchester City opened 5.98 days out and AC Milan against Venezia 5.16 days out. Match markets open anywhere from six days to eight weeks ahead depending on the fixture. Corners hold at about three days and bookings at about one day regardless. Never quote a single median for match markets without saying which kind of fixture it came from.

The full wave structure on one fixture makes the pattern obvious. Malaga CF against Deportivo, kickoff 24 August 19:30 UTC, with the corner open landing on 3.00 days to the minute:

Wave Opened Lead time What arrives
1 14 Aug 04:42 T-10.62 days Asian Handicap, Full Time Result, Over Under, first-half versions, team totals
2 17 Aug 14:28 T-7.21 days Correct score, HT/FT, double chance, BTTS, win to nil, draw no bet, odd/even, exact score, winning margin
3 21 Aug 19:31 T-3.00 days Corners, 6 families
4 23 Aug 18:01 T-1.06 days Bookings, 5 families

Two practical consequences. Polling for corners more than five days out wastes calls on every football fixture you track. And a coverage audit run a week ahead will tell you corners do not exist, which is how the “the feed has no corner data” belief survives.

Old way vs OddsPapi

Job Scraping or a mainline-only API OddsPapi
Corner totals Not exposed, or one book A median of 92 books, 22 corner market families
Booking markets Almost never carried Bookings 1X2, handicap, totals and player-carded
Sharp corner price Pinnacle has no public API pinnacle slug with published limits
When a market opened You would have to log it yourself /historical-odds on the free tier
Line ladders Flattened to one number One market ID per rung, native
Live updates Poll and hope WebSocket feed

Step 1: Auth and the catalogue lookup

The key is a query parameter, never a header. Market IDs are integers and the names live in /v4/markets, so build a lookup once and keep it. Do not hardcode corner market IDs. There is one ID per line, and the lines move.

import requests, time
from collections import Counter, defaultdict
from datetime import datetime

API_KEY = "YOUR_API_KEY"
BASE_URL = "https://api.oddspapi.io/v4"
SESSION = requests.Session()

def api(path, **params):
    """GET a v4 endpoint. Honours 429 retryMs. Treats 404 as an empty result."""
    params["apiKey"] = API_KEY
    for _ in range(6):
        r = SESSION.get(f"{BASE_URL}{path}", params=params, timeout=600)
        if r.status_code == 429:
            time.sleep(r.json().get("error", {}).get("retryMs", 1500) / 1000 + 0.3)
            continue
        if r.status_code == 404:
            return None
        r.raise_for_status()
        return r.json()
    raise RuntimeError(f"gave up on {path}")

def catalogue(sport_id=10):
    return {str(m["marketId"]): (m["marketName"], m.get("handicap"), m.get("period"))
            for m in api("/markets", sportId=sport_id)}

def family(name):
    if "Bookings" in name or "Card" in name:
        return "bookings"
    if "Corners" in name:
        return "corners"
    return "match"

The soccer catalogue holds 32,815 rows. The sportId parameter is a no-op, so treat the response as a global name lookup rather than a way to discover which markets a sport supports.

Step 2: The two guards that stop a fake arbitrage

Corner ladders break naive de-vig code in two separate ways, and both produce a two-leg sum under 100% that reads as free money. Across the 24 August 2026 sample, 102 of 17,314 two-sided corner quotes summed to 100% or less. Of those, 74 were whole-number lines and 28 were Corners - 1X2. Two causes, two guards.

The first is a three-way market wearing a two-way name. Corners - 1X2 has three outcomes: more home corners, level, more away corners. Its first-half and second-half variants ship only two of the three. Grab “the priced legs” and sum them and you get a 6% arbitrage that does not exist.

The second is a whole-number line. A corner total of exactly 10.0 pushes if the game ends on 10 corners, so the two prices legitimately sum below 100%. On Real Madrid against Real Sociedad, FanDuel quoted twelve whole-number corner totals and eight of them summed to 100% or less: 5.0 at +0.24%, 6.0 at -1.50%, 7.0 at -3.05%, 8.0 at -1.80%, 9.0 at -1.61% and 10.0 at -1.13%. Nothing is wrong with those prices. The push is missing from your arithmetic.

def two_sided(market):
    legs = []
    for outcome in (market.get("outcomes") or {}).values():
        price = (outcome.get("players") or {}).get("0")
        if isinstance(price, dict) and price.get("price") and price.get("active") is not False:
            legs.append(price["price"])
    return legs if len(legs) == 2 else None

def margin(legs):
    return sum(1 / p for p in legs) - 1

def usable_total(market, handicap):
    """Reject three-way markets and whole-number push lines before de-vigging."""
    legs = two_sided(market)
    if not legs:
        return None       # Corners - 1X2 has three outcomes
    if float(handicap) == int(float(handicap)):
        return None       # a whole line can push, so it sums below 100%
    if margin(legs) <= 0:
        return None       # one book never offers a free arb
    return legs

Pinnacle handles whole lines differently again. Its 9.0, 10.0 and 11.0 corner totals on the same fixture came back at +6.49%, +4.34% and +6.35%, so it prices the push into its own margin. Comparing a Pinnacle whole line against a FanDuel whole line without accounting for that is comparing two different bets.

Step 3: Build the corner board

def corner_totals(payload, cat, period="fulltime"):
    """{bookmaker: {line: (margin, [over, under])}} for full-time corner totals."""
    out = defaultdict(dict)
    for slug, book in (payload.get("bookmakerOdds") or {}).items():
        if book.get("suspended"):
            continue
        for market_id, market in (book.get("markets") or {}).items():
            name, hcap, per = cat.get(market_id, ("", None, None))
            if name != "Corners - Over Under Full Time" or per != period or hcap is None:
                continue
            legs = usable_total(market, hcap)
            if legs:
                out[slug][hcap] = (margin(legs), legs)
    return out

def consensus_line(board):
    votes = Counter()
    for lines in board.values():
        for line in lines:
            votes[line] += 1
    return votes.most_common(1)[0][0] if votes else None

The worked fixture for the rest of this guide is Real Madrid against Real Sociedad, id1000000872478460, LaLiga, kickoff 26 August 2026 19:00 UTC. Sampled on 24 August it returned a 30.9 MB payload from 187 books, carrying 18 distinct half-point full-time corner lines from 2.5 up to 19.5.

The consensus is the line the most books quote, and here that is 10.5, quoted by 121 of the 187 books. Next come 9.5 on 118 books, 11.5 on 112, 8.5 on 102, 12.5 on 96 and 7.5 on 73. Pinnacle quoted only 9.5 and 10.5 after the whole-line filter, which is normal: sharps quote two or three rungs near the true number while the alt-ladder books post fifteen. Its two rungs came in at 5.68% and 5.51%.

Step 4: Corners cost more than the match market

Compare each book’s margin on the consensus corner line against its own three-way on the same fixture. Across 2,276 book-and-fixture pairs in the 24 August 2026 sample, the median corner margin was 1.27 times the same book’s three-way margin, and 80% of pairs charged more for corners. In absolute terms that is a median corner margin of 8.70% against a median three-way of 6.94%.

def match_margin(book):
    market = (book.get("markets") or {}).get("101")
    if not market:
        return None
    legs = []
    for outcome_id in ("101", "102", "103"):
        price = ((market["outcomes"].get(outcome_id) or {}).get("players") or {}).get("0")
        if not isinstance(price, dict) or not price.get("price") or price.get("active") is False:
            return None
        legs.append(price["price"])
    return sum(1 / p for p in legs) - 1

On Real Madrid against Real Sociedad, 119 books quoted both the consensus corner line and a complete three-way, which is the pair count for the ratio test on this fixture. The median ratio was 1.59 and 92% of pairs charged more for corners, on a median corner margin of 8.64% against a median three-way of 5.08%. Ranked out of those 119 books, at corner line 10.5:

Rank Book Over / Under Corner margin Same book 1X2 Ratio
1 polymarket 2.174 / 1.695 5.00% 2.02% 2.47
2 duel 2.100 / 1.740 5.09% 1.90% 2.68
3 pinnacle 2.120 / 1.714 5.51% 3.91% 1.41
8 betfair-ex 2.100 / 1.710 6.10% 0.53% 11.53
18 fanduel 1.600 / 2.240 7.14% 5.87% 1.22
28 bet365 2.000 / 1.727 7.90% 7.66% 1.03
40 draftkings 2.150 / 1.625 8.05% 5.21% 1.55
57 betmgm 1.980 / 1.720 8.64% 4.84% 1.78
64 hardrockbet 1.606 / 2.150 8.78% 4.86% 1.81
103 codere.es 1.700 / 1.950 10.11% 5.43% 1.86
117 winamax.es 1.920 / 1.660 12.32% 7.04% 1.75
119 kalshi 1.695 / 1.149 46.03% 3.02% 15.24

Look at the two prediction markets. Polymarket is the tightest corner quote on the whole board at 5.00%. Kalshi is the worst of all 119 books at 46.03%, while pricing the three-way on the same fixture at 3.02%. That 46% is a placeholder rather than a price, and nothing in the payload says so. A prediction market’s tight three-way tells you nothing about its side markets, so screen every market separately before you treat any exchange quote as consensus. If you want the fair number on a corner line, take the sharp quote and strip the margin rather than trusting a mid-market average of the retail board.

Step 5: Read Pinnacle’s limits as a confidence ranking

Pinnacle publishes a capped maximum win, so dividing it back out recovers a per-market base. That base ranks how much the book wants to be on each market.

def limit_base(price_obj):
    limit, price = price_obj.get("limit"), price_obj.get("price")
    if not limit or not price:
        return None            # sbobet and US retail ship limit: null
    return round(limit if price >= 2 else limit * (price - 1))

def base_by_family(book, cat):
    out = defaultdict(list)
    for market_id, market in (book.get("markets") or {}).items():
        name = cat.get(market_id, ("",))[0]
        for outcome in (market.get("outcomes") or {}).values():
            price = (outcome.get("players") or {}).get("0")
            if isinstance(price, dict):
                base = limit_base(price)
                if base:
                    out[family(name)].append(base)
    # the headline market of a family carries the family's top base
    return {fam: max(v) for fam, v in out.items()}

Match markets always take the most. On the three fixtures in the 24 August sample where all three families were open at once:

Competition Fixture Match base Corner base Bookings base
LaLiga Malaga v Deportivo $15,000 $2,500 $750
LaLiga Valencia v Real Betis $3,750 $625 $187
Brasileiro Serie A Botafogo v Athletico PR $1,200 $100 $250

And on the fixtures where corners had opened but bookings had not:

Competition Fixture Match base Corner base
LaLiga Real Madrid v Real Sociedad $2,250 $250
Premier League Crystal Palace v Man City $1,500 $250
Ligue 1 Lille v PSG $1,000 $100
Bundesliga Bayern v Stuttgart $1,000 $100
Champions League Three playoff ties $300 $50

The match-to-corner ratio ran from 6x to 12x, with a median of 6x. The corner-to-bookings ordering is not a rule. It held at 3.3x on both LaLiga fixtures, and it inverted on the Brasileirao fixture, where bookings carried a $250 base against corners at $100. Take match above corners as reliable and probe the rest per fixture. On fixtures where the side markets had not opened at all, the match-only bases were $1,500 on Serie A, $500 on the Championship, $300 on the Eredivisie and $150 on the Europa League.

A book that takes $15,000 on the result, $2,500 on the corner count and $750 on the bookings count is telling you which of the three numbers it trusts. For more on reading limits as a signal, see the betting limits guide.

Step 6: Which competitions carry corners

Three priced fixtures in each of ten competitions, all sampled on 24 August 2026:

Competition Books on fixture Books quoting corners Books quoting cards Distinct market IDs Corner markets
LaLiga 187 to 195 132 to 156 55 to 138 741 to 859 6,007 to 6,769
Brasileiro Serie A 161 to 188 83 to 131 10 to 115 494 to 833 2,710 to 5,928
Champions League 176 to 188 116 to 121 67 to 99 767 to 782 4,574 to 5,143
Ligue 1 179 to 180 97 to 115 10 516 to 653 3,037 to 4,719
Serie A 172 to 174 102 to 103 10 to 11 488 to 528 2,969 to 3,052
Bundesliga 190 to 191 50 to 102 6 to 16 615 to 697 2,584 to 4,338
Eredivisie 165 to 168 73 to 94 0 to 3 490 to 573 2,560 to 3,723
Europa League 175 to 177 78 to 90 0 to 26 534 to 637 1,413 to 2,790
Premier League 181 to 183 58 to 87 11 to 16 454 to 665 1,562 to 3,771
Championship 172 to 173 75 10 to 14 449 to 455 1,650 to 1,801

Do not read that as a league quality ranking. The LaLiga fixtures were the closest to kickoff in the sample, which is why they top the corner and card columns, and the Premier League fixtures were further out, which is why they sit near the bottom. Sort that table by days to kickoff and it stops looking like a ranking at all.

Test coverage on a played fixture, not an upcoming one

This is the single most useful trick in this guide, and it is the reason an earlier version of this post got the next section wrong.

A live /odds call on an upcoming fixture tells you what is open right now. It cannot tell you whether a book covers a market at all. /historical-odds can, because the price history is retained after the fixture is played and the live prices are dropped. Run it on a fixture from last weekend and you see the book’s full menu instead of whatever the clock happens to have opened.

Done that way, on played fixtures from 19 to 24 August 2026:

Competition Fixture date Pinnacle corner families Pinnacle booking families
Championship 23 Aug 8 5
Championship 22 Aug 8 5
Eredivisie 23 Aug 8 0
Eredivisie 23 Aug 8 0
Brasileiro Serie A 23 Aug 8 5
Brasileiro Serie A 23 Aug 8 5
LaLiga 23 Aug 8 5
Serie A 24 Aug 8 5
Premier League 24 Aug 8 5
Champions League 19 Aug 4 0
Europa League 20 Aug 4 0

Pinnacle prices corners on all ten competitions. The split is not by country and it is not by league tier. Domestic league fixtures get eight Pinnacle corner families; European club competition gets four. The Championship and the Eredivisie carry exactly the same eight families as LaLiga.

Bookings are the narrower product. Pinnacle priced bookings on the Championship, the Brasileirao, LaLiga, Serie A and the Premier League, and did not price them on the Eredivisie, the Champions League or the Europa League.

So the rule about losing the sharp benchmark is real, but it has nothing to do with which league you picked. You lose the sharp benchmark by querying too early. Audit a Championship fixture five days out and Pinnacle looks absent from the corner market; audit the same fixture after it is played and eight families are sitting there.

Sixteen of the 22 corner families in the sample, ranked by how many books quote them:

Market family Books
Corners – Over Under Full Time 152
Corners – Over Under First Half 143
Corners – 1X2 140
Corners – Over Under Team 2 132
Corners – Over Under Team 1 131
Corners – 1X2 First Half 110
Corners – Over Under Team 1 First Half 102
Corners – Over Under Team 2 First Half 102
Corners – Over Under Second Half 90
Corners – Odd Even 69
Corners – Over Under Team 1 Second Half 69
Corners – Over Under Team 2 Second Half 69
Corners – Handicap 68
Corners – 1X2 Second Half 60
Corners – Odd Even First Half 55
Corners – Handicap First Half 44

The remaining six sit in a long tail of second-half and per-team odd/even variants, on 1 to 15 books each.

Step 7: Card and booking markets

Cards split into two products. Match-level booking counts behave like a total. Player-level “to be carded” behaves like a prop, keyed by player ID.

def card_markets(payload, cat):
    out = defaultdict(set)
    for slug, book in (payload.get("bookmakerOdds") or {}).items():
        for market_id, market in (book.get("markets") or {}).items():
            name = cat.get(market_id, ("",))[0]
            if family(name) == "bookings":
                out[name].add(slug)
    return out

def carded_players(payload, cat):
    rows = []
    for slug, book in (payload.get("bookmakerOdds") or {}).items():
        for market_id, market in (book.get("markets") or {}).items():
            if not cat.get(market_id, ("",))[0].startswith("Player To Be Carded"):
                continue
            for outcome in (market.get("outcomes") or {}).values():
                for player_id, price in (outcome.get("players") or {}).items():
                    if player_id == "0" or not isinstance(price, dict):
                        continue
                    if not price.get("price") or price.get("active") is False:
                        continue
                    rows.append((slug, price.get("playerName"), price["price"]))
    return rows

# each row is (bookmaker slug, playerName, decimal price)
# playerName arrives in "Last, First" format

On game lines players holds a single "0" key. On player-carded markets it is keyed by player ID with a playerName in “Last, First” format. Hardcoding players["0"] returns an empty result and looks like missing coverage.

Run it on a fixture close to kickoff and the volume is the point. Real Madrid against Real Sociedad returned 1,608 player-carded prices across 54 books. Malaga against Deportivo, sampled on its kickoff day, returned 621 across 60 books and carried 23 card and booking families in total from 196 books:

Market family Books
Bookings – Over Under Full Time 128
Bookings – Over Under Team 1 106
Bookings – Over Under Team 2 95
Bookings – 1X2 94
Bookings – Over Under First Half 80
Player To Be Carded 79
Bookings – Over Under Team 1 First Half 50
Bookings – 1X2 First Half 48
Bookings – Over Under Team 2 First Half 41
Bookings – 1X2 Second Half 31
Bookings – Handicap 20
Bookings – Odd Even 10

Across the whole 30-fixture sample, Bookings - Over Under Full Time appeared on 129 books and Bookings - 1X2 on 99.

Pinnacle prices bookings. On the played fixtures tested above it quoted five booking families on the Championship, the Brasileirao, LaLiga, Serie A and the Premier League, so the sharp benchmark exists on the card market too, on a majority of the competitions sampled.

One note before you de-vig a booking total. Depth on this family is a function of the clock more than anything else. On a fixture sampled on its kickoff day there were 128 books on the full-time booking count, which is more consensus than you need. On a fixture six days out the same family had not opened, and in between you get a handful of books rather than a hundred. Count the independent quotes on the fixture in front of you, and read the consensus odds guide for how many a fair number needs.

Step 8: Time your poller to the clock

def open_clock(fixture_id, kickoff, cat, slug="pinnacle"):
    data = api("/historical-odds", fixtureId=fixture_id, bookmakers=slug) or {}
    book = (data.get("bookmakers") or {}).get(slug) or {}
    ko = datetime.fromisoformat(kickoff.replace("Z", "+00:00"))
    first = {}
    for market_id, market in (book.get("markets") or {}).items():
        name = cat.get(market_id, ("",))[0]
        fam = family(name)
        for outcome in (market.get("outcomes") or {}).values():
            snaps = (outcome.get("players") or {}).get("0") or []
            if not snaps:
                continue
            t = datetime.fromisoformat(snaps[0]["createdAt"].replace("Z", "+00:00"))
            if fam not in first or t < first[fam]:
                first[fam] = t
    return {fam: (ko - t).total_seconds() / 86400 for fam, t in first.items()}

# Malaga v Deportivo
# {'match': 10.62, 'corners': 3.0, 'bookings': 1.06}

Run that on a handful of fixtures in the competition you care about and you get its own schedule rather than mine. Run it on fixtures that have already been played and you also get the book’s full menu, which a live call cannot give you. Then start polling side markets at five days out and not before. /historical-odds allows three bookmakers per call and needs roughly 4.5 seconds between successful calls, so a season of open times costs you patience and nothing else.

Corners and cards quick reference

Item Value, 30 fixtures sampled 24 August 2026
Books on a fixture 178 median, 161 min, 195 max
Books quoting corners 92 median, 50 min, 156 max
Corner market open Median T-2.77 days, never earlier than 4.00
Bookings market open Median T-1.11 days
Main corner family Corners - Over Under Full Time, 152 books
Consensus corner line 10.5 on the worked LaLiga fixture, 121 of 187 books; resolve by book count
Corner margin Median 1.27x the same book’s three-way, 80% of pairs higher
Pinnacle limit base Match 6x to 12x the corner base; corner to bookings order varies
Pinnacle corners All ten competitions tested: 8 families domestic, 4 in European club competition
Player carded Keyed by player ID, never players["0"]
Parsing guards Reject three-outcome markets and whole-number lines

Get your key

Corners and cards are the markets most odds APIs skip and most bettors price by feel. One call gives you the full ladder from a median of 92 books quoting corners, the sharp benchmark with its limits attached, and the free history that tells you when each market opened.

Get your free OddsPapi API key and run the open-clock script on your own league.

Where to go next

FAQ

Does the OddsPapi API have corner odds?

Yes. Across 30 fixtures in ten competitions sampled on 24 August 2026, full-time corner totals appeared on a median of 92 bookmakers per fixture, with 50 on the thinnest board and 156 on the deepest. The feed carries 22 corner market families covering half splits, per-team counts, handicaps and a three-way. A LaLiga fixture close to kickoff carried 6,769 corner markets. The market opens about three days before kickoff, so a query made a week ahead returns nothing.

When do corner and booking markets open?

Measured across 30 fixtures in ten competitions on 24 August 2026, Pinnacle opened corners a median 2.77 days before kickoff and never earlier than 4.00 days. Bookings opened a median 1.11 days out. Match markets have no single answer: the median on that regular round was 6.07 days, but Valencia v Real Betis opened 50.50 days out and Bayern v Stuttgart 53.45 days out. Poll side markets from five days out, not before.

Are corner odds more expensive than the match market?

Usually. Across 2,276 book-and-fixture pairs sampled on 24 August 2026 the median corner margin was 1.27 times the same book’s three-way margin, and 80% of pairs charged more for corners. The gap is not uniform across books. On Real Madrid v Real Sociedad, Kalshi was the widest corner quote of all 119 ranked books at 46.03% while its three-way sat at 3.02%, and Polymarket was the tightest at 5.00%.

Why does a corner total sum to less than 100%?

Two reasons. A whole-number line such as 10.0 pushes when the game lands on exactly ten corners, so the two prices legitimately sum below 100%. And Corners – 1X2 is a three-way market whose half variants ship only two outcomes, so pairing them is a parser bug. Across the 24 August 2026 sample, 102 of 17,314 two-sided corner quotes summed to 100% or less: 74 whole-number lines and 28 Corners – 1X2. Reject both before de-vigging.

Which bookmakers price card and booking markets?

Widely, once the market opens. On Malaga v Deportivo, sampled on its kickoff day, Bookings – Over Under Full Time appeared on 128 books, Bookings – 1X2 on 94 and Player To Be Carded on 79. Across the whole 24 August 2026 sample the full-time booking total appeared on 129 books and Bookings – 1X2 on 99. Pinnacle prices bookings on the Championship, the Brasileirao, LaLiga, Serie A and the Premier League, and did not price them on the Eredivisie, the Champions League or the Europa League.

Can I see when a market opened without paying?

Yes. The historical-odds endpoint is on the free tier and its first snapshot timestamp is the market’s open time. The limit is three bookmakers per call and roughly one call every 4.5 seconds. To test whether a book covers a market at all, run it on a fixture that has already been played: the live prices are dropped after the game but the history is retained, so you see the full menu rather than only what the clock has opened.