Changelog

Changes a reader or an API consumer would notice, newest first. Internal fixes are not listed; the engine changes most days. If something here broke your integration, say so — the public endpoints are meant to be stable.

Embeddable live-odds badge

Two lines of HTML show both venues' price on any market on your own page. Free with attribution; the snippet keeps working with JavaScript off. /embed

Every dataset documented and opened

/data describes the four JSON endpoints field by field. Price history at /m/{slug}/history.json now sends CORS headers, so it can be read from a browser on any site, and carries its own provenance.

Methodology figures moved into the HTML

The page's counts — candidate pairs checked, how few settle identically — were filled in by a script, so anything that does not run JavaScript saw blanks. They are now rendered when the page is served.

Glossary, full-text file and a price feed

/glossary defines the terms as a cross-venue engine has to use them. /llms-full.txt carries every guide in full for assistants. /feed.xml publishes price moves as Atom.

Market pages link somewhere durable

Each open market now links to its league hub and to the guides, instead of being a dead end that disappears when the contract closes.

League hubs count from the database

The hubs were reporting the size of their own query rather than the real number of open markets. NFL said 74; it was 500.

Fifteen league hubs at permanent URLs

One page per league, live from both venues, at an address that survives the off-season instead of appearing and vanishing with the fixtures.

Calibration and fee guides, and the first open dataset

How accurate prices actually are, measured on our own resolved markets, and what fees really cost per contract. /data/top-spreads.json published for anyone to quote.

Liveness without a key

/v1/status answers whether the API is up without authentication, so a monitor does not need a credential.

Same-day rematches stopped merging

Two meetings of the same pair on one day were being treated as one fixture, which invented cross-venue gaps that did not exist. The matcher now compares start times, not just dates.

Matcher stopped silently dropping markets

An input cap was truncating the matcher's candidate set without logging it, so pairs that should have matched never got the chance.

The data API and MCP