Skip to main content
TxLINE is the odds feed Volmarket settles against. This page covers the API surface used, the data conventions that matter for correctness, and how a feed update maps to an on-chain market.

Hosts

The OpenAPI servers: 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>
The spec declares this as 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

An Odds record carries:

Pct vs Prices

PriceNames[], Prices[], and Pct[] are positionally parallel — index i in each refers to the same outcome.
Pct[] is what settles. It holds the demargined implied probability as a 3-decimal percent string, for example "39.432". On-chain it is scaled as round(Pct × 1000), so "39.432" becomes 39432.Prices[] is not. It holds decimal odds × 1000 — a different quantity on a different scale. Substituting it produces a plausible-looking integer that settles markets incorrectly.
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 is SuperOddsType + 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 × 1001.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:
Two lines that differ only in 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:
  1. Sub-tree proof — the odds snapshot within its fixture’s batch summary.
  2. Main-tree proof — that batch summary within the day’s root, held in daily_odds_merkle_roots.
Both stages are checked on-chain by TxLINE’s txoracle validate_odds instruction. See the CPI for the verified transaction and reproduction steps.