get_line_movement
Time-series odds grouped by bookmaker
When to use it
You are studying how a line moved: every hourly snapshot per bookmaker from first post to kickoff.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| game_id | string | yes | Game id |
| bookmaker | string | no | Bookmaker key filter |
Request
curl -X POST https://football-mcp-production.up.railway.app/v1/get_line_movement \
-H "Content-Type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{
"game_id": "2026_02_DET_BUF"
}'Over MCP, ask for it in plain English and the client calls get_line_movement itself. Point any MCP client at https://football-mcp-production.up.railway.app/mcp?key=YOUR_API_KEY.
Response
{
"game_id": "2026_02_DET_BUF",
"home_team": "BUF",
"away_team": "DET",
"kickoff": "2026-09-18T00:15:00.000Z",
"movement": {
"betmgm": [
{
"bookmaker": "betmgm",
"snapshot_type": "snapshot",
"ml_home": -235,
"ml_away": 190,
"ml_home_prob": 0.70149255,
"ml_away_prob": 0.3448276,
"spread_home": -5.5,
"spread_home_odds": -110,
"spread_away": 5.5,
"spread_away_odds": -108,
"total": 55,
"total_over_odds": -110,
"total_under_odds": -110,
"captured_at": "2026-09-17T15:04:00.530Z"
},
{
"bookmaker": "betmgm",
"snapshot_type": "snapshot",
"ml_home": -235,
"ml_away": 200,
"ml_home_prob": 0.70149255,
"ml_away_prob": 0.33333334,
"spread_home": -5.5,
"spread_home_odds": -110,
"spread_away": 5.5,
"spread_away_odds": -108,
"total": 55,
"total_over_odds": -108,
"total_under_odds": -110,
"captured_at": "2026-09-17T15:08:01.468Z"
},
{
"bookmaker": "betmgm",
"snapshot_type": "snapshot",
"ml_home": -235,
"ml_away": 200,
"ml_home_prob": 0.70149255,
"ml_away_prob": 0.33333334,
"spread_home": -5.5,
"spread_home_odds": -110,
"spread_away": 5.5,
"spread_away_odds": -108,
"total": 55,
"total_over_odds": -108,
"total_under_odds": -110,
"captured_at": "2026-09-17T15:08:35.622Z"
}
],
"draftkings": [
{
"bookmaker": "draftkings",
"snapshot_type": "snapshot",
"ml_home": -238,
"ml_away": 195,
"ml_home_prob": 0.70414203,
"ml_away_prob": 0.33898306,
"spread_home": -5.5,
"spread_home_odds": -105,
"spread_away": 5.5,
"spread_away_odds": -115,
"total": 54.5,
"total_over_odds": -120,
"total_under_odds": 100,
"captured_at": "2026-09-17T15:04:00.530Z"
},
{
"bookmaker": "draftkings",
"snapshot_type": "snapshot",
"ml_home": -238,
"ml_away": 195,
"ml_home_prob": 0.70414203,
"ml_away_prob": 0.33898306,
"spread_home": -5.5,
"spread_home_odds": -105,
"spread_away": 5.5,
"spread_away_odds": -115,
"total": 54.5,
"total_over_odds": -120,
"total_under_odds": 100,
"captured_at": "2026-09-17T15:08:01.468Z"
},
{
"bookmaker": "draftkings",
"snapshot_type": "snapshot",
"ml_home": -238,
"ml_away": 195,
"ml_home_prob": 0.70414203,
"ml_away_prob": 0.33898306,
"spread_home": -5.5,
"spread_home_odds": -105,
"spread_away": 5.5,
"spread_away_odds": -115,
"total": 54.5,
"total_over_odds": -120,
"total_under_odds": 100,
"captured_at": "2026-09-17T15:08:35.622Z"
}
],
"espnbet": [
{
"bookmaker": "espnbet",
"snapshot_type": "snapshot",
"ml_home": -260,
"ml_away": 215,
"ml_home_prob": 0.7222222,
"ml_away_prob": 0.31746033,
"spread_home": -6,
"spread_home_odds": -105,
"spread_away": 6,
"spread_away_odds": -115,
"total": 54.5,
"total_over_odds": -115,
"total_under_odds": -105,
"captured_at": "2026-09-17T15:04:00.530Z"
},
{
"bookmaker": "espnbet",
"snapshot_type": "snapshot",
"ml_home": -260,
"ml_away": 215,
"ml_home_prob": 0.7222222,
"ml_away_prob": 0.31746033,
"spread_home": -6,
"spread_home_odds": -105,
"spread_away": 6,
"spread_away_odds": -115,
"total": 54.5,
"total_over_odds": -115,
"total_under_odds": -105,
"captured_at": "2026-09-17T15:08:01.468Z"
},
{
"bookmaker": "espnbet",
"snapshot_type": "snapshot",
"ml_home": -260,
"ml_away": 215,
"ml_home_prob": 0.7222222,
"ml_away_prob": 0.31746033,
"spread_home": -6,
"spread_home_odds": -105,
"spread_away": 6,
"spread_away_odds": -115,
"total": 54.5,
"total_over_odds": -115,
"total_under_odds": -105,
"captured_at": "2026-09-17T15:08:35.622Z"
}
],
"fanduel": [
{
"bookmaker": "fanduel",
"snapshot_type": "snapshot",
"ml_home": -255,
"ml_away": 210,
"ml_home_prob": 0.7183099,
"ml_away_prob": 0.32258064,
"spread_home": -5.5,
"spread_home_odds": -112,
"spread_away": 5.5,
"spread_away_odds": -108,
"total": 54.5,
"total_over_odds": -114,
"total_under_odds": -106,
"captured_at": "2026-09-17T15:04:00.530Z"
},
{
"bookmaker": "fanduel",
"snapshot_type": "snapshot",
"ml_home": -255,
"ml_away": 210,
"ml_home_prob": 0.7183099,
"ml_away_prob": 0.32258064,
"spread_home": -5.5,
"spread_home_odds": -112,
"spread_away": 5.5,
"spread_away_odds": -108,
"total": 54.5,
"total_over_odds": -114,
"total_under_odds": -106,
"captured_at": "2026-09-17T15:08:01.468Z"
},
{
"bookmaker": "fanduel",
"snapshot_type": "snapshot",
"ml_home": -255,
"ml_away": 210,
"ml_home_prob": 0.7183099,
"ml_away_prob": 0.32258064,
"spread_home": -5.5,
"spread_home_odds": -112,
"spread_away": 5.5,
"spread_away_odds": -108,
"total": 54.5,
"total_over_odds": -114,
"total_under_odds": -106,
"captured_at": "2026-09-17T15:08:35.622Z"
}
]
},
"snapshots": 28
}Response fields
| Field | Type | Description |
|---|---|---|
| game_id | string | |
| home_team | string | |
| away_team | string | |
| kickoff | string | |
| movement | object | |
| movement.betmgm[] | array | List of objects |
| movement.betmgm[].bookmaker | string | |
| movement.betmgm[].snapshot_type | string | |
| movement.betmgm[].ml_home | number | |
| movement.betmgm[].ml_away | number | |
| movement.betmgm[].ml_home_prob | number | |
| movement.betmgm[].ml_away_prob | number | |
| movement.betmgm[].spread_home | number | |
| movement.betmgm[].spread_home_odds | number | |
| movement.betmgm[].spread_away | number | |
| movement.betmgm[].spread_away_odds | number | |
| movement.betmgm[].total | number | |
| movement.betmgm[].total_over_odds | number | |
| movement.betmgm[].total_under_odds | number | |
| movement.betmgm[].captured_at | string | |
| movement.draftkings[] | array | List of objects |
| movement.draftkings[].bookmaker | string | |
| movement.draftkings[].snapshot_type | string | |
| movement.draftkings[].ml_home | number | |
| movement.draftkings[].ml_away | number | |
| movement.draftkings[].ml_home_prob | number | |
| movement.draftkings[].ml_away_prob | number | |
| movement.draftkings[].spread_home | number | |
| movement.draftkings[].spread_home_odds | number | |
| movement.draftkings[].spread_away | number | |
| movement.draftkings[].spread_away_odds | number | |
| movement.draftkings[].total | number | |
| movement.draftkings[].total_over_odds | number | |
| movement.draftkings[].total_under_odds | number | |
| movement.draftkings[].captured_at | string | |
| movement.espnbet[] | array | List of objects |
| movement.espnbet[].bookmaker | string | |
| movement.espnbet[].snapshot_type | string | |
| movement.espnbet[].ml_home | number | |
| movement.espnbet[].ml_away | number |
Related endpoints
Returns the game_id this one takes.
Upcoming games by week or for the next N days
Returns the game_id this one takes.
Query games by season, week, team, date, type, or status, with closing lines
Takes the game_id this one returns.
Full game detail with team stats, starting QBs, odds, weather, and officials
Takes the game_id this one returns.
Odds by game with bookmaker filters
Try it
500 credits free on signup — 20 calls to get_line_movement — and no card.