Hosts
The OpenAPIservers: block lists two hosts:
Both are overridable with
TXLINE_BASE_URL. The spec is published at /docs/docs.yaml on either host.
Earlier integration work targeted
oracle*.txodds.com, which no longer resolves. The upstream repository was renamed to the two hosts above; use those.Authentication
Every data endpoint requires both headers:Authorization: Bearer <JWT>X-Api-Token: <token>
httpAuth plus apiKeyAuth. There is no guest-JWT-only data path — the /api/guest/* routes do not serve odds.
Endpoints used
Proof availability
GET /api/odds/validation returns 404 for a record until its batch publishes. That is expected behavior, not an error — proofs publish on wall-clock 5-minute batches.
The keeper’s fetchPublishedOddsProof computes the batch boundary and retries with backoff across the publication buffer. See epoch timing for what this means for settlement.
Data conventions
AnOdds record carries:
Pct vs Prices
PriceNames[], Prices[], and Pct[] are positionally parallel — index i in each refers to the same outcome.
Volmarket uses the StablePrice feed specifically, because its odds are demargined — the percentage reads as a true probability rather than a bookmaker’s marked-up price.
Market keying
An on-chain market’s odd identity isSuperOddsType + MarketParameters + outcome.
Including MarketParameters is what keeps different lines distinct. Two Over/Under markets on the same fixture share a SuperOddsType but differ in MarketParameters, so without it they would collide into one market.
On-chain the field is market_params, encoded as the goal line × 100 — 1.5 becomes 150, 2.5 becomes 250 — and 0 where the odd type has no line, such as 1X2. odd_key separately selects the SuperOddsType plus outcome.
The separation is structural rather than conventional, because market_params is one of the market PDA’s seeds:
market_params therefore derive different addresses and cannot collide.
When the keeper receives a stream update, it matches on that triple plus FixtureId to find open markets, then reads the settling outcome’s Pct[] entry by its index in PriceNames[].
Anchoring
Every odds update is committed into a batch whose Merkle root is anchored on Solana. A record is proven in two stages:- Sub-tree proof — the odds snapshot within its fixture’s batch summary.
- Main-tree proof — that batch summary within the day’s root, held in
daily_odds_merkle_roots.
txoracle validate_odds instruction. See the CPI for the verified transaction and reproduction steps.