Trends
Trends come from a search, not a hand-picked list. We test every combination of up to three situations (rest, back-to-backs, travel, line band, previous result, streaks, form and more) on older seasons, send each sport's top 10 to later seasons the search never saw, and publish only what held up there. Most situations don't beat the closing line, so expect few or none per sport.
Every number is historical, not a prediction. Records exclude pushes from rates and always show n and a 95% range. ROI is measured at the closing consensus price, beside the break-even rate. Discovery and holdout results are shown separately, never merged. Responses carry aggregates only: no per-game lines, prices or dollar amounts.
List Trends
/v1/trendsSearched trends that held up on the holdout, held up first and then by shrunk ROI at close. meta.searches gives each search's size and how many held up.
| Parameter | Type | Required | Description |
|---|---|---|---|
| league | string | No | nfl, nba, nhl or mlb |
| kind | string | No | line (graded at closing lines) or results (wins vs pregame ratings, never priced) |
| market | string | No | moneyline, spread, total or win |
| status | string | No | held_up (default) |
| limit | number | No | Max 100, default 25 |
| page | number | No | Page number |
Response
{
"success": true,
"data": [
{
"trendId": "nhl-e5d84e489080",
"league": "nhl",
"kind": "line",
"market": "moneyline",
"side": "opponent",
"status": "held_up",
"title": "Teams on a back-to-back: the opponent's moneyline",
"found": { "seasons": ["2021-22", "2022-23", "2023-24"], "record": { "wins": 1344, "losses": 1017, "pushes": 0 }, "n": 2361, "rate": 0.5693, "rateRange": [0.5492, 0.5891], "roi": 0.0881, "breakEvenRate": 0.5227, "shrunkRoi": 0.0453, "shrunkRange": [0.0124, 0.0781] },
"heldUp": { "seasons": ["2024-25", "2025-26"], "record": { "wins": 908, "losses": 736, "pushes": 0 }, "n": 1644, "rate": 0.5523, "rateRange": [0.5282, 0.5762], "roi": 0.0611, "roiRange": [0.0135, 0.1087], "breakEvenRate": 0.5242, "qValue": 0.0416 },
"shrunkRoiAtClose": 0.0504,
"search": { "summary": "1 of 228 situations we could judge, from 10,278 searched." },
"live": { "since": "2026-12-15T00:00:00.000Z", "record": { "wins": 0, "losses": 0, "pushes": 0 }, "n": 0, "roi": null, "roiRange": null },
"disclaimer": "Historical results, not a prediction. ..."
}
],
"meta": { "count": 1, "total": 1, "page": 1, "pages": 1, "searches": [ ... ] }
}
Example from our synthetic test set, for shape only.
Search Report
/v1/trends/reportThe per-sport report: combinations searched, how many had enough games to judge, how many went to the holdout and which held up. Served even when nothing held up.
| Parameter | Type | Required | Description |
|---|---|---|---|
| league | string | Yes | nfl, nba, nhl or mlb |
Response
{
"success": true,
"data": {
"league": "nhl",
"searches": [
{
"target": "lines",
"discoverySeasons": ["2021-22", "2022-23", "2023-24"],
"holdoutSeasons": ["2024-25", "2025-26"],
"holdoutOpened": true,
"cleanTest": true,
"groups": [
{
"group": "nhl",
"searched": 10278,
"judged": 228,
"sentToHoldout": 7,
"heldUpCount": 1,
"heldUp": [ ... ],
"summary": "We searched 10,278 situation and bet-type combinations on closing lines from 2021-22 to 2023-24. 228 had enough games to judge. Our top 7 went to 2024-25 to 2025-26 games the search never saw: 1 held up."
}
]
}
],
"closing": "Most situations don't beat the closing line. Books price rest, travel and form. We publish what we tested."
}
}
Game Situation Facts
/v1/events/:eventId/trendsFor games starting within 36 hours: each team's rest, travel, schedule, division and form facts, the held-up trends the team matches (with whether today's line is inside the trend's band) and matching results facts. No prices.
| Parameter | Type | Required | Description |
|---|---|---|---|
| eventId | string | Yes | Canonical MoneyLine event identifier |
Response
{
"success": true,
"data": {
"eventId": "nhl-ev-67575",
"league": "nhl",
"available": true,
"teams": {
"home": {
"teamId": "nhl-colorado-avalanche",
"venue": "home",
"situation": {
"restDays": 1,
"backToBack": false,
"homestandGame": 2,
"travel": { "direction": "none", "timeZonesMoved": 0 },
"divisionGame": false,
"form": { "wins": 4, "losses": 3, "lastResult": "L", "streak": -1 },
"opponent": { "restDays": 2, "backToBack": false, "travel": "west", "lastResult": "L" }
},
"trends": [],
"resultsFacts": []
},
"away": { ... }
}
}
}
Closing Line
/v1/events/:eventId/closing-lineThe consensus closing line we captured in the 3 hours before start: main spread, total and moneyline, every consensus row, timing quality and the first consensus we observed (not the market opener). 404 when there is no pregame close. Per-book closes are not included.
| Parameter | Type | Required | Description |
|---|---|---|---|
| eventId | string | Yes | Canonical MoneyLine event identifier |
Response
{
"success": true,
"data": {
"eventId": "nhl-ev-67574",
"close": {
"source": "moneyline_capture",
"quality": "ok",
"minutesBeforeStart": 4.4,
"main": {
"spread": { "books": 10, "home": { "point": -1.5, "price": -104.1, "fairOdds": 105.3 }, "away": { "point": 1.5, "price": -115.9, "fairOdds": -105.3 } },
"total": { "point": 6, "books": 6, "over": { "price": -119.2 }, "under": { "price": -100.3 } },
"moneyline": { "books": 11, "home": { "price": -284.5, "fairOdds": -245.8 }, "away": { "price": 232.1, "fairOdds": 245.8 } }
},
"rows": [ { "marketType": "moneyline", "outcome": "Calgary Flames", "avgPrice": 232.1, "avgImpliedProb": 0.3011, "fairOdds": 245.8, "bookCount": 11 } ]
},
"firstSeen": { "observedAt": "2026-10-14T18:00:00.000Z", "rows": [ ... ] }
},
"meta": { "booksWithheld": true }
}