Skip to content
Developer docsTips · REST GET · Enterprise · LIVE AI-assisted

Enterprise · LIVE

LIVE AI-assisted tips

Three read-only GET endpoints return saved LIVE AI-assisted selections for UK and Irish races, each with evidence and a two-sentence explanation.

The feed includes the selected horse, silks, jockey, trainer, bookmaker prices, bet type, estimated win confidence, EV and two saved sentences explaining the evidence behind the pick. Metrics are prepared before the race and returned instantly with the saved tip.

What it is

  • A scheduled job ranks declared runners using documented rules and saves at most one selection per race.
  • Only predictions with finite saved expectedValue strictly above zero are offered. Zero, negative and missing EV are excluded, including from customer history.
  • An AI model then writes exactly two sentences from the saved evidence. Explanations are pre-generated and stored; no AI call happens when you request them.
  • There is no POST endpoint and no way to trigger analysis on demand.
  • Dates return only saved records from the current market-led feed. Earlier rating-only records have been retired from customer access. Past dates are not recalculated.

New selections use market-rating-summary-v2: 65% relative market strength, 25% relative supplied rating and 10% smoothed career win rate. Market strength comes from the inverse median decimal price for each runner, relative to the market leader. Every active runner must have usable odds and a positive rating. The top-ranked horse needs a best price of 20/1 or shorter, at least 8% normalised market share, and a lead of two ranking points over the runner-up. Otherwise no tip is published. These thresholds are selection rules, not a model-accuracy claim. Older tips retain their original methodology.

For reproduction: q = 1 / median decimal odds, qMax = highest q in the field, rMax = highest rating, and summaryRate = (wins + 1) / (runs + 10), or 0.1 when another runner has no usable summary. Score = 100 × (0.65 × q / qMax + 0.25 × rating / rMax + 0.10 × summaryRate). The selected horse itself needs at least three recorded runs. Normalised market share = q / sum(q).

Access and auth

Requires an active Enterprise account. Send your key as X-API-Key: YOUR_KEY or Authorization: Bearer YOUR_KEY. Requests share the Enterprise 10 requests per second limit with every other feed. Other plans receive 403. Signed-in Enterprise customers can also view today's tips in Dashboard, Tips.

Endpoints

RequestReturns
GET /v1/tips?status=active&page=1&limit=50Current positive-EV selections only; filtering occurs before pagination and totals. Optional date retrieves saved qualifying records. Omit status to include their historical states. limit 1 to 100.
GET /v1/races/{raceId}/tip?date=YYYY-MM-DDThe tip for one race.
GET /v1/races/{raceId}/tip/explanation?date=YYYY-MM-DDOnly the saved explanation, version and status.

Silk image links inside selection.silkUrl are authenticated API URLs; send your key to fetch the PNG.

Display tips on your website

  • Fetch /v1/tips?status=active&page=1&limit=100 on your server with X-API-Key. Continue through pages until page * limit >= meta.total.
  • Render the race time/course, selection.horseName, selection.jockey, selection.trainer, odds and explanation. Use text escaping, not untrusted HTML.
  • Fetch /v1/silks/{horseId}?raceId=RACE_ID&date=YYYY-MM-DD through your server and stream the PNG to your own image route. Never expose an API key in browser code, query strings or a public image URL.
  • Refresh at a sensible interval such as once per minute, within your account limit. Replace your display with the latest active set; remove a selection when it is no longer active. An empty array means show no tips, not a fabricated placeholder.
  • The signed-in Tips feed page includes copyable server and browser integration examples and the real returned JSON.

Prices, bet type and selection metrics

FieldHow to use it
oddsObserved prices for this horse with bookmaker names. Display fractional when supplied, otherwise price. Numeric price represents decimal odds; the original fields remain unchanged.
oddsObservedAtWhen these prices were observed. Older observations may be retained when prices disappear from a completed feed; they are not fresh or guaranteed quotes.
betTypewin = To win; each_way = Each way. New tips use each_way only when the saved evDecimalOdds is strictly above 6.0 (over 5/1). At exactly 5/1 or below, the tip is To win. The type stays fixed after publication; older tips retain their original type.
placeTermsEach-way recommendation: places = 3, oddsFraction = 0.2 (top three at one-fifth fractional odds), with equal win and place stakes. Null for To win tips. These are our recommendation terms; bookmaker availability and offers are separate.
settlementFor a confirmed finish: outcome is won, placed or lost; position is the finishing position (null for recognised non-finishes). Each-way positions 2–3 are placed; first is won. To win tips lose in any position other than first. Null for an unconfirmed result or missing place terms.
selectionScoreSaved ranking score out of 100, using the analysisVersion methodology. New scores use the market-led formula above. Not a confidence percentage or win probability; older records may have null.
confidenceEstimated win probability, as a percentage. Calculated using market-form-v1, separately from the rating/form ranking score.
expectedValueWin-leg EV only, including for each-way tips: confidence / 100 × evDecimalOdds − 1. For example 0.071 = +7.1% win EV. Only finite values strictly above zero qualify for the customer feed. This is not the combined EV of both each-way legs.
evDecimalOddsBest supplied pre-race decimal win quote used in the EV calculation; evBookmaker identifies the firm.
modelVersionmarket-form-v1. referenceDecimalOdds is the median pre-race bookmaker price; metricsObservedAt is the quote observation timestamp.
explanationVersionSaved writing-policy version. Current prose uses both sentences for specific evidence-based selection reasoning, not generic boilerplate.

Each-way example: at 10/1, the place leg pays 2/1 (10/1 × 1/5) for a top-three finish. A £1 each-way bet means £1 win plus £1 place, £2 total: first returns £14, second or third returns £3, and fourth or lower returns £0, before any bookmaker adjustments. A placed outcome is not necessarily a profitable bet. The API returns the saved terms and finishing outcome, not a cash payout.

Formula: let m = 1 / median decimal win odds, and s = (recorded wins + 20 × m) / (recorded runs + 20). Estimated win probability p = 0.70 × m + 0.30 × s. Confidence = 100 × p, rounded to two decimal places. EV uses that returned confidence. This combines the market price with a career win rate smoothed towards the market using 20 prior runs. The constants are fixed, not fitted to the three-race retrospective check. These are model estimates, not a measured model-accuracy percentage.

The initial retrospective replay covered three saved selections with eligible pre-race prices: two won, with +2.75 units on three one-unit win stakes at the recorded best quotes. Model Brier score was 0.2832 versus 0.2721 for the median-price baseline (lower is better). This sample does not establish improved predictive accuracy or profitability. New metrics are frozen before the race. Legacy selections can receive a historical calculation from saved pre-race inputs; metricsComputedAt records when that calculation was made, separately from the quote time in metricsObservedAt. Records without pre-race inputs retain null metrics.

Status, version and freshness

statusMeaning
pendingInternal preparation state; not offered as a customer prediction.
activeCurrent saved selection.
no_selectionInternal abstention state; not offered as a customer prediction.
withdrawnSelected runner no longer declared. Do not display as usable.
staleVerification is older than 15 minutes or scheduled off has passed without a result. Do not display as usable.
settledResult published; see result.

version increments when the selection, explanation or lifecycle state changes. Price and verification refreshes do not change the analysis version. Use generatedAt, checkedAt and oddsObservedAt to judge freshness; prices are observations, not live quotes.

The worker checks around once per minute while the service runs. No request waits for AI, but warmup, autoscaling and source outages may delay preparation. A withdrawn selection is not automatically replaced, and no selection is created after scheduled off.

offAt is the conservative analysis cutoff, not a canonical interpretation of unzoned source times. An explicitly zoned source datetime takes priority. Otherwise both source clocks must be valid and the earlier is interpreted in Europe/London, so analysis may freeze earlier than the displayed race time. Unresolvable clocks produce no selection.

Empty and missing

  • A date with no qualifying positive-EV predictions returns 200 with data: [].
  • An unknown race or a race without a qualifying positive-EV prediction returns 404 from both individual endpoints, with error, code and requestId.
  • explanation may be null for a previously published selection that is now stale or withdrawn.

Response shape

Structure only. Values are placeholders, not real selections.

{
  "meta": {
    "date": "YYYY-MM-DD",
    "total": 1,
    "page": 1,
    "limit": 50
  },
  "data": [
    {
      "raceId": "RACE_ID",
      "date": "YYYY-MM-DD",
      "raceName": "RACE_NAME",
      "course": "COURSE",
      "time": "HH:MM",
      "status": "active",
      "version": 1,
      "explanation": "SENTENCE_ONE. SENTENCE_TWO.",
      "selection": {
        "horseId": "HORSE_ID",
        "horseName": "HORSE_NAME",
        "jockey": "JOCKEY",
        "trainer": "TRAINER",
        "silkUrl": "/v1/silks/HORSE_ID?raceId=RACE_ID&date=YYYY-MM-DD",
        "evidence": [
          "EVIDENCE_ITEM"
        ]
      },
      "odds": [
        {
          "bookmaker": "BOOKMAKER",
          "bookmakerId": "ID",
          "price": "PRICE",
          "fractional": "PRICE",
          "eachWay": ""
        }
      ],
      "betType": "win",
      "confidence": 30.6,
      "expectedValue": 0.071,
      "modelVersion": "market-form-v1",
      "referenceDecimalOdds": 3.25,
      "evDecimalOdds": 3.5,
      "evBookmaker": "BOOKMAKER",
      "metricsObservedAt": "ISO_TIMESTAMP",
      "metricsComputedAt": "ISO_TIMESTAMP",
      "selectionScore": null,
      "explanationVersion": "evidence-two-sentences-v2",
      "generatedAt": "ISO_TIMESTAMP",
      "checkedAt": "ISO_TIMESTAMP",
      "oddsObservedAt": "ISO_TIMESTAMP",
      "reason": null,
      "result": null
    }
  ]
}

Full schemas are in the API reference.