What the market did, and where your price has drifted
Two streams, deliberately kept apart. A fact-stream of reference main-line changes, typed and timestamped — detected at a median of one minute. And warnings when the gap between your own price and fair is widening, which in an end-to-end day arrived a median of 15.8 minutes before the market caught up.
A fact-stream and a warning stream
Mixing observations with inferences is how alerting systems lose credibility. These arrive on separate endpoints and are never blended into one score.
1 · Main-line changes — facts
Every time the reference market moves its main line, you get a typed, timestamped event with the old line, the new line and the ladder attached. Nothing here is predicted; it either happened or it did not.
2 · Gap warnings — inferences
Your posted price is compared with fair from the surface. When the gap is widening, a warning opens — labelled as an inference, with the gap in percentage points and the band around fair so you can see how solid the reading is.
A gap, a band and an action
- Direction-free by design. A defensive action does not need a direction — raise margin, trim the limit, or reprice toward fair. We tell you where the risk is; we do not claim to know where the market is going.
- The band travels with the alert. A 3 pp gap on a rung with a 1.4 pp band is a different object from the same gap on a rung with a 3 pp band, and the payload says which one you are looking at.
Every alert is resolved, including the ones that fail
An alert is not a notification that disappears into a chat window. It is an object with states, and all of its states are published.
active — the warning is open
The gap is present and widening. Delivered by webhook and readable from
GET /v1/alerts.confirmed — the market moved as the gap implied
The alert closes as confirmed, with the timestamps of both the warning
and the move, so the lead time is computed from the record and not from memory.withdrawn — the gap closed without a move
The alert closes as withdrawn and stays in the record. Withdrawn
alerts are what make a published hit-rate meaningful: we cannot quietly drop the ones that
did not work out.The lifecycle is committed to the same cryptographic ledger as the prices, so the set of alerts we raised on a given day is fixed on that day.
Stream, poll or webhook
| Channel | Call | Use it for | Rate class |
|---|---|---|---|
| Live stream | GET /v1/stream (SSE) | Main-line changes as they are detected | persistent connection |
| Catch-up poll | GET /v1/line-events?since= | Replaying anything missed while you were down | events · 12/min |
| Open alerts | GET /v1/alerts | Current gap warnings and their state | events · 12/min |
| Webhook | your endpoint | Push delivery, HMAC-signed | — |
curl -N "https://api.foreline.io/v1/stream" \
-H "X-Foreline-Key: $FORELINE_KEY"
event: line_change
data: {"event_id":"EVT_8F3A21","market":"handicap","from":-0.5,"to":-0.75,
"detected_ts":"2026-07-24T18:41:07Z","data_cadence_s":60}
Webhook deliveries carry an
X-Foreline-Signature: sha256=… header — an HMAC over the raw request body with
your shared secret, so you can verify a payload came from us before acting on it. Values above
are illustrative; see the API reference.
The other three products
Fair-Price Surface
The whole ladder, de-vigged and banded — the fair price every gap is measured against.
See the product →Player Radar
Scores accounts on CLV against our close — including on lines the reference never quoted.
See the product →Parlay Protection
A coherent score matrix, so joint outcomes are priced consistently with the marginals.
See the product →Request a trial of Line Radar
Tell us how you would like alerts delivered and which markets you post. We reply with a trial key and a webhook secret.
We usually reply within one business day. Pricing is quoted per scope — ask and we will send terms.
Foreline