Should you just build this yourself?
Often, yes — and we would rather say so than pretend otherwise. Reading a bookmaker's public endpoint is not hard. What takes the time is everything after: deciding that two feeds describe the same game, removing the margin correctly, keeping a change log rather than a poll log, and noticing when a book quietly stops returning anything.
Choose building it yourself when
You need one or two books for one league, or the data is a means to something you care about more. A weekend gets you a working scraper, and you will own it completely.
Choose PredictHQ when
You want the second year of it — the identity resolution, the calibration record, and the part that notices a silently broken feed before it costs you.
What we have that they do not
- ✓Deciding two feeds mean the same game
- ✓History as a change log, not a poll log
- ✓Noticing a feed that has silently stopped
- ✓De-vigged fair value on every market
- ✓Calibration: how well past probabilities held up
- ✓Automated positions with risk limits
- ✓Paper trading before real money
- ✓Evidence recorded next to every decision
- ✓Prediction markets alongside sportsbooks
Where building it yourself is ahead
Listed because you would find out anyway, and better from us.
- Nothing in this category.
Feature by feature
A tick on our side means it is shipped and the file that backs it is named. A dash means we do not do it.
| Feature | PredictHQ | building it yourself |
|---|---|---|
|
Reading one book's prices
Genuinely a weekend. This is not the hard part and we would not claim it is. |
✓ | ✓ |
|
Deciding two feeds mean the same game
Matching on names attaches prices to the wrong game, silently. That module exists because it happened. app/Services/ingest/resolve.ts |
✓ | — |
|
History as a change log, not a poll log
Snapshot every poll and you have billions of rows a season saying nothing. app/Services/ingest/prices.ts — snapshots appended only on change |
✓ | — |
|
Noticing a feed that has silently stopped
A feed matching nothing looks exactly like a quiet market until you check. app/Services/watchdog.ts + IngestRun provenance |
✓ | — |
|
De-vigged fair value on every market
A raw price includes the book's margin. Every honest edge compares against the fair number, not the quoted one. app/Support/ — de-vig and fair price, with FairPrice recorded per selection |
✓ | — |
|
Calibration: how well past probabilities held up
A model that says 70% should be right about 70% of the time. Without this the number is an opinion. CalibrationBucket model + /api/v1/calibration |
✓ | — |
|
Automated positions with risk limits
Bankroll cap, position cap, daily loss limit, and a global stop that outranks all of them. app/Services/trading/ — judgement, execution, reconciliation, positions |
✓ | — |
|
Paper trading before real money
A strategy has a track record before it has money behind it. TradingStrategy paper mode — same decisions, same limits, simulated fills |
✓ | — |
|
Evidence recorded next to every decision
Why the engine did what it did, kept whether or not the trade worked. DecisionEvidence + TradeDecision models |
✓ | — |
|
Prediction markets alongside sportsbooks
Order-book probabilities next to bookmaker prices, in the same units. app/Services/prediction-markets/ — Kalshi and Polymarket clients |
✓ | — |
Pricing
building it yourself
Free, plus your time, plus whatever a wrong number costs you.
PredictHQ
Flat monthly.
Questions
What is the part people underestimate?
Identity. Every provider names the same league, club, and market differently, and matching them by name fails quietly rather than loudly — prices land on the wrong game and nothing errors.