# Action Network API | Betting Splits, Odds & Line Movement (`zen-studio/action-network-odds`) Actor

Public betting splits from Action Network: share of tickets and share of money on every side, across 18 leagues. Plus sportsbook odds, best price per side, opening-to-current line movement, player props and expert picks with verified ROI. Export JSON, CSV or Excel. No login, no proxy.

- **URL**: https://apify.com/zen-studio/action-network-odds.md
- **Developed by:** [Zen Studio](https://apify.com/zen-studio) (community)
- **Categories:** Sports, Automation, Integrations
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.79 / 1,000 games

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Action Network API | Betting Splits, Odds, Line Movement & Expert Picks (2026)

<a href="https://console.apify.com/actors/Pjlm871yhJCOjQh6I/input"><img src="https://api.apify.com/v2/key-value-stores/pJ7iaZsTFhR3k9tjV/records/action-network-odds-hero.png" alt="Action Network betting splits scraper: percentage of bets, percentage of money and the difference on an NFL spread" style="max-width:100%"></a>

**From Zen Studio**, creators of [PrizePicks Player Props](https://apify.com/zen-studio/prizepicks-player-props), [Underdog Player Props](https://apify.com/zen-studio/underdog-player-props) and [DraftKings Odds](https://apify.com/zen-studio/draftkings-odds), with **50,000+ combined lifetime runs** across those three sports-betting Actors.

### Why choose this Actor?

- **Bets, money and the gap between them.** Every game the consensus book prices carries `ticketPercent`, `moneyPercent` and a signed `sharpGap`. Money running ahead of tickets means fewer bettors are carrying more of the stake, and `sharpGap` is that difference as one sortable number.
- **Eighteen leagues, team sports and individual sports.** A single run collected **120 games across 10 in-season leagues in 8 seconds**, NFL and college football through MLB, NHL, WNBA and the European soccer leagues. Tennis matches and UFC fights come back as their own rows in the same run. No per-sport rewrites and no per-book scrapers.
- **Expert picks, verified records and ROI, at no extra charge.** One NFL game carried 52 handicappers, each with a win/loss record, units staked, ROI and a profile link. They arrive inside the game row rather than as a separate billable event.

<a href="https://console.apify.com/actors/Pjlm871yhJCOjQh6I/input"><img src="https://api.apify.com/v2/key-value-stores/pJ7iaZsTFhR3k9tjV/records/action-network-odds-cta.png" alt="Run the NFL slate: open the Action Network Odds Actor input page" width="282"></a>

### Try the example slate

Open the Actor's [input page](https://console.apify.com/actors/Pjlm871yhJCOjQh6I/input), switch to JSON and paste this to pull the current NFL slate with splits and expert picks. Then start the run.

```json
{
 "leagues": [
  "nfl"
 ],
 "includeExpertPicks": true,
 "maxGames": 10
}
```

Leave `date`, `week` and `season` out and you get the current slate. NFL and college football are scheduled by week, so those two leagues use `week` plus `season` instead of `date`. Splits appear on the games the consensus book prices, which is most in-season games but not every fixture months out.

### Related actors

| Actor | Use it for |
|---|---|
| [DraftKings Odds](https://apify.com/zen-studio/draftkings-odds) | One book's full board, 280+ leagues, props and futures. |
| [FanDuel Odds](https://apify.com/zen-studio/fanduel-odds) | Compare a second book's prices against the consensus. |
| [Player Props Line Shopping](https://apify.com/zen-studio/player-props-aggregator) | Find the best prop line across the pick'em apps. |
| [Flashscore Tennis](https://apify.com/zen-studio/flashscore-tennis-api) | Match data and odds for ATP and WTA. |

#### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start building with this Actor.

```
Action Network Odds scraper on Apify. Actor: zen-studio/action-network-odds (batch, pay per event). Run it with the apify-client SDK or POST https://api.apify.com/v2/acts/zen-studio~action-network-odds/runs?token=APIFY_TOKEN (token: https://console.apify.com/account/integrations). One dataset row per game (48 top-level fields, up to 51 with expert picks, props and line movement) or per tennis match, UFC fight or boxing bout (25 fields, up to 28; competitors instead of teams, eventType competition): game identity, both teams with records and logos, consensus moneyline/spread/total with ticketPercent + moneyPercent + sharpGap (public betting splits), per-book pricing, best price per side with the book, opening-to-current line movement, team totals, expert picks with verified records and ROI, final score by period, a graded against-the-spread / over-under result, closing odds by period, box score detail with live situation, live win probability, poll ranks, a roster that names every player id, final lineups, play-by-play, officials, venue and weather, full team and player stat sheets and the league calendar. Opt-in blocks add full timestamped line movement history and the complete player and game prop board. Leagues: nfl ncaaf nba ncaab wnba mlb nhl soccer epl laliga bundesliga seriea ligue1 mls ufc boxing atp wta. Inputs: leagues (array), date (YYYY-MM-DD; NFL and NCAAF use week + season + seasonType instead), gameIds / gameUrls, gameStatus, teams, onlyTrending, minBets, books, periods, includeExpertPicks, includeLineMovement, includeProps, includeStandings, includeInjuries, maxGames. Pricing: $3.99 per 1,000 games, +$3.99 per 1,000 for movement history, +$4.99 per 1,000 for props, $7.99 per 1,000 league reports, $4.99 per 1,000 runs to start the Actor; expert picks free. Full input schema and output fields: GET https://api.apify.com/v2/acts/zen-studio~action-network-odds/builds/default (Bearer TOKEN).
```

Also available as an [MCP server](https://mcp.apify.com/): add `zen-studio/action-network-odds` for natural language access.

### What Are Betting Splits and Sharp Money?

`ticketPercent` is the share of **bets** on a side. `moneyPercent` is the share of **money**. `sharpGap` is the signed difference between them, so you can sort on it directly.

When money runs well ahead of tickets, fewer bettors are carrying more of the stake. That is the classic sharp-money signal, and it is the reason public betting percentages are worth collecting at all.

In the example below, 82% of moneyline tickets are on Seattle but only 53% of the money. That is a `sharpGap` of **-29**, with the money leaning the other way.

Every game the books have priced also carries **reverse line movement** in raw form: `lineMovement` holds the opening number next to the current one, so a line that moved against the public side is a one-line comparison rather than a research project.

### What Data Can You Extract from Action Network?

| Block | Included | What it is |
|---|---|---|
| Game, teams, records | Always | Identity, start time, status, broadcast networks, attendance, rotation numbers, bet count |
| **Matches and fights** | Always | Tennis, UFC and boxing as one row per event, with both competitors, nationality, playing hand or reach, and the venue |
| Consensus lines | Always | Moneyline, spread, total, with no-vig probabilities, hold and overround |
| **Public betting percentages** | Always | Share of tickets and of money on each side, plus the signed gap between them |
| Every sportsbook's price | Always | Per-book pricing for each market and game segment. Six major books by default, up to 38 of 457 selectable |
| Best price per side | Always | Highest available price and which book offers it, compared on implied probability |
| Opening vs current | Always | Line and odds movement from the opening number |
| Team totals | Always | Per-team over/under, de-vigged per team |
| Score and result | Always | Final score by period, plus graded against-the-spread and over/under |
| **Expert picks** | Always | Selections with verified win/loss record, units staked and ROI |
| Closing odds by period | Always | Last recorded moneyline, spread and total for the full game, each half and each quarter |
| Box score detail | Always | Half and first-five-inning totals, timeouts, team stats, live down-and-distance or ball-strike count, pitching matchup |
| Live win probability | Always | Home, over and spread win probability from the latest play while a game is live |
| Poll rankings | Always | AP Top 25 rank for college teams |
| League calendar | Always | Season dates, current week, conferences and divisions |
| **Rosters with names** | Always | Every player on both teams with name, jersey, position, bats and throws, and headshot. Every player id elsewhere in the row carries its name |
| Starting lineups | Always | Final lineups with substitutes, batting order and position |
| Play-by-play | Always | Every play with score, clock, down and distance or outs and runners, and live win probability. Baseball plays name the batter and the pitcher |
| Player and season stats | Always | Box score stats for every player in the game, and full season stat lines |
| Officials | Always | Umpires and referees where the source lists them, each with their own moneyline and over/under record |
| Venue and weather | Always | Stadium, surface, roof and orientation, and the forecast for upcoming games |
| Team stat sheet | Always | Each team's full stats: passing, rushing, shots, corners, cards and the rest |
| Full movement history | Opt-in | Every timestamped price change per book, back to the opener |
| Player and game props | Opt-in | The complete prop board per game |
| Standings, injuries | Opt-in | League table with against-the-spread, over/under and units records, college poll rank, games back and soccer points, plus the current injury report. One row per league |

**Always** means no opt-in is needed, not that every game carries it. Odds blocks land where the books have priced the game, and expert picks where handicappers have posted one.

Download the result as **JSON, CSV, Excel or HTML**, or pull it straight from the dataset API.

#### Example game row

One row per game. This completed NFL game has props and full line movement switched on, so every block is populated. A game row carries 48 top-level fields, and 51 with expert picks, props and line movement.

Every key is shown. Repeated items are trimmed for readability, and each trimmed block lists its real size:

- `consensus.moneyline.sides`: 1 of 2
- `consensus.total.sides`: 1 of 2
- `consensus.spread.sides`: 1 of 2
- `teamTotals`: 1 of 2
- `teamTotals[].sides`: 1 of 2
- `bestPrices.total`: 1 of 2
- `bestPrices.moneyline`: 1 of 2
- `bestPrices.spread`: 1 of 2
- `lineMovement.moneyline`: 1 of 2
- `lineMovement.spread`: 1 of 2
- `lineMovement.total`: 1 of 2
- `booksPricing`: 2 of 66
- `players`: 1 of 94
- `playerStats.{side}`: 2 of 47
- `plays`: 1 of 181
- `leagueInfo.league.blacklistDates`: 1 of 158
- `leagueInfo.league.calendarInfo.pre`: 1 of 4
- `leagueInfo.league.calendarInfo.reg`: 1 of 18
- `leagueInfo.league.calendarInfo.post`: 1 of 4
- `leagueInfo.league.conferences`: 1 of 2
- `leagueInfo.league.divisions`: 1 of 8
- `expertPicks`: 4 of 52
- `expertPicks[].picks`: 2 of 4
- `expertPicks[].picks[].customPickRules.options`: 1 of 2 entries
- `lineMovementHistory`: 1 of 66
- `lineMovementHistory[].history`: 2 of 186
- `props.playerProps`: 1 of 930
- `props.playerProps[].selections`: 1 of 9
- `props.gameProps`: 1 of 5
- `props.gameProps[].selections`: 1 of 72
- `props.propOrder`: 1 of 123
- `props.marketRules`: 6 of 123 prop types
- `props.marketRules.{rule}.rules.options`: 1 of 2 entries

```json
{
 "gameId": 290843,
 "eventType": "game",
 "gameUrl": "https://www.actionnetwork.com/nfl-game/patriots-seahawks-score-odds/290843",
 "league": "nfl",
 "leagueId": 1,
 "leagueName": "nfl",
 "coreId": 35546920,
 "season": 2026,
 "week": 1,
 "seasonType": "reg",
 "startTime": "2026-09-10T00:20:00.000Z",
 "status": "complete",
 "statusDetail": "Final",
 "realStatus": "closed",
 "coverage": "full",
 "isFree": false,
 "isLive": false,
 "isComplete": true,
 "awayTeam": {
  "teamId": 129,
  "name": "New England Patriots",
  "displayName": "Patriots",
  "shortName": "Patriots",
  "location": "New England",
  "abbreviation": "NE",
  "logo": "https://static.sprtactn.co/teamlogos/nfl/100/ne.png",
  "primaryColor": "002244",
  "secondaryColor": "C60C30",
  "conference": "AFC",
  "division": "EAST",
  "urlSlug": "new-england-patriots",
  "coreId": 1993,
  "teamRankingsId": null,
  "record": {
   "wins": 0,
   "losses": 1,
   "ties": 0,
   "draws": null,
   "overtimeLosses": null
  }
 },
 "homeTeam": {
  "teamId": 156,
  "name": "Seattle Seahawks",
  "displayName": "Seahawks",
  "shortName": "Seahawks",
  "location": "Seattle",
  "abbreviation": "SEA",
  "logo": "https://static.sprtactn.co/teamlogos/nfl/100/sea.png",
  "primaryColor": "002244",
  "secondaryColor": "69BE28",
  "conference": "NFC",
  "division": "WEST",
  "urlSlug": "seattle-seahawks",
  "coreId": 2166,
  "teamRankingsId": null,
  "record": {
   "wins": 1,
   "losses": 0,
   "ties": 0,
   "draws": null,
   "overtimeLosses": null
  }
 },
 "winningTeamId": 156,
 "broadcast": {
  "network": "NBC/Peacock",
  "networkShort": "NBC/Peacock"
 },
 "attendance": 68744,
 "totalBets": 292189,
 "isTrending": false,
 "awayRotationNumber": 451,
 "homeRotationNumber": 452,
 "score": {
  "awayScore": 10,
  "homeScore": 13,
  "totalPoints": 23,
  "awayFirstHalfPoints": 7,
  "homeFirstHalfPoints": 0,
  "awaySecondHalfPoints": 3,
  "homeSecondHalfPoints": 13,
  "awayFirstFivePoints": 0,
  "homeFirstFivePoints": null,
  "awayTimeouts": 1,
  "homeTimeouts": 0,
  "clock": "00:00",
  "period": 4,
  "byPeriod": [
   {
    "period": "1st",
    "periodName": "1st Quarter",
    "periodNumber": 1,
    "abbreviation": "1",
    "awayPoints": 0,
    "homePoints": 0
   },
   {
    "period": "2nd",
    "periodName": "2nd Quarter",
    "periodNumber": 2,
    "abbreviation": "2",
    "awayPoints": 7,
    "homePoints": 0
   },
   {
    "period": "3rd",
    "periodName": "3rd Quarter",
    "periodNumber": 3,
    "abbreviation": "3",
    "awayPoints": 3,
    "homePoints": 3
   },
   {
    "period": "4th",
    "periodName": "4th Quarter",
    "periodNumber": 4,
    "abbreviation": "4",
    "awayPoints": 0,
    "homePoints": 10
   }
  ],
  "awayTeamId": 129,
  "homeTeamId": 156,
  "situation": {
   "down": 2,
   "distance": 11,
   "yardline": 19,
   "isRedzone": false,
   "yardlineText": "SEA 19",
   "startYardline": 20,
   "yardsToEndzone": 81,
   "display": "2nd & 11 @ SEA 19",
   "displayShort": "2nd & 11",
   "possessionTeamId": 156
  },
  "teamStats": null,
  "pitching": null,
  "latestOdds": {
   "game": {
    "over": -109,
    "total": 44.5,
    "under": -111,
    "mlAway": 146,
    "mlHome": -179,
    "spreadAway": 3.5,
    "spreadHome": -3.5,
    "spreadAwayLine": -110,
    "spreadHomeLine": -110
   },
   "firsthalf": {
    "over": -118,
    "total": 20.5,
    "under": -101,
    "mlAway": 127,
    "mlHome": -154,
    "spreadAway": 2.5,
    "spreadHome": -2.5,
    "spreadAwayLine": -112,
    "spreadHomeLine": -107
   },
   "firstquarter": {
    "over": 105,
    "total": 7.5,
    "under": -130,
    "mlAway": 116,
    "mlHome": -140,
    "spreadAway": 0.5,
    "spreadHome": -0.5,
    "spreadAwayLine": -135,
    "spreadHomeLine": 105
   },
   "thirdquarter": {
    "over": -120,
    "total": 9.5,
    "under": -110,
    "mlAway": 114,
    "mlHome": -140,
    "spreadAway": 1,
    "spreadHome": -1,
    "spreadAwayLine": -145,
    "spreadHomeLine": 117
   },
   "fourthquarter": {
    "over": -105,
    "total": 13.5,
    "under": -124,
    "mlAway": 110,
    "mlHome": -134,
    "spreadAway": 0.5,
    "spreadHome": -0.5,
    "spreadAwayLine": -135,
    "spreadHomeLine": 105
   },
   "secondquarter": {
    "over": 105,
    "total": 13.5,
    "under": -135,
    "mlAway": 124,
    "mlHome": -154,
    "spreadAway": 1,
    "spreadHome": -1,
    "spreadAwayLine": -118,
    "spreadHomeLine": -107
   }
  }
 },
 "consensus": {
  "moneyline": {
   "sides": [
    {
     "side": "home",
     "teamId": 156,
     "competitorId": null,
     "playerId": null,
     "odds": -175,
     "decimalOdds": 1.5714,
     "line": 0,
     "impliedProbability": 0.636364,
     "noVigProbability": 0.615922,
     "ticketPercent": 82,
     "moneyPercent": 53,
     "sharpGap": -29,
     "marketId": "21790020",
     "outcomeId": "2669500864"
    }
   ],
   "holdPercent": 3.2123,
   "overroundPercent": 3.3189
  },
  "total": {
   "sides": [
    {
     "side": "under",
     "teamId": null,
     "competitorId": null,
     "playerId": null,
     "odds": -112,
     "decimalOdds": 1.8929,
     "line": 44.5,
     "impliedProbability": 0.528302,
     "noVigProbability": 0.50433,
     "ticketPercent": 71,
     "moneyPercent": 59,
     "sharpGap": -12,
     "marketId": "21790022",
     "outcomeId": "2669500871"
    }
   ],
   "holdPercent": 4.5376,
   "overroundPercent": 4.7533
  },
  "spread": {
   "sides": [
    {
     "side": "home",
     "teamId": 156,
     "competitorId": null,
     "playerId": null,
     "odds": -110,
     "decimalOdds": 1.9091,
     "line": -3.5,
     "impliedProbability": 0.52381,
     "noVigProbability": 0.5,
     "ticketPercent": 46,
     "moneyPercent": 35,
     "sharpGap": -11,
     "marketId": "21790021",
     "outcomeId": "2669500866"
    }
   ],
   "holdPercent": 4.5455,
   "overroundPercent": 4.7619
  }
 },
 "teamTotals": [
  {
   "teamId": 129,
   "sides": [
    {
     "side": "under",
     "teamId": 129,
     "competitorId": null,
     "playerId": null,
     "odds": -112,
     "decimalOdds": 1.8929,
     "line": 20.5,
     "impliedProbability": 0.528302,
     "noVigProbability": 0.502135,
     "ticketPercent": null,
     "moneyPercent": null,
     "sharpGap": null,
     "marketId": "21790040",
     "outcomeId": "2849916707"
    }
   ],
   "holdPercent": 4.953,
   "overroundPercent": 5.2111
  }
 ],
 "bestPrices": {
  "total": [
   {
    "side": "over",
    "teamId": null,
    "odds": -108,
    "decimalOdds": 1.9259,
    "line": 44.5,
    "bookId": 68,
    "bookName": "DK NJ",
    "competitorId": null,
    "playerId": null,
    "impliedProbability": 0.519231,
    "marketId": "21790022",
    "outcomeId": "2670489214",
    "bookParentId": null,
    "deeplinkId": "ML2670489214"
   }
  ],
  "moneyline": [
   {
    "side": "home",
    "teamId": 156,
    "odds": -170,
    "decimalOdds": 1.5882,
    "line": 0,
    "bookId": 68,
    "bookName": "DK NJ",
    "competitorId": null,
    "playerId": null,
    "impliedProbability": 0.62963,
    "marketId": "21790020",
    "outcomeId": "2670489207",
    "bookParentId": null,
    "deeplinkId": "ML2670489207"
   }
  ],
  "spread": [
   {
    "side": "home",
    "teamId": 156,
    "odds": -100,
    "decimalOdds": 2.0,
    "line": -3.5,
    "bookId": 69,
    "bookName": "FanDuel NJ",
    "competitorId": null,
    "playerId": null,
    "impliedProbability": 0.5,
    "marketId": "21790021",
    "outcomeId": "2669500983",
    "bookParentId": null,
    "deeplinkId": "ML2669500983"
   }
  ]
 },
 "lineMovement": {
  "moneyline": [
   {
    "side": "home",
    "teamId": 156,
    "competitorId": null,
    "playerId": null,
    "openingLine": 0,
    "currentLine": 0,
    "lineDelta": 0,
    "openingOdds": -210,
    "currentOdds": -175,
    "oddsDelta": 35
   }
  ],
  "spread": [
   {
    "side": "home",
    "teamId": 156,
    "competitorId": null,
    "playerId": null,
    "openingLine": -4.5,
    "currentLine": -3.5,
    "lineDelta": 1.0,
    "openingOdds": -107,
    "currentOdds": -110,
    "oddsDelta": -3
   }
  ],
  "total": [
   {
    "side": "under",
    "teamId": null,
    "competitorId": null,
    "playerId": null,
    "openingLine": 45.5,
    "currentLine": 44.5,
    "lineDelta": -1.0,
    "openingOdds": -115,
    "currentOdds": -112,
    "oddsDelta": 3
   }
  ]
 },
 "booksPricing": [
  {
   "bookId": 15,
   "bookName": "Consensus",
   "market": "core_bet_type_6_team_score",
   "period": "event",
   "side": "under",
   "teamId": 129,
   "competitorId": null,
   "playerId": null,
   "opposingCompetitorIds": null,
   "odds": -112,
   "decimalOdds": 1.8929,
   "line": 20.5,
   "impliedProbability": 0.528302,
   "isLive": false,
   "lineStatus": "normal",
   "isAlternate": null,
   "ticketPercent": null,
   "moneyPercent": null,
   "sharpGap": null,
   "marketId": "21790040",
   "outcomeId": "2849916707",
   "deeplinkId": null,
   "bookParentId": null,
   "optionTypeId": 2,
   "propTypeId": 166,
   "oddsCoefficientScore": null,
   "eventId": 290843,
   "eventType": "game"
  },
  {
   "bookId": 15,
   "bookName": "Consensus",
   "market": "core_bet_type_6_team_score",
   "period": "event",
   "side": "under",
   "teamId": 156,
   "competitorId": null,
   "playerId": null,
   "opposingCompetitorIds": null,
   "odds": 105,
   "decimalOdds": 2.05,
   "line": 23.5,
   "impliedProbability": 0.487805,
   "isLive": false,
   "lineStatus": "normal",
   "isAlternate": null,
   "ticketPercent": null,
   "moneyPercent": null,
   "sharpGap": null,
   "marketId": "21790042",
   "outcomeId": "2849916711",
   "deeplinkId": null,
   "bookParentId": null,
   "optionTypeId": 2,
   "propTypeId": 166,
   "oddsCoefficientScore": null,
   "eventId": 290843,
   "eventType": "game"
  }
 ],
 "result": {
  "winner": "home",
  "againstTheSpread": "away",
  "overUnder": "under",
  "spreadMargin": -0.5,
  "totalLine": 44.5,
  "totalPoints": 23
 },
 "ranks": null,
 "lastPlay": {
  "text": "End Game",
  "type": "game_over",
  "clock": "0:00",
  "isRedzone": false,
  "possession": 156,
  "homeWinPct": null,
  "overWinPct": null,
  "homeSpreadWinPct": null
 },
 "players": [
  {
   "playerId": 7047,
   "name": "Greg Van Roten",
   "lastName": "Van Roten",
   "abbreviation": "G.Van Roten",
   "jersey": "70",
   "position": "OL",
   "primaryPosition": "OL",
   "teamId": 129,
   "image": "https://assets.actionnetwork.com/200x200/a1c3e0a9f8fc484696450eec6043f60d.png",
   "handedness": null
  }
 ],
 "playerStats": {
  "away": [
   {
    "punts": {
     "srId": "sr:player:1221966",
     "yards": 177,
     "blocked": 0,
     "longest": 46,
     "attempts": 4,
     "avgYards": 44.25,
     "hangTime": 0,
     "inside20": 3,
     "netYards": 168,
     "touchbacks": 0,
     "returnYards": 9,
     "avgHangTime": 0,
     "avgNetYards": 42
    },
    "playerId": 111934,
    "playerName": "Mitch Wishnowsky"
   },
   {
    "defense": {
     "sacks": 0,
     "srId": "sr:player:1235506",
     "tloss": 0,
     "assists": 1,
     "blitzes": 0,
     "hurries": 0,
     "qbHits": 0,
     "tackles": 3,
     "combined": 4,
     "safeties": 0,
     "defComps": 0,
     "spBlocks": 0,
     "knockdowns": 0,
     "sackYards": 0,
     "spAssists": 0,
     "spTackles": 0,
     "defTargets": 0,
     "tlossYards": 0,
     "miscAssists": 0,
     "miscTackles": 0,
     "battedPasses": 0,
     "interceptions": 0,
     "forcedFumbles": 0,
     "missedTackles": 0,
     "passesDefended": 0,
     "fumbleRecoveries": 0,
     "spForcedFumbles": 0,
     "miscForcedFumbles": 0,
     "spFumbleRecoveries": 0,
     "miscFumbleRecoveries": 0,
     "spOppFumbleRecoveries": 0,
     "spOwnFumbleRecoveries": 0
    },
    "playerId": 195122,
    "puntReturns": {
     "srId": "sr:player:1235506",
     "yards": 0,
     "number": 0,
     "avgYards": 0,
     "touchdowns": 0,
     "faircatches": 3
    },
    "playerName": "Marcus Jones"
   },
   {
    "defense": {
     "sacks": 0,
     "srId": "sr:player:1859410",
     "tloss": 0,
     "assists": 0,
     "blitzes": 0,
     "hurries": 0,
     "qbHits": 0,
     "tackles": 0,
     "combined": 0,
     "safeties": 0,
     "defComps": 0,
     "spBlocks": 0,
     "knockdowns": 0,
     "sackYards": 0,
     "spAssists": 0,
     "spTackles": 0,
     "defTargets": 0,
     "tlossYards": 0,
     "miscAssists": 0,
     "miscTackles": 1,
     "battedPasses": 0,
     "interceptions": 0,
     "forcedFumbles": 0,
     "missedTackles": 0,
     "passesDefended": 0,
     "fumbleRecoveries": 0,
     "spForcedFumbles": 0,
     "miscForcedFumbles": 0,
     "spFumbleRecoveries": 0,
     "miscFumbleRecoveries": 0,
     "spOppFumbleRecoveries": 0,
     "spOwnFumbleRecoveries": 0
    },
    "playerId": 242048,
    "receiving": {
     "srId": "sr:player:1859410",
     "yards": 20,
     "longest": 8,
     "targets": 7,
     "airYards": -1,
     "avgYards": 4,
     "receptions": 5,
     "touchdowns": 0,
     "firstDowns": 2,
     "brokenTackles": 0,
     "droppedPasses": 0,
     "redzoneTargets": 0,
     "catchablePasses": 0,
     "yardsAfterCatch": 21,
     "yardsAfterContact": 0
    },
    "playerName": "DeMario Douglas"
   },
   {
    "passing": {
     "sacks": 3,
     "srId": "sr:player:2166974",
     "yards": 178,
     "rating": 54.9,
     "spikes": 0,
     "blitzes": 0,
     "cmpPct": 69.697,
     "hurries": 0,
     "longest": 19,
     "attempts": 33,
     "airYards": 67,
     "avgYards": 5.394,
     "knockdowns": 0,
     "sackYards": 10,
     "touchdowns": 1,
     "completions": 23,
     "firstDowns": 9,
     "pocketTime": 0,
     "poorThrows": 0,
     "throwAways": 0,
     "battedPasses": 0,
     "interceptions": 3,
     "droppedPasses": 0,
     "intTouchdowns": 0,
     "avgPocketTime": 0,
     "defendedPasses": 0,
     "onTargetThrows": 0,
     "redzoneAttempts": 2,
     "longestTouchdown": 2
    },
    "rushing": {
     "srId": "sr:player:2166974",
     "tlost": 0,
     "yards": 47,
     "longest": 16,
     "attempts": 7,
     "avgYards": 6.714,
     "scrambles": 6,
     "touchdowns": 0,
     "firstDowns": 5,
     "kneelDowns": 0,
     "tlostYards": 0,
     "brokenTackles": 0,
     "redzoneAttempts": 0,
     "yardsAfterContact": 0
    },
    "playerId": 277040,
    "playerName": "Drake Maye"
   },
   {
    "playerId": 305047,
    "kickReturns": {
     "srId": "sr:player:2077821",
     "yards": 58,
     "number": 2,
     "longest": 29,
     "avgYards": 29,
     "touchdowns": 0,
     "faircatches": 0
    },
    "playerName": "Kyle Williams"
   },
   {
    "kickoffs": {
     "srId": "sr:player:2158118",
     "yards": 192,
     "number": 3,
     "endzone": 1,
     "inside20": 0,
     "touchbacks": 0,
     "squibKicks": 0,
     "returnYards": 80,
     "outOfBounds": 0,
     "totalEndzone": 1,
     "onsideAttempts": 0,
     "onsideSuccesses": 0
    },
    "playerId": 305181,
    "fieldGoals": {
     "pct": 100,
     "made": 1,
     "srId": "sr:player:2158118",
     "yards": 50,
     "missed": 0,
     "blocked": 0,
     "longest": 50,
     "made19": 0,
     "made29": 0,
     "made39": 0,
     "made49": 0,
     "made50": 1,
     "attempts": 1,
     "avgYards": 50,
     "attempts19": 0,
     "attempts29": 0,
     "attempts39": 0,
     "attempts49": 0,
     "attempts50": 1
    },
    "extraPoints": {
     "kicks": {
      "pct": 100,
      "made": 1,
      "srId": "sr:player:2158118",
      "missed": 0,
      "blocked": 0,
      "attempts": 1
     }
    },
    "playerName": "Andy Borregales"
   },
   {
    "playerId": 334028,
    "receiving": {
     "srId": "sr:player:2300709",
     "yards": 2,
     "longest": 2,
     "targets": 1,
     "airYards": 2,
     "avgYards": 2,
     "receptions": 1,
     "touchdowns": 1,
     "firstDowns": 1,
     "brokenTackles": 0,
     "droppedPasses": 0,
     "redzoneTargets": 1,
     "catchablePasses": 0,
     "longestTouchdown": 2,
     "yardsAfterCatch": 0,
     "yardsAfterContact": 0
    },
    "playerName": "Eli Raridon"
   }
  ],
  "home": [
   {
    "defense": {
     "sacks": 0,
     "srId": "sr:player:1195944",
     "tloss": 2,
     "assists": 2,
     "blitzes": 0,
     "hurries": 0,
     "qbHits": 0,
     "tackles": 4,
     "combined": 6,
     "safeties": 0,
     "defComps": 0,
     "spBlocks": 0,
     "knockdowns": 0,
     "sackYards": 0,
     "spAssists": 0,
     "spTackles": 0,
     "defTargets": 0,
     "tlossYards": 3,
     "miscAssists": 0,
     "miscTackles": 0,
     "battedPasses": 0,
     "interceptions": 1,
     "forcedFumbles": 0,
     "missedTackles": 0,
     "passesDefended": 1,
     "fumbleRecoveries": 0,
     "spForcedFumbles": 0,
     "miscForcedFumbles": 0,
     "spFumbleRecoveries": 0,
     "miscFumbleRecoveries": 0,
     "spOppFumbleRecoveries": 0,
     "spOwnFumbleRecoveries": 0
    },
    "playerId": 111889,
    "intReturns": {
     "srId": "sr:player:1195944",
     "yards": 0,
     "number": 1,
     "longest": 0,
     "avgYards": 0,
     "touchdowns": 0
    },
    "playerName": "Julian Love"
   },
   {
    "playerId": 195610,
    "receiving": {
     "srId": "sr:player:1239774",
     "yards": 4,
     "longest": 4,
     "targets": 3,
     "airYards": 2,
     "avgYards": 4,
     "receptions": 1,
     "touchdowns": 0,
     "firstDowns": 0,
     "brokenTackles": 0,
     "droppedPasses": 0,
     "redzoneTargets": 0,
     "catchablePasses": 0,
     "yardsAfterCatch": 2,
     "yardsAfterContact": 0
    },
    "kickReturns": {
     "srId": "sr:player:1239774",
     "yards": 80,
     "number": 3,
     "longest": 30,
     "avgYards": 26.667,
     "touchdowns": 0,
     "faircatches": 0
    },
    "puntReturns": {
     "srId": "sr:player:1239774",
     "yards": 9,
     "number": 1,
     "longest": 9,
     "avgYards": 9,
     "touchdowns": 0,
     "faircatches": 3
    },
    "playerName": "Rashid Shaheed"
   }
  ]
 },
 "playerSeasonStats": null,
 "lineups": null,
 "plays": [
  {
   "id": "31978900-acc7-11f1-9e5e-e95b96a5fc90",
   "type": "game_over",
   "period": 4,
   "clock": "0:00",
   "possession": 156,
   "down": 1,
   "distance": 10,
   "resultDown": 2,
   "resultDistance": 11,
   "yardline": 20,
   "yardlineText": "SEA 20",
   "yardsToEndzone": 80,
   "resultYardline": 19,
   "resultYardlineText": "SEA 19",
   "resultYardsToEndzone": 81,
   "redzone": false,
   "scoring": false,
   "homePoints": 13,
   "awayPoints": 10,
   "text": "End Game",
   "description": "",
   "homeWinPct": 1,
   "overWinPct": 0,
   "homeSpreadWinPct": 0,
   "situationDisplay": "1st & 10 @ SEA 20"
  }
 ],
 "officials": null,
 "venue": {
  "id": 342,
  "name": "Lumen Field",
  "city": "Seattle, WA",
  "state": "WA",
  "surface": "grass",
  "roofType": "outdoor",
  "directionDegrees": 180,
  "imageUrl": "https://images.actionnetwork.com/blog/2019/08/SEA.jpg",
  "neutralSite": false
 },
 "weather": null,
 "teamStats": {
  "away": {
   "summary": {
    "fumbles": 0,
    "avgGain": 4.1,
    "penalties": 7,
    "turnovers": 3,
    "playCount": 67,
    "rushPlays": 31,
    "totalYards": 277,
    "lostFumbles": 0,
    "penaltyYards": 50,
    "possessionTime": "34:17"
   },
   "punts": {
    "attempts": 4,
    "avgYards": 44.25
   },
   "passing": {
    "yards": 178,
    "cmpPct": 69.697,
    "attempts": 33,
    "avgYards": 4.667,
    "netYards": 168,
    "touchdowns": 1,
    "completions": 23,
    "interceptions": 3,
    "sacks": 3,
    "sackYards": 10
   },
   "fieldGoals": {
    "made": 1,
    "attempts": 1
   },
   "rushing": {
    "yards": 109,
    "attempts": 31,
    "avgYards": 3.516,
    "touchdowns": 0
   },
   "efficiency": {
    "redzone": {
     "pct": 50,
     "attempts": 2,
     "successes": 1
    },
    "thirddown": {
     "pct": 31.25,
     "attempts": 16,
     "successes": 5
    },
    "fourthdown": {
     "pct": 100,
     "attempts": 2,
     "successes": 2
    }
   },
   "firstDowns": {
    "pass": 9,
    "rush": 7,
    "total": 19,
    "penalty": 3
   }
  },
  "home": {
   "summary": {
    "fumbles": 0,
    "avgGain": 5.9,
    "penalties": 10,
    "turnovers": 0,
    "playCount": 48,
    "rushPlays": 22,
    "totalYards": 285,
    "lostFumbles": 0,
    "penaltyYards": 98,
    "possessionTime": "25:43"
   },
   "punts": {
    "attempts": 5,
    "avgYards": 45.4
   },
   "passing": {
    "yards": 200,
    "cmpPct": 70.833,
    "attempts": 24,
    "avgYards": 7.231,
    "netYards": 188,
    "touchdowns": 1,
    "completions": 17,
    "interceptions": 0,
    "sacks": 2,
    "sackYards": 12
   },
   "fieldGoals": {
    "made": 2,
    "attempts": 2
   },
   "rushing": {
    "yards": 97,
    "attempts": 22,
    "avgYards": 4.409,
    "touchdowns": 0
   },
   "efficiency": {
    "redzone": {
     "pct": 0,
     "attempts": 2,
     "successes": 0
    },
    "thirddown": {
     "pct": 18.182,
     "attempts": 11,
     "successes": 2
    },
    "fourthdown": {
     "pct": 100,
     "attempts": 1,
     "successes": 1
    }
   },
   "firstDowns": {
    "pass": 9,
    "rush": 4,
    "total": 13,
    "penalty": 0
   }
  }
 },
 "gameMetadataTitle": null,
 "meta": null,
 "leagueInfo": {
  "league": {
   "id": 1,
   "sport": "football",
   "name": "nfl",
   "description": "National Football League",
   "logo": "https://static.sprtactn.co/leagues/500/nfl.png",
   "currentSeason": "2026",
   "currentSeasonType": "reg",
   "preSeasonStart": "2026-07-30T07:00:00.000Z",
   "preSeasonEnd": "2026-09-02T06:59:59.000Z",
   "regSeasonStart": "2026-08-30T07:00:00.000Z",
   "regSeasonEnd": "2027-01-18T07:59:59.000Z",
   "postSeasonStart": "2027-01-12T08:00:00.000Z",
   "postSeasonEnd": "2027-03-11T07:59:59.000Z",
   "blacklistDates": [
    "2025-05-27T07:00:00.000Z"
   ],
   "calendarInfo": {
    "pre": [
     {
      "abbr": "HoF",
      "week": 0,
      "label": "Hall of Fame Weekend",
      "endDate": "2026-08-07T21:59Z",
      "startDate": "2026-07-27T01:00Z"
     }
    ],
    "reg": [
     {
      "abbr": "Week 1",
      "week": 1,
      "label": "Week 1",
      "endDate": "2026-09-15T04:59Z",
      "startDate": "2026-08-29T02:00Z"
     }
    ],
    "post": [
     {
      "abbr": "Wild Card",
      "week": 1,
      "label": "Wild Card",
      "endDate": "2027-01-19T04:59Z",
      "startDate": "2027-01-11T05:00Z"
     }
    ]
   },
   "currentWeek": 1,
   "updatedAt": "2026-08-30T16:25:20.339Z",
   "isActive": true,
   "conferences": [
    {
     "id": "AFC",
     "display": "AFC"
    }
   ],
   "divisions": [
    {
     "id": "EAST",
     "display": "East",
     "conferenceId": "AFC"
    }
   ]
  },
  "contentLiveCount": 0
 },
 "expertPicks": [
  {
   "expertId": 192808,
   "name": "Doug Ziefel",
   "username": "Dziefel7",
   "profileUrl": "https://www.actionnetwork.com/u/Dziefel7",
   "isVerified": false,
   "followers": 2926,
   "pictureUrl": "https://s3.amazonaws.com/tan-user-assets/profile_images/192808/1770134362060-2ee0fa7424f04b648e6a8f80923649ee.jpg",
   "bio": "Editor at Action Network and CFB,CBB,MLB, and College ⚾️ Contributor",
   "isExpert": true,
   "isInternalExpert": true,
   "activePicks": 16,
   "winStreak": {
    "type": "cold",
    "value": 2,
    "startDate": "2026-09-12T07:00:00+00:00"
   },
   "record": {
    "window": "last_month",
    "wins": 43,
    "losses": 61,
    "pushes": 0,
    "unitsNet": 0.0693999999999999,
    "roi": 0.15,
    "count": 104
   },
   "picks": [
    {
     "pickId": 552643074,
     "play": "NE +3.5",
     "market": "spread_away",
     "period": "game",
     "line": 3.5,
     "odds": -105,
     "units": 0.53,
     "unitsNet": 0.5048,
     "teamId": 129,
     "playerId": null,
     "bookId": 4620,
     "bookName": "theScore Bet NJ",
     "result": "win",
     "isVerified": true,
     "createdAt": "2026-08-17T13:19:18.165Z",
     "settledAt": "2026-09-10T03:25:55.916Z",
     "updatedAt": "2026-09-10T12:10:01.708Z",
     "status": "settled",
     "startsAt": "2026-09-10T00:20:00.000Z",
     "endsAt": "2026-09-10T06:59:59.999Z",
     "recordDate": "2026-09-09T07:00:00.000Z",
     "isLive": false,
     "money": 53,
     "moneyNet": 50.4762,
     "unitsType": "unit",
     "actualValue": null,
     "currentProjection": null,
     "customPickName": null,
     "customPickType": null,
     "customPickRules": null,
     "tag": null,
     "image": null,
     "playerImage": null,
     "marketId": "21790021",
     "outcomeId": "2670793363",
     "gameId": 290843,
     "competitionId": null,
     "competitorId": null,
     "leagueId": 1,
     "leagueName": "nfl",
     "groupPickId": null,
     "playerPropProjectionId": null,
     "userId": 192808,
     "gameTitle": null,
     "meta": {
      "leagueName": "nfl",
      "marketLineId": 2670793363,
      "isAltMarket": false
     },
     "playerName": null
    },
    {
     "pickId": 554897813,
     "play": "R.Stevenson First Touchdown Scorer Yes",
     "market": "custom",
     "period": "game",
     "line": 0,
     "odds": 900,
     "units": 0.1,
     "unitsNet": -0.1,
     "teamId": null,
     "playerId": 166374,
     "bookId": 69,
     "bookName": "FanDuel NJ",
     "result": "loss",
     "isVerified": true,
     "createdAt": "2026-09-10T00:02:50.851Z",
     "settledAt": "2026-09-10T03:25:55.916Z",
     "updatedAt": "2026-09-10T12:10:01.708Z",
     "status": "settled",
     "startsAt": "2026-09-10T00:20:00.000Z",
     "endsAt": "2026-09-10T06:59:59.999Z",
     "recordDate": "2026-09-09T07:00:00.000Z",
     "isLive": false,
     "money": 1,
     "moneyNet": -1,
     "unitsType": "unit",
     "actualValue": "E.Raridon -",
     "currentProjection": null,
     "customPickName": "First Touchdown Scorer",
     "customPickType": "core_bet_type_56_first_touchdown_scorer",
     "customPickRules": {
      "options": {
       "1": {
        "sortOrder": 1,
        "optionType": "Yes",
        "abbreviation": null
       }
      },
      "betType": "moneyline",
      "fullName": "First Touchdown Scorer",
      "sortOrder": {
       "nfl": 7,
       "ncaaf": 5
      },
      "gradingRule": "firstTDScorer",
      "displayTemplate": "{player_full_name} 1st TD {money}"
     },
     "tag": null,
     "image": null,
     "playerImage": null,
     "marketId": "23014117",
     "outcomeId": "2752070702",
     "gameId": 290843,
     "competitionId": null,
     "competitorId": null,
     "leagueId": 1,
     "leagueName": "nfl",
     "groupPickId": null,
     "playerPropProjectionId": null,
     "userId": 192808,
     "gameTitle": null,
     "meta": {
      "note": "Boost used",
      "leagueName": "nfl",
      "isAltMarket": false,
      "optionTypeId": 1
     },
     "playerName": "Rhamondre Stevenson"
    },
    {
     "pickId": 554413535,
     "play": "J.Price u1.5 Recs",
     "market": "custom",
     "period": "game",
     "line": 1.5,
     "odds": -115,
     "units": 0.57,
     "unitsNet": -0.57,
     "teamId": null,
     "playerId": 333961,
     "bookId": 2724,
     "bookName": "HardRock NJ",
     "result": "loss",
     "isVerified": true,
     "createdAt": "2026-09-05T20:55:59.517Z",
     "settledAt": "2026-09-10T03:25:55.916Z",
     "updatedAt": "2026-09-10T12:10:01.708Z",
     "status": "settled",
     "startsAt": "2026-09-10T00:20:00.000Z",
     "endsAt": "2026-09-10T06:59:59.999Z",
     "recordDate": "2026-09-09T07:00:00.000Z",
     "isLive": false,
     "money": 5.7,
     "moneyNet": -5.7,
     "unitsType": "unit",
     "actualValue": "2",
     "currentProjection": "2",
     "customPickName": "Recs",
     "customPickType": "core_bet_type_15_receptions",
     "customPickRules": {
      "options": {
       "18": {
        "sortOrder": 1,
        "optionType": "Over",
        "abbreviation": "o"
       }
      },
      "betType": "total",
      "statKey": [
       "receiving.receptions"
      ],
      "fullName": "Receptions",
      "sortOrder": {
       "nfl": 5,
       "ncaaf": 3
      },
      "propellerConfig": {
       "range": 15,
       "enabled": true
      }
     },
     "tag": null,
     "image": null,
     "playerImage": null,
     "marketId": "24937560",
     "outcomeId": "2919355268",
     "gameId": 290843,
     "competitionId": null,
     "competitorId": null,
     "leagueId": 1,
     "leagueName": "nfl",
     "groupPickId": null,
     "playerPropProjectionId": 138252561,
     "userId": 192808,
     "gameTitle": null,
     "meta": {
      "leagueName": "nfl",
      "isAltMarket": false,
      "optionTypeId": 19,
      "originalPickId": 554410634
     },
     "playerName": "Jadarian Price"
    }
   ]
  },
  {
   "expertId": 2108497,
   "name": "Dale Tanhardt",
   "username": "daletanhardt",
   "profileUrl": "https://www.actionnetwork.com/u/daletanhardt",
   "isVerified": false,
   "followers": 10052,
   "pictureUrl": "https://s3.amazonaws.com/tan-user-assets/profile_images/2108497/1644070326041-99330090868d11ecb14f8ddaad65961a.jpg",
   "bio": "Greatest NASCAR Bettor in the History of the Universe. Host of DALESCENTER on YouTube. Degenerate NASCAR Guy. Check me out on DubClub to see all of my NASCAR Betting Cards.",
   "isExpert": true,
   "isInternalExpert": false,
   "activePicks": 0,
   "winStreak": {
    "type": "cold",
    "value": 6,
    "startDate": "2026-06-14T07:00:00+00:00"
   },
   "record": {
    "window": "last_month",
    "wins": 0,
    "losses": 10,
    "pushes": 0,
    "unitsNet": -6.8,
    "roi": -100,
    "count": 10
   },
   "picks": [
    {
     "pickId": 554887407,
     "play": "H.Henry 2+ TDs Yes",
     "market": "custom",
     "period": "game",
     "line": 0,
     "odds": 2700,
     "units": 0.2,
     "unitsNet": -0.2,
     "teamId": null,
     "playerId": 5794,
     "bookId": 15,
     "bookName": "Consensus",
     "result": "loss",
     "isVerified": true,
     "createdAt": "2026-09-09T23:24:36.116Z",
     "settledAt": "2026-09-10T03:25:56.128Z",
     "updatedAt": "2026-09-10T03:26:32.217Z",
     "status": "settled",
     "startsAt": "2026-09-10T00:20:00.000Z",
     "endsAt": "2026-09-10T06:59:59.999Z",
     "recordDate": "2026-09-09T07:00:00.000Z",
     "isLive": false,
     "money": 10,
     "moneyNet": -10,
     "unitsType": "unit",
     "actualValue": 0,
     "currentProjection": null,
     "customPickName": "TDs",
     "customPickType": "core_bet_type_67_to_score_2_or_more_touchdowns",
     "customPickRules": {
      "options": {
       "1": {
        "sortOrder": 1,
        "optionType": "Yes",
        "abbreviation": null
       }
      },
      "betType": "moneyline",
      "fullName": "To Score 2 or More Touchdowns",
      "sortOrder": {
       "nfl": 20,
       "ncaaf": 20
      },
      "gradingRule": "twoOrMoreTouchdowns",
      "playerPropProjectionConfig": {
       "type": "actual_value",
       "enabled": true,
       "displayStatKey": "TD"
      }
     },
     "tag": null,
     "image": null,
     "playerImage": null,
     "marketId": "23014118",
     "outcomeId": "2752070727",
     "gameId": 290843,
     "competitionId": null,
     "competitorId": null,
     "leagueId": 1,
     "leagueName": "nfl",
     "groupPickId": null,
     "playerPropProjectionId": null,
     "userId": 2108497,
     "gameTitle": null,
     "meta": {
      "leagueName": "nfl",
      "isAltMarket": false,
      "optionTypeId": 1
     },
     "playerName": "Hunter Henry"
    }
   ]
  },
  {
   "expertId": 3565328,
   "name": "julian saavedra",
   "username": "theparlayplug",
   "profileUrl": "https://www.actionnetwork.com/u/theparlayplug",
   "isVerified": false,
   "followers": 3906,
   "pictureUrl": "https://s3.amazonaws.com/tan-user-assets/profile_images/3565328/1722565447266-4b5f1420507611efb2e60bd2be1518ec.jpg",
   "bio": "🔌 | Winners | Partnership➡@SleeperPicksHq @UnderdogFantasy @ChalkboardHq use code: PLUG",
   "isExpert": true,
   "isInternalExpert": false,
   "activePicks": 0,
   "winStreak": {
    "type": "cold",
    "value": 2,
    "startDate": "2026-09-09T07:00:00+00:00"
   },
   "record": {
    "window": "last_month",
    "wins": 0,
    "losses": 1,
    "pushes": 0,
    "unitsNet": -1,
    "roi": -100,
    "count": 1
   },
   "picks": [
    {
     "pickId": 554922201,
     "play": "NE -110",
     "market": "ml_away",
     "period": "game",
     "line": -110,
     "odds": -110,
     "units": 1,
     "unitsNet": -1,
     "teamId": 129,
     "playerId": null,
     "bookId": 79,
     "bookName": "bet365 NJ",
     "result": "loss",
     "isVerified": true,
     "createdAt": "2026-09-10T03:25:48.076Z",
     "settledAt": "2026-09-10T03:25:43.761Z",
     "updatedAt": "2026-09-10T03:25:48.456Z",
     "status": "settled",
     "startsAt": "2026-09-10T00:20:00.000Z",
     "endsAt": "2026-09-10T06:59:59.999Z",
     "recordDate": "2026-09-09T07:00:00.000Z",
     "isLive": false,
     "money": 1000,
     "moneyNet": -1000,
     "unitsType": "unit",
     "actualValue": null,
     "currentProjection": null,
     "customPickName": null,
     "customPickType": null,
     "customPickRules": null,
     "tag": null,
     "image": null,
     "playerImage": null,
     "marketId": null,
     "outcomeId": null,
     "gameId": 290843,
     "competitionId": null,
     "competitorId": null,
     "leagueId": 1,
     "leagueName": "nfl",
     "groupPickId": null,
     "playerPropProjectionId": null,
     "userId": 3565328,
     "gameTitle": null,
     "meta": {
      "tease": 0,
      "bookId": 79,
      "chances": 0,
      "isSynced": true,
      "datePlaced": "2026-09-10T00:43:18.128",
      "isSupported": true,
      "referenceId": "79:3565328:900743015218835280_1"
     },
     "playerName": null
    }
   ]
  },
  {
   "expertId": 4377546,
   "name": "Charlie DiSturco",
   "username": "charliedisturco",
   "profileUrl": "https://www.actionnetwork.com/u/charliedisturco",
   "isVerified": false,
   "followers": 1098,
   "pictureUrl": "https://s3.amazonaws.com/tan-user-assets/profile_images/4377546/1780604139713-9e34c5fa7246460db4f347132cdc7462.jpg",
   "bio": "Just a Jersey Italian that loves to gamble.",
   "isExpert": true,
   "isInternalExpert": false,
   "activePicks": 1,
   "winStreak": {
    "type": "hot",
    "value": 4,
    "startDate": "2026-09-10T07:00:00+00:00"
   },
   "record": {
    "window": "last_month",
    "wins": 7,
    "losses": 19,
    "pushes": 0,
    "unitsNet": 0.5225000000000002,
    "roi": 4.22,
    "count": 26
   },
   "picks": [
    {
     "pickId": 554835150,
     "play": "K.Williams Anytime TD Scorer Yes",
     "market": "custom",
     "period": "game",
     "line": 0,
     "odds": 1300,
     "units": 0.25,
     "unitsNet": 0,
     "teamId": null,
     "playerId": 305047,
     "bookId": 1006,
     "bookName": "FanDuel NY",
     "result": "loss",
     "isVerified": true,
     "createdAt": "2026-09-09T18:25:10.925Z",
     "settledAt": "2026-09-10T03:25:55.668Z",
     "updatedAt": "2026-09-10T14:41:36.904Z",
     "status": "settled",
     "startsAt": "2026-09-10T00:20:00.000Z",
     "endsAt": "2026-09-10T06:59:59.999Z",
     "recordDate": "2026-09-09T07:00:00.000Z",
     "isLive": false,
     "money": 0.25,
     "moneyNet": 0,
     "unitsType": "unit",
     "actualValue": 0,
     "currentProjection": null,
     "customPickName": "TDs",
     "customPickType": "core_bet_type_62_anytime_touchdown_scorer",
     "customPickRules": {
      "options": {
       "1": {
        "sortOrder": 1,
        "optionType": "Yes",
        "abbreviation": null
       }
      },
      "betType": "moneyline",
      "fullName": "Anytime Touchdown Scorer",
      "sortOrder": {
       "nfl": 1,
       "ncaaf": 4
      },
      "gradingRule": "anytimeTDScorer",
      "displayTemplate": "{player_full_name} Anytime TD {money}"
     },
     "tag": null,
     "image": null,
     "playerImage": null,
     "marketId": "21804695",
     "outcomeId": "2670531830",
     "gameId": 290843,
     "competitionId": null,
     "competitorId": null,
     "leagueId": 1,
     "leagueName": "nfl",
     "groupPickId": null,
     "playerPropProjectionId": null,
     "userId": 4377546,
     "gameTitle": null,
     "meta": {
      "note": "Using this as my free bet. FanDuel offering bonus for 1+ pt. Rolling the dice with it here on Kyle w/ SEA safeties banged up",
      "isFree": true,
      "leagueName": "nfl",
      "isAltMarket": false,
      "optionTypeId": 1
     },
     "playerName": "Kyle Williams"
    },
    {
     "pickId": 554777038,
     "play": "H.Henry o33.5 Rec Yds",
     "market": "custom",
     "period": "game",
     "line": 33.5,
     "odds": -113,
     "units": 1.13,
     "unitsNet": -1.13,
     "teamId": null,
     "playerId": 5794,
     "bookId": 1006,
     "bookName": "FanDuel NY",
     "result": "loss",
     "isVerified": true,
     "createdAt": "2026-09-09T05:01:42.927Z",
     "settledAt": "2026-09-10T03:25:55.668Z",
     "updatedAt": "2026-09-10T14:41:36.904Z",
     "status": "settled",
     "startsAt": "2026-09-10T00:20:00.000Z",
     "endsAt": "2026-09-10T06:59:59.999Z",
     "recordDate": "2026-09-09T07:00:00.000Z",
     "isLive": false,
     "money": 1.13,
     "moneyNet": -1.13,
     "unitsType": "unit",
     "actualValue": "26",
     "currentProjection": "26",
     "customPickName": "Rec Yds",
     "customPickType": "core_bet_type_16_receiving_yards",
     "customPickRules": {
      "options": {
       "20": {
        "sortOrder": 1,
        "optionType": "Over",
        "abbreviation": "o"
       }
      },
      "betType": "total",
      "statKey": [
       "receiving.yards"
      ],
      "fullName": "Receiving Yards",
      "sortOrder": {
       "nfl": 3,
       "ncaaf": 1
      },
      "propellerConfig": {
       "range": 45,
       "enabled": true
      }
     },
     "tag": "#Tailing",
     "image": null,
     "playerImage": null,
     "marketId": "22223928",
     "outcomeId": "2751994592",
     "gameId": 290843,
     "competitionId": null,
     "competitorId": null,
     "leagueId": 1,
     "leagueName": "nfl",
     "groupPickId": null,
     "playerPropProjectionId": 138252574,
     "userId": 4377546,
     "gameTitle": null,
     "meta": {
      "note": "#Tailing @Stuckey2",
      "leagueName": "nfl",
      "isAltMarket": false,
      "userMentions": [
       {
        "id": 49763,
        "username": "Stuckey2"
       }
      ],
      "optionTypeId": 20
     },
     "playerName": "Hunter Henry"
    }
   ]
  }
 ],
 "lineMovementHistory": [
  {
   "bookId": 15,
   "bookName": "Consensus",
   "market": "core_bet_type_6_team_score",
   "period": "event",
   "side": "under",
   "teamId": 129,
   "competitorId": null,
   "playerId": null,
   "currentOdds": -112,
   "currentDecimalOdds": 1.8929,
   "currentLine": 20.5,
   "currentImpliedProbability": 0.528302,
   "currentLineStatus": "normal",
   "isLive": false,
   "ticketPercent": 0,
   "moneyPercent": 0,
   "sharpGap": 0,
   "marketId": "21790040",
   "outcomeId": "2849916707",
   "deeplinkId": null,
   "optionTypeId": 2,
   "propTypeId": 166,
   "oddsCoefficientScore": null,
   "eventId": 290843,
   "eventType": "game",
   "history": [
    {
     "odds": -115,
     "line": 20.5,
     "recordedAt": "2026-08-20T00:26:25.114633Z",
     "lineStatus": "opener"
    },
    {
     "odds": -115,
     "line": 20.5,
     "recordedAt": "2026-08-20T00:28:25.114451Z",
     "lineStatus": "normal"
    }
   ]
  }
 ],
 "props": {
  "gameId": 290843,
  "playerProps": [
   {
    "marketId": "25116884",
    "propType": "core_bet_type_530_1104_player_receiving_yards_milestones_20_or_more",
    "propName": "20+ Receiving Yards",
    "lineType": null,
    "period": "firsthalf",
    "customPickTypeName": "20+ Receiving Yards",
    "customPickTypeDisplayName": "H.Henry {optionTypeAbbr}{value} 20+ Receiving Yards",
    "eventType": "game",
    "teamId": 129,
    "playerId": 5794,
    "playerAbbreviation": "H.Henry",
    "playerLastName": "Henry",
    "selections": [
     {
      "bookId": 15,
      "bookName": "Consensus",
      "playerId": 5794,
      "player": {
       "playerId": 5794,
       "name": "Hunter Henry",
       "abbreviation": "H.Henry",
       "teamId": 129,
       "position": "NE - TE",
       "image": "https://assets.actionnetwork.com/200x200/97f6b7c2b951446b909af12b0f231dac.png",
       "lastName": "Henry",
       "actualValues": null
      },
      "side": "noside",
      "teamId": null,
      "competitorId": null,
      "opposingCompetitorIds": null,
      "odds": -310,
      "decimalOdds": 1.3226,
      "line": 20,
      "impliedProbability": 0.756098,
      "isLive": false,
      "lineStatus": "normal",
      "isAlternate": null,
      "ticketPercent": null,
      "moneyPercent": null,
      "sharpGap": null,
      "marketId": "23012590",
      "outcomeId": "2751994640",
      "deeplinkId": null,
      "bookParentId": null,
      "optionTypeId": 1,
      "propTypeId": 298,
      "oddsCoefficientScore": null,
      "eventId": 290843,
      "eventType": "game",
      "period": "event"
     }
    ]
   }
  ],
  "gameProps": [
   {
    "marketId": "21790043",
    "propType": "core_bet_type_6_team_score",
    "propName": "Team Total",
    "lineType": "total",
    "period": "firsthalf",
    "customPickTypeName": "Team Total",
    "customPickTypeDisplayName": "{optionTypeAbbr}{value} Team Total",
    "eventType": "game",
    "teamId": null,
    "playerId": null,
    "playerAbbreviation": null,
    "playerLastName": null,
    "selections": [
     {
      "bookId": 15,
      "bookName": "Consensus",
      "playerId": null,
      "player": null,
      "side": "under",
      "teamId": 129,
      "competitorId": null,
      "opposingCompetitorIds": null,
      "odds": -109,
      "decimalOdds": 1.9174,
      "line": 9,
      "impliedProbability": 0.521531,
      "isLive": false,
      "lineStatus": "normal",
      "isAlternate": null,
      "ticketPercent": null,
      "moneyPercent": null,
      "sharpGap": null,
      "marketId": "21790043",
      "outcomeId": "2849916720",
      "deeplinkId": null,
      "bookParentId": null,
      "optionTypeId": 2,
      "propTypeId": 166,
      "oddsCoefficientScore": null,
      "eventId": 290843,
      "eventType": "game",
      "period": "firsthalf"
     }
    ]
   }
  ],
  "propOrder": [
   {
    "propOrderId": 2002,
    "propType": "core_bet_type_62_anytime_touchdown_scorer",
    "name": "Anytime TD Scorer",
    "sortOrder": 1
   }
  ],
  "marketRules": {
   "coreBetType5241036PlayerPassingTouchdownsMilestones3OrMore": {
    "type": "core_bet_type_524_1036_player_passing_touchdowns_milestones_3_or_more",
    "rules": {
     "options": {
      "1": {
       "sortOrder": 1,
       "optionType": "Yes",
       "abbreviation": null
      }
     },
     "fullName": "Player Passing Touchdowns Milestones",
     "milestone": {
      "statKey": "passing.touchdowns",
      "threshold": 3
     },
     "sortOrder": {
      "nfl": 20,
      "ncaaf": 20
     },
     "gradingRule": "playerStatMilestone"
    },
    "customPickName": "3+ Passing Touchdowns"
   },
   "coreBetType61CoinTossOutcome": {
    "type": "core_bet_type_61_coin_toss_outcome",
    "rules": {
     "options": {
      "339": {
       "sortOrder": 1,
       "optionType": "Heads",
       "abbreviation": null,
       "gradingRule": "heads"
      }
     },
     "fullName": "Coin Toss Outcome",
     "sortOrder": {
      "nfl": 2
     },
     "gradingRule": "coinTossOutcome",
     "scoreboardConfig": {
      "dataType": "contest",
      "displayType": "grid_2",
      "displayTemplate": "grid_2"
     }
    },
    "customPickName": "Coin Toss Outcome"
   },
   "coreBetType65Interceptions": {
    "type": "core_bet_type_65_interceptions",
    "rules": {
     "options": {
      "400": {
       "sortOrder": 1,
       "optionType": "Over",
       "abbreviation": "o"
      }
     },
     "betType": "total",
     "statKey": [
      "passing.interceptions"
     ],
     "fullName": "Interceptions",
     "sortOrder": {
      "nfl": 13
     },
     "propellerConfig": {
      "range": 5,
      "enabled": true
     }
    },
    "customPickName": "Int"
   },
   "coreBetType67ToScore2OrMoreTouchdowns": {
    "type": "core_bet_type_67_to_score_2_or_more_touchdowns",
    "rules": {
     "options": {
      "1": {
       "sortOrder": 1,
       "optionType": "Yes",
       "abbreviation": null
      }
     },
     "betType": "moneyline",
     "fullName": "To Score 2 or More Touchdowns",
     "sortOrder": {
      "nfl": 20,
      "ncaaf": 20
     },
     "gradingRule": "twoOrMoreTouchdowns",
     "playerPropProjectionConfig": {
      "type": "actual_value",
      "enabled": true,
      "displayStatKey": "TD"
     }
    },
    "customPickName": "2+ TDs"
   },
   "coreBetType6TeamScore": {
    "type": "core_bet_type_6_team_score",
    "rules": {
     "options": {
      "1": {
       "side": "over",
       "sortOrder": 1,
       "optionType": "Over",
       "abbreviation": "o"
      }
     },
     "betType": "total",
     "sortOrder": {
      "aaf": 10,
      "epl": 10,
      "mlb": 10,
      "mls": 10,
      "nba": 10,
      "nfl": 10,
      "nhl": 10,
      "xfl": 10,
      "euro": 10,
      "wnba": 10,
      "ncaab": 10,
      "ncaaf": 10,
      "europa": 10,
      "laliga": 10,
      "ligue1": 10,
      "seriea": 10,
      "worldcup": 10,
      "champions": 10,
      "bundesliga": 10,
      "clubWorldcup": 10,
      "womensWorldcup": 10,
      "mensOlympicHockey": 10,
      "womensOlympicHockey": 10
     },
     "gradingRule": "teamTotal",
     "scoreboardConfig": {
      "dataType": "team",
      "multiplePeriods": true
     }
    },
    "customPickName": "Team Total"
   },
   "coreBetType965PlayerToHaveMostPassingYards": {
    "type": "core_bet_type_965_player_to_have_most_passing_yards",
    "rules": {
     "options": {
      "1": {
       "sortOrder": 1,
       "optionType": "Yes",
       "abbreviation": null
      }
     },
     "betType": "moneyline",
     "fullName": "Player To Have Most Passing Yards",
     "sortOrder": {
      "nfl": 20,
      "ncaaf": 20
     },
     "displayTemplate": "{player_full_name} Most Passing Yards {money}",
     "eventLeaderStatKeys": [
      "passing.yards"
     ]
    },
    "customPickName": "Player To Have Most Passing Yards"
   }
  }
 }
}
```

#### Baseball rows: named lineups, pitching, umpires and play-by-play

Baseball fills blocks that football leaves thin, and every player id in them carries its name:

- final `lineups`, with substitutes
- the probable, starting, winning, losing and saving pitchers, inside `score.pitching`
- the umpiring crew, each with their own betting record
- season stat lines for every player
- plays that name the batter and the pitcher

From San Diego Padres at Colorado Rockies, a game that started at 8:40pm Eastern. Trimmed as follows:

- `lineups.{side}`: 1 of 16
- `officials`: 1 of 4
- `officials[].results`: 1 of 3
- `officials[].results[].records`: 1 of 2
- `playerSeasonStats.{side}`: 1 of 18
- `plays`: 1 of 97
- `plays[].pitches`: 1 of 2
- `players`: 1 of 31

```json
{
 "gameId": 294990,
 "league": "mlb",
 "lineups": {
  "away": [
   {
    "order": 0,
    "inning": 0,
    "position": "P",
    "suborder": 0,
    "playerId": 87829,
    "inningHalf": null,
    "playerName": "Casey Mize"
   }
  ],
  "home": [
   {
    "order": 0,
    "inning": 0,
    "position": "P",
    "suborder": 0,
    "playerId": 299395,
    "inningHalf": null,
    "playerName": "Tomoyuki Sugano"
   }
  ],
  "awayConfirmed": true,
  "homeConfirmed": true
 },
 "officials": [
  {
   "id": 61,
   "position": "1B",
   "fullName": "Andy Fletcher",
   "lastName": "Fletcher",
   "firstName": "Andy",
   "results": [
    {
     "type": "Moneyline",
     "records": [
      {
       "type": "Away",
       "wins": 5
      }
     ],
     "units": 8.11
    }
   ]
  }
 ],
 "playerSeasonStats": {
  "away": [
   {
    "playerId": 2904,
    "hitting": {
     "ab": 538,
     "ap": 621,
     "abk": 4.076,
     "avg": 0.221,
     "bbk": 0.553,
     "bip": 387,
     "iso": 0.192,
     "lob": 230,
     "obp": 0.311,
     "ops": 0.724,
     "rbi": 82,
     "slg": 0.413,
     "xbh": 49,
     "abhr": 19.926,
     "bbpa": 0.118,
     "gofo": 1.03,
     "outs": {
      "fo": 85,
      "go": 141,
      "lo": 41,
      "po": 29,
      "fidp": 2,
      "gidp": 19,
      "lidp": 0,
      "klook": 26,
      "kswing": 106,
      "ktotal": 132,
      "sacfly": 8,
      "sachit": 1
     },
     "runs": {
      "total": 77
     },
     "seca": 0.329,
     "babip": 0.238,
     "games": {
      "play": 145,
      "start": 145,
      "finish": 0,
      "complete": 137
     },
     "popup": 30,
     "steal": {
      "pct": 0.556,
      "caught": 4,
      "stolen": 5,
      "pickoff": 0
     },
     "onbase": {
      "d": 22,
      "h": 119,
      "s": 70,
      "t": 0,
      "bb": 70,
      "ci": 0,
      "fc": 12,
      "hr": 27,
      "tb": 222,
      "hbp": 1,
      "ibb": 3,
      "roe": 6,
      "rov": 0,
      "cycle": 0
     },
     "abRisp": 124,
     "flyball": 116,
     "outcome": {
      "ball": 877,
      "foul": 456,
      "iball": 0,
      "klook": 376,
      "kswing": 298,
      "ktotal": 674,
      "dirtball": 38
     },
     "hitRisp": 29,
     "rbi2out": 29,
     "teamLob": 94,
     "linedrive": 104,
     "groundball": 165,
     "pitchCount": 2461,
     "lobRisp2out": 38
    },
    "pitching": {},
    "playerName": "Manny Machado"
   },
   {
    "playerId": 58592,
    "hitting": {},
    "pitching": {
     "bf": 328,
     "bk": 0,
     "k9": 11.157,
     "wp": 2,
     "era": "2.789",
     "kbb": 4.17,
     "lob": 153,
     "oba": 0.205,
     "gofo": 1.816,
     "ip1": 242,
     "ip2": 80.2,
     "outs": {
      "fo": 26,
      "go": 89,
      "lo": 16,
      "po": 7,
      "fidp": 0,
      "gidp": 6,
      "lidp": 1,
      "klook": 17,
      "kswing": 83,
      "ktotal": 100,
      "sacfly": 2,
      "sachit": 0
     },
     "runs": {
      "total": 30,
      "earned": 25,
      "unearned": 5
     },
     "whip": 1.0537,
     "games": {
      "svo": 8,
      "win": 9,
      "hold": 25,
      "loss": 3,
      "play": 70,
      "save": 3,
      "start": 0,
      "finish": 9,
      "qstart": 0,
      "shutout": 0,
      "complete": 0,
      "teamWin": 0,
      "teamLoss": 0,
      "blownSave": 5
     },
     "steal": {
      "caught": 4,
      "stolen": 12,
      "pickoff": 1
     },
     "onbase": {
      "d": 8,
      "h": 61,
      "s": 49,
      "t": 0,
      "bb": 17,
      "ci": 0,
      "fc": 18,
      "hr": 4,
      "tb": 81,
      "hbp": 5,
      "ibb": 7,
      "roe": 3,
      "rov": 0
     },
     "outcome": {
      "ball": 364,
      "foul": 232,
      "iball": 0,
      "klook": 196,
      "kswing": 224,
      "ktotal": 420,
      "dirtball": 26
     },
     "pitchCount": 1246
    },
    "playerName": "Adrian Morejon"
   }
  ],
  "home": [
   {
    "playerId": 4460,
    "hitting": {
     "ab": 373,
     "ap": 403,
     "abk": 3.36,
     "avg": 0.244,
     "bbk": 0.18,
     "bip": 247,
     "iso": 0.244,
     "lob": 146,
     "obp": 0.283,
     "ops": 0.771,
     "rbi": 64,
     "slg": 0.488,
     "xbh": 43,
     "abhr": 16.955,
     "bbpa": 0.05,
     "gofo": 0.64,
     "outs": {
      "fo": 72,
      "go": 67,
      "lo": 15,
      "po": 24,
      "fidp": 0,
      "gidp": 4,
      "lidp": 1,
      "klook": 15,
      "kswing": 96,
      "ktotal": 111,
      "sacfly": 7,
      "sachit": 0
     },
     "runs": {
      "total": 47
     },
     "seca": 0.298,
     "babip": 0.279,
     "games": {
      "play": 107,
      "start": 92,
      "finish": 13,
      "complete": 79
     },
     "popup": 25,
     "steal": {
      "pct": 0.5,
      "caught": 1,
      "stolen": 1,
      "pickoff": 2
     },
     "onbase": {
      "d": 17,
      "h": 91,
      "s": 48,
      "t": 4,
      "bb": 20,
      "ci": 0,
      "fc": 3,
      "hr": 22,
      "tb": 182,
      "hbp": 3,
      "ibb": 0,
      "roe": 1,
      "rov": 0,
      "cycle": 0
     },
     "abRisp": 73,
     "flyball": 100,
     "outcome": {
      "ball": 400,
      "foul": 310,
      "iball": 0,
      "klook": 152,
      "kswing": 249,
      "ktotal": 401,
      "dirtball": 29
     },
     "hitRisp": 20,
     "rbi2out": 27,
     "teamLob": 62,
     "linedrive": 52,
     "groundball": 92,
     "pitchCount": 1412,
     "lobRisp2out": 31
    },
    "pitching": {},
    "playerName": "Mickey Moniak"
   }
  ]
 },
 "plays": [
  {
   "id": "b3e21cad-9462-4770-b2dc-04a0038b2687_294990",
   "period": 9,
   "scoring": false,
   "homePoints": 7,
   "awayPoints": 8,
   "half": "bottom",
   "text": "Adael Amador grounds out to shallow infield, Manny Machado to Ty France.",
   "atBat": 123550,
   "pitcher": 189973,
   "runners": [
    147482
   ],
   "pitches": [
    "c3745f0f-ff5c-4e28-a057-6f0646728516"
   ],
   "outs": 3,
   "homeWinPct": 0.1747563,
   "overWinPct": 1,
   "homeSpreadWinPct": 0.6521311,
   "atBatName": "Adael Amador",
   "pitcherName": "Mason Miller"
  }
 ],
 "players": [
  {
   "playerId": 2904,
   "name": "Manny Machado",
   "lastName": "Machado",
   "abbreviation": "M.Machado",
   "jersey": "13",
   "position": "3B",
   "primaryPosition": "3B",
   "teamId": 211,
   "image": "https://assets.actionnetwork.com/200x200/ba42554a63f4409d8c625eff89d65e1b.png",
   "handedness": {
    "bat": "R",
    "throw": "R"
   }
  }
 ],
 "score": {
  "pitching": {
   "away": {
    "probableId": 87829,
    "startingId": 87829,
    "probableName": "Casey Mize",
    "startingName": "Casey Mize"
   },
   "home": {
    "probableId": 299395,
    "startingId": 299395,
    "probableName": "Tomoyuki Sugano",
    "startingName": "Tomoyuki Sugano"
   },
   "winId": 87829,
   "lossId": 299395,
   "saveId": 189973,
   "winName": "Casey Mize",
   "lossName": "Tomoyuki Sugano",
   "saveName": "Mason Miller"
  },
  "teamStats": {
   "away": {
    "hits": 13,
    "runs": 8,
    "errors": 0
   },
   "home": {
    "hits": 14,
    "runs": 7,
    "errors": 0
   }
  },
  "awayFirstFivePoints": 6,
  "homeFirstFivePoints": 2
 }
}
```

Upcoming games also carry a game-time forecast in `weather`. Both examples above are finished games, so theirs is empty; this is a real forecast from a scheduled game:

```json
{
 "gameId": 289020,
 "league": "ncaaf",
 "weather": {
  "temperature": 76.71,
  "humidity": 0.83,
  "windSpeed": 4.83,
  "windDegrees": 297,
  "adjustedWindDegrees": 117,
  "clouds": 0.78,
  "precipitation": 0.28,
  "description": "Drizzle",
  "precipitationType": null,
  "windDirectionText": null,
  "date": "2026-09-17T23:00:00+00:00",
  "updatedAt": "2026-09-14T23:59:12.751414+00:00",
  "type": "light-rain",
  "icon": "https://assets.actionnetwork.com/739473_light-rain.png",
  "windDirection": "WNW"
 }
}
```

#### Example match or fight row

Tennis, UFC and boxing return one row per match or fight, with `competitors` in place of teams and `eventType: "competition"`. This WTA match carries all 28 fields. `gameUrl` is left empty for these events.

- `booksPricing`: 2 of 28
- `leagueInfo.league.blacklistDates`: 2 of 120

```json
{
 "gameId": 114016,
 "eventType": "competition",
 "gameUrl": null,
 "league": "wta",
 "leagueId": 23,
 "leagueName": "wta",
 "coreId": 236906340,
 "season": 2026,
 "title": "WTA Guadalajara, Mexico  - Round Of 32",
 "startTime": "2026-09-14T18:00:00.000Z",
 "status": "scheduled",
 "statusDetail": null,
 "isLive": false,
 "isComplete": false,
 "competitors": [
  {
   "competitorId": 270507,
   "playerId": 125771,
   "side": "away",
   "type": "player",
   "player": {
    "name": "Kayla Day",
    "abbreviation": "DAY",
    "image": "https://assets.actionnetwork.com/655755_kday.jfif",
    "nationality": "USA",
    "coreId": 81295,
    "attributes": {
     "hand": "L"
    }
   }
  },
  {
   "competitorId": 270508,
   "playerId": 172880,
   "side": "home",
   "type": "player",
   "player": {
    "name": "Elvina Kalieva",
    "abbreviation": "KAL",
    "image": "https://assets.actionnetwork.com/308320_kalieva.jpeg",
    "nationality": "USA",
    "coreId": 87222,
    "attributes": {
     "hand": "R"
    }
   }
  }
 ],
 "winningCompetitorId": null,
 "venue": null,
 "score": null,
 "consensus": {
  "moneyline": {
   "sides": [
    {
     "side": "noside",
     "teamId": null,
     "competitorId": 270507,
     "playerId": 125771,
     "odds": -173,
     "decimalOdds": 1.578,
     "line": 0,
     "impliedProbability": 0.6337,
     "noVigProbability": 0.594131,
     "ticketPercent": null,
     "moneyPercent": null,
     "sharpGap": null,
     "marketId": "25550201",
     "outcomeId": "2954831561"
    },
    {
     "side": "noside",
     "teamId": null,
     "competitorId": 270508,
     "playerId": 172880,
     "odds": 131,
     "decimalOdds": 2.31,
     "line": 0,
     "impliedProbability": 0.4329,
     "noVigProbability": 0.405869,
     "ticketPercent": null,
     "moneyPercent": null,
     "sharpGap": null,
     "marketId": "25550201",
     "outcomeId": "2954831563"
    }
   ],
   "holdPercent": 6.2441,
   "overroundPercent": 6.66
  },
  "spread": {
   "sides": [
    {
     "side": "noside",
     "teamId": null,
     "competitorId": 270508,
     "playerId": 172880,
     "odds": -145,
     "decimalOdds": 1.6897,
     "line": 3.5,
     "impliedProbability": 0.591837,
     "noVigProbability": 0.542056,
     "ticketPercent": null,
     "moneyPercent": null,
     "sharpGap": null,
     "marketId": "25571713",
     "outcomeId": "2954831908"
    },
    {
     "side": "noside",
     "teamId": null,
     "competitorId": 270507,
     "playerId": 125771,
     "odds": 100,
     "decimalOdds": 2.0,
     "line": -3.5,
     "impliedProbability": 0.5,
     "noVigProbability": 0.457944,
     "ticketPercent": null,
     "moneyPercent": null,
     "sharpGap": null,
     "marketId": "25571713",
     "outcomeId": "2954831905"
    }
   ],
   "holdPercent": 8.4112,
   "overroundPercent": 9.1837
  },
  "total": {
   "sides": [
    {
     "side": "over",
     "teamId": null,
     "competitorId": null,
     "playerId": null,
     "odds": -120,
     "decimalOdds": 1.8333,
     "line": 21.5,
     "impliedProbability": 0.545455,
     "noVigProbability": 0.5,
     "ticketPercent": null,
     "moneyPercent": null,
     "sharpGap": null,
     "marketId": "25562056",
     "outcomeId": "2954831694"
    },
    {
     "side": "under",
     "teamId": null,
     "competitorId": null,
     "playerId": null,
     "odds": -120,
     "decimalOdds": 1.8333,
     "line": 21.5,
     "impliedProbability": 0.545455,
     "noVigProbability": 0.5,
     "ticketPercent": null,
     "moneyPercent": null,
     "sharpGap": null,
     "marketId": "25562056",
     "outcomeId": "2954831696"
    }
   ],
   "holdPercent": 8.3333,
   "overroundPercent": 9.0909
  }
 },
 "bestPrices": {
  "moneyline": [
   {
    "side": "noside",
    "teamId": null,
    "odds": -177,
    "decimalOdds": 1.565,
    "line": 0,
    "bookId": 71,
    "bookName": "BetRivers NJ",
    "competitorId": 270507,
    "playerId": 125771,
    "impliedProbability": 0.638989,
    "marketId": "25550201",
    "outcomeId": "2959943799",
    "bookParentId": 5,
    "deeplinkId": "ML2959943799"
   },
   {
    "side": "noside",
    "teamId": null,
    "odds": 140,
    "decimalOdds": 2.4,
    "line": 0,
    "bookId": 71,
    "bookName": "BetRivers NJ",
    "competitorId": 270508,
    "playerId": 172880,
    "impliedProbability": 0.416667,
    "marketId": "25550201",
    "outcomeId": "2959943798",
    "bookParentId": 5,
    "deeplinkId": "ML2959943798"
   }
  ],
  "spread": [
   {
    "side": "noside",
    "teamId": null,
    "odds": 114,
    "decimalOdds": 2.14,
    "line": 1.5,
    "bookId": 71,
    "bookName": "BetRivers NJ",
    "competitorId": 270508,
    "playerId": 172880,
    "impliedProbability": 0.46729,
    "marketId": "25571713",
    "outcomeId": "2959977691",
    "bookParentId": 5,
    "deeplinkId": "ML2959977691"
   },
   {
    "side": "noside",
    "teamId": null,
    "odds": 100,
    "decimalOdds": 2.0,
    "line": -3.5,
    "bookId": 75,
    "bookName": "BetMGM NJ",
    "competitorId": 270507,
    "playerId": 125771,
    "impliedProbability": 0.5,
    "marketId": "25571713",
    "outcomeId": "2957987842",
    "bookParentId": 1,
    "deeplinkId": "ML2957987842"
   }
  ],
  "total": [
   {
    "side": "under",
    "teamId": null,
    "odds": -108,
    "decimalOdds": 1.9259,
    "line": 21.5,
    "bookId": 71,
    "bookName": "BetRivers NJ",
    "competitorId": null,
    "playerId": null,
    "impliedProbability": 0.519231,
    "marketId": "25562056",
    "outcomeId": "2959943804",
    "bookParentId": 5,
    "deeplinkId": "ML2959943804"
   },
   {
    "side": "over",
    "teamId": null,
    "odds": -120,
    "decimalOdds": 1.8333,
    "line": 21.5,
    "bookId": 75,
    "bookName": "BetMGM NJ",
    "competitorId": null,
    "playerId": null,
    "impliedProbability": 0.545455,
    "marketId": "25562056",
    "outcomeId": "2957987843",
    "bookParentId": 1,
    "deeplinkId": "ML2957987843"
   }
  ]
 },
 "lineMovement": {
  "moneyline": [
   {
    "side": "noside",
    "teamId": null,
    "competitorId": 270507,
    "playerId": 125771,
    "openingLine": 0,
    "currentLine": 0,
    "lineDelta": 0,
    "openingOdds": -200,
    "currentOdds": -173,
    "oddsDelta": 27
   },
   {
    "side": "noside",
    "teamId": null,
    "competitorId": 270508,
    "playerId": 172880,
    "openingLine": 0,
    "currentLine": 0,
    "lineDelta": 0,
    "openingOdds": 160,
    "currentOdds": 131,
    "oddsDelta": -29
   }
  ],
  "spread": [
   {
    "side": "noside",
    "teamId": null,
    "competitorId": 270508,
    "playerId": 172880,
    "openingLine": 3.5,
    "currentLine": 3.5,
    "lineDelta": 0.0,
    "openingOdds": -125,
    "currentOdds": -145,
    "oddsDelta": -20
   },
   {
    "side": "noside",
    "teamId": null,
    "competitorId": 270507,
    "playerId": 125771,
    "openingLine": -3.5,
    "currentLine": -3.5,
    "lineDelta": 0.0,
    "openingOdds": -111,
    "currentOdds": 100,
    "oddsDelta": 211
   }
  ],
  "total": [
   {
    "side": "over",
    "teamId": null,
    "competitorId": null,
    "playerId": null,
    "openingLine": 21.5,
    "currentLine": 21.5,
    "lineDelta": 0.0,
    "openingOdds": -125,
    "currentOdds": -120,
    "oddsDelta": 5
   },
   {
    "side": "under",
    "teamId": null,
    "competitorId": null,
    "playerId": null,
    "openingLine": 21.5,
    "currentLine": 21.5,
    "lineDelta": 0.0,
    "openingOdds": -116,
    "currentOdds": -120,
    "oddsDelta": -4
   }
  ]
 },
 "booksPricing": [
  {
   "bookId": 15,
   "bookName": "Consensus",
   "market": "moneyline",
   "period": "event",
   "side": "noside",
   "teamId": null,
   "competitorId": 270507,
   "playerId": 125771,
   "opposingCompetitorIds": null,
   "odds": -173,
   "decimalOdds": 1.578,
   "line": 0,
   "impliedProbability": 0.6337,
   "isLive": false,
   "lineStatus": "normal",
   "isAlternate": false,
   "ticketPercent": null,
   "moneyPercent": null,
   "sharpGap": null,
   "marketId": "25550201",
   "outcomeId": "2954831561",
   "deeplinkId": null,
   "bookParentId": 18,
   "optionTypeId": null,
   "propTypeId": null,
   "oddsCoefficientScore": null,
   "eventId": 114016,
   "eventType": "competition"
  },
  {
   "bookId": 15,
   "bookName": "Consensus",
   "market": "moneyline",
   "period": "event",
   "side": "noside",
   "teamId": null,
   "competitorId": 270508,
   "playerId": 172880,
   "opposingCompetitorIds": null,
   "odds": 131,
   "decimalOdds": 2.31,
   "line": 0,
   "impliedProbability": 0.4329,
   "isLive": false,
   "lineStatus": "normal",
   "isAlternate": false,
   "ticketPercent": null,
   "moneyPercent": null,
   "sharpGap": null,
   "marketId": "25550201",
   "outcomeId": "2954831563",
   "deeplinkId": null,
   "bookParentId": 18,
   "optionTypeId": null,
   "propTypeId": null,
   "oddsCoefficientScore": null,
   "eventId": 114016,
   "eventType": "competition"
  }
 ],
 "result": null,
 "meta": {
  "title": "WTA Guadalajara, Mexico  - Round Of 32"
 },
 "leagueInfo": {
  "league": {
   "id": 23,
   "sport": "tennis",
   "name": "wta",
   "description": "WTA Tour",
   "logo": "https://via.placeholder.com/200",
   "currentSeason": "2026",
   "currentSeasonType": "reg",
   "preSeasonStart": null,
   "preSeasonEnd": null,
   "regSeasonStart": "2026-01-01T08:00:00.000Z",
   "regSeasonEnd": "2027-01-03T07:59:59.000Z",
   "postSeasonStart": null,
   "postSeasonEnd": null,
   "blacklistDates": [
    "2026-01-28T08:00:00.000Z",
    "2026-03-14T07:00:00.000Z"
   ],
   "calendarInfo": {},
   "currentWeek": -1,
   "updatedAt": "2025-12-30T21:55:01.566Z",
   "isActive": true,
   "conferences": [],
   "divisions": []
  },
  "contentLiveCount": 0
 },
 "expertPicks": [
  {
   "expertId": 3801142,
   "name": "Wags Wins",
   "username": "wagsischasing",
   "profileUrl": "https://www.actionnetwork.com/u/wagsischasing",
   "isVerified": false,
   "followers": 9326,
   "pictureUrl": "https://s3.amazonaws.com/tan-user-assets/profile_images/3801142/1729035051364-83e992408b4d11ef839f7b790295a264.jpg",
   "bio": "Unit size reflects % of bankroll. (1U = 1%) \n\nStrongest sports are Tennis, NHL, and MLB, but there is ALWAYS value on the table.",
   "isExpert": true,
   "isInternalExpert": false,
   "activePicks": 9,
   "winStreak": {
    "type": "cold",
    "value": 3,
    "startDate": "2026-09-11T07:00:00+00:00"
   },
   "record": {
    "window": "last_month",
    "wins": 40,
    "losses": 36,
    "pushes": 0,
    "unitsNet": 1.4955999999999987,
    "roi": 1.45,
    "count": 76
   },
   "picks": [
    {
     "pickId": 555852633,
     "play": "Elvina Kalieva +150 vs Kayla Day",
     "market": "ml_home",
     "period": "competition",
     "line": 150,
     "odds": 150,
     "units": 1,
     "unitsNet": 0,
     "teamId": null,
     "playerId": null,
     "bookId": 3323,
     "bookName": "Bally Bet OH",
     "result": "pending",
     "isVerified": true,
     "createdAt": "2026-09-14T15:42:42.424Z",
     "settledAt": null,
     "updatedAt": "2026-09-14T15:42:42.423Z",
     "status": "published",
     "startsAt": "2026-09-14T18:00:00.000Z",
     "endsAt": "2026-09-15T06:59:59.999Z",
     "recordDate": null,
     "isLive": false,
     "money": 100,
     "moneyNet": 0,
     "unitsType": "unit",
     "actualValue": null,
     "currentProjection": null,
     "customPickName": null,
     "customPickType": null,
     "customPickRules": null,
     "tag": null,
     "image": "https://assets.actionnetwork.com/308320_kalieva.jpeg",
     "playerImage": "https://assets.actionnetwork.com/308320_kalieva.jpeg",
     "marketId": "25550201",
     "outcomeId": "2954831563",
     "gameId": null,
     "competitionId": 114016,
     "competitorId": 270508,
     "leagueId": 23,
     "leagueName": "wta",
     "groupPickId": null,
     "playerPropProjectionId": null,
     "userId": 3801142,
     "gameTitle": null,
     "meta": {
      "leagueName": "wta",
      "isAltMarket": false
     }
    }
   ]
  }
 ],
 "lineMovementHistory": null,
 "props": null
}
```

#### Example league report row

`includeStandings` and `includeInjuries` add one row per league, not one row per team. All 6 top-level fields are shown, trimmed as follows:

- `standings`: 1 of 32
- `standings[].records`: 3 of 44
- `leagueInfo.league.blacklistDates`: 1 of 158
- `leagueInfo.league.calendarInfo.pre`: 1 of 4
- `leagueInfo.league.calendarInfo.reg`: 1 of 18
- `leagueInfo.league.calendarInfo.post`: 1 of 4
- `leagueInfo.league.conferences`: 1 of 2
- `leagueInfo.league.divisions`: 1 of 8

The `records` array is the betting half of the league table: straight-up, against-the-spread, over/under and units, each sliced again by home, road, favourite, underdog, division and conference.

```json
{
 "recordType": "standings",
 "league": "nfl",
 "season": 2026,
 "entryCount": 32,
 "standings": [
  {
   "league": "nfl",
   "teamId": 125,
   "team": {
    "teamId": 125,
    "name": "Buffalo Bills",
    "displayName": "Bills",
    "shortName": null,
    "location": null,
    "abbreviation": "BUF",
    "logo": "https://static.sprtactn.co/teamlogos/nfl/100/buf.png",
    "primaryColor": "00338D",
    "secondaryColor": "C60C30",
    "conference": "AFC",
    "division": "EAST",
    "urlSlug": "buffalo-bills",
    "coreId": null,
    "record": null
   },
   "wins": 1,
   "losses": 0,
   "ties": null,
   "draws": 0,
   "overtimeLosses": null,
   "winPercent": 1,
   "pointsFor": 36,
   "pointsAgainst": 31,
   "pointsRank": null,
   "touchdownDifferential": 0,
   "conference": "AFC",
   "division": "EAST",
   "conferenceRank": 5,
   "divisionRank": 2,
   "streak": 1,
   "season": 2026,
   "seasonType": "reg",
   "poll": null,
   "pollRank": null,
   "homeWins": null,
   "homeLosses": null,
   "awayWins": null,
   "awayLosses": null,
   "lastTenWins": null,
   "lastTenLosses": null,
   "gamesBack": null,
   "wildCardGamesBack": null,
   "eliminationNumber": null,
   "conferenceGamesBehind": null,
   "divisionGamesBehind": null,
   "leagueGamesBehind": null,
   "pointDifferential": null,
   "points": null,
   "gamesPlayed": null,
   "goalsFor": null,
   "goalsAgainst": null,
   "goalDifferential": null,
   "records": [
    {
     "category": "conference",
     "recordType": "conference",
     "wins": 1,
     "losses": 0,
     "overs": null,
     "unders": null,
     "ties": 0,
     "draws": null,
     "winPercent": 1,
     "pointsFor": 36,
     "pointsAgainst": 31
    },
    {
     "category": "road",
     "recordType": "road",
     "wins": 1,
     "losses": 0,
     "overs": null,
     "unders": null,
     "ties": 0,
     "draws": null,
     "winPercent": 1,
     "pointsFor": 36,
     "pointsAgainst": 31
    },
    {
     "category": "afc",
     "recordType": "afc",
     "wins": 1,
     "losses": 0,
     "overs": null,
     "unders": null,
     "ties": 0,
     "draws": null,
     "winPercent": 1,
     "pointsFor": 36,
     "pointsAgainst": 31
    }
   ]
  }
 ],
 "leagueInfo": {
  "league": {
   "id": 1,
   "sport": "football",
   "name": "nfl",
   "description": "National Football League",
   "logo": "https://static.sprtactn.co/leagues/500/nfl.png",
   "currentSeason": "2026",
   "currentSeasonType": "reg",
   "preSeasonStart": "2026-07-30T07:00:00.000Z",
   "preSeasonEnd": "2026-09-02T06:59:59.000Z",
   "regSeasonStart": "2026-08-30T07:00:00.000Z",
   "regSeasonEnd": "2027-01-18T07:59:59.000Z",
   "postSeasonStart": "2027-01-12T08:00:00.000Z",
   "postSeasonEnd": "2027-03-11T07:59:59.000Z",
   "blacklistDates": [
    "2025-05-27T07:00:00.000Z"
   ],
   "calendarInfo": {
    "pre": [
     {
      "abbr": "HoF",
      "week": 0,
      "label": "Hall of Fame Weekend",
      "endDate": "2026-08-07T21:59Z",
      "startDate": "2026-07-27T01:00Z"
     }
    ],
    "reg": [
     {
      "abbr": "Week 1",
      "week": 1,
      "label": "Week 1",
      "endDate": "2026-09-15T04:59Z",
      "startDate": "2026-08-29T02:00Z"
     }
    ],
    "post": [
     {
      "abbr": "Wild Card",
      "week": 1,
      "label": "Wild Card",
      "endDate": "2027-01-19T04:59Z",
      "startDate": "2027-01-11T05:00Z"
     }
    ]
   },
   "currentWeek": 1,
   "updatedAt": "2026-08-30T16:25:20.339Z",
   "isActive": true,
   "conferences": [
    {
     "id": "AFC",
     "display": "AFC"
    }
   ],
   "divisions": [
    {
     "id": "EAST",
     "display": "East",
     "conferenceId": "AFC"
    }
   ]
  }
 }
}
```

An injury report row has the same envelope with `recordType: "injuries"` and an `injuries` array, trimmed here to 1 of 13 entries:

```json
{
 "recordType": "injuries",
 "league": "nfl",
 "season": null,
 "entryCount": 13,
 "injuries": [
  {
   "league": "nfl",
   "playerName": "Gary Jennings",
   "firstName": "Gary",
   "lastName": "Jennings",
   "position": "WR",
   "team": {
    "name": "Los Angeles Chargers",
    "displayName": "Chargers",
    "logo": "https://static.sprtactn.co/teamlogos/nfl/100/sd.png"
   },
   "status": "out",
   "designation": "IR",
   "comment": "Gary Jennings (Concussion) is out this week.",
   "isStarter": true,
   "isKeyPlayer": true,
   "startedAt": "2022-08-18T17:53:48.651Z",
   "updatedAt": "2022-08-18T17:54:07.497Z"
  }
 ],
 "leagueInfo": null
}
```

### How to Scrape Action Network Odds and Betting Splits

1. Open [**Action Network Odds**](https://apify.com/zen-studio/action-network-odds) on Apify and click **Try for free**.
2. Pick your leagues. NFL is prefilled, and you can add up to all 18.
3. Set a **date** for date-scheduled leagues, or a **week** and **season** for NFL and NCAA Football. Those two cannot be combined with a date in the same run, so cover them in a separate run.
4. Turn on **Player and game props** or **Full line movement history** only if you need them. Both are off by default and both are billed per game.
5. Click **Start** and watch the run. A typical single-league slate finishes in well under a minute.
6. Download the dataset as JSON, CSV, Excel or HTML, or wire it into your own code with the [Apify API](https://docs.apify.com/api/v2).

#### Full option example

Everything is optional. With no input at all you get the current NFL slate.

```json
{
 "leagues": [
  "nfl"
 ],
 "week": 1,
 "season": 2026,
 "seasonType": "reg",
 "gameStatus": [
  "complete"
 ],
 "includeExpertPicks": true,
 "includeLineMovement": true,
 "includeProps": true,
 "maxGames": 12
}
```

#### Choosing games

| Field | Notes |
|---|---|
| `leagues` | Which leagues to cover. Out-of-season leagues simply return nothing. Soccer (all leagues) already covers the Premier League, La Liga, Bundesliga, Serie A, Ligue 1 and MLS, so a fixture reached both ways is still collected and charged once. |
| `date` | `YYYY-MM-DD`. **Leave it empty for NFL and NCAA Football**, which are scheduled by week. Setting a date alongside either of them stops the run rather than quietly giving you the wrong week. |
| `week`, `season`, `seasonType` | NFL and NCAA Football. `season` also selects the year for standings. |
| `gameIds`, `gameUrls` | Cover specific games. Overrides the league and date selection. |

#### Narrowing the slate

`gameStatus` (upcoming, live, finished), `teams` (names or abbreviations), `onlyTrending`, `minBets`, `periods` (full game, halves, quarters), `books`, `maxGames`.

Filters are applied **before** any per-game work is done, so anything filtered out is never charged for. Every field is documented in the **Input** tab, which is the fastest place to read the options.

### Integrations, Scheduling and Monitoring

Betting splits are a time series. One run tells you where the public is now; a schedule tells you where it moved.

- **Apify Scheduler.** For a pregame slate, hourly on game day is the useful cadence, with one extra run about 30 minutes before kickoff to capture the closing line. Daily is enough if you only want closing numbers and results.
- **Google Sheets** for a shareable splits board that updates itself.
- **Make and Zapier** for alerts, for example a message whenever `sharpGap` crosses a threshold you care about.
- **Webhooks** to post each finished run straight into your own service.
- **Dataset API** for direct pulls into a notebook or a database.

New to running and scheduling Actors? These are the official Apify walkthroughs:

https://www.youtube.com/watch?v=1OW8gOqlZbY

https://www.youtube.com/watch?v=1jI7WcVQmwM

### How Much Does It Cost to Scrape Action Network?

Charged per game, not per price. One game quoted by every sportsbook you asked for across three markets is still one charge.

| Event | Price |
|---|---|
| **Game** | **$3.99 per 1,000 games** |
| Full line movement history | $3.99 per 1,000 games |
| Player and game props | $4.99 per 1,000 games |
| Standings or injury report | $7.99 per 1,000 league reports |
| Actor start | $4.99 per 1,000 runs |

Expert picks are included in the game price. Lower rates apply automatically on higher Apify plans, down to $2.79 per 1,000 games.

Opt-in blocks are off by default, so you only pay for what you turn on, and games removed by a filter cost nothing.

A single league's daily slate is under a dime for most leagues, and about thirty cents for a full college football Saturday. Apify's free plan credit covers over a thousand games before you pay anything.

### FAQ

**Does Action Network have an API?**
Not a public one. There is a paid PRO subscription for the site itself, but no documented endpoint, no keys and no published field list. This Actor gives you a stable JSON schema, scheduling, retries and exports instead.

**What does "sharp money" mean in betting?**
It describes stake concentrated in relatively few bets. In the output that shows up as `moneyPercent` sitting well above `ticketPercent` on the same side, which is exactly what `sharpGap` measures.

**What does line movement mean in betting?**
The price on a side changing between the opening number and now. `lineMovement` carries both numbers plus the delta for every market, and the opt-in `lineMovementHistory` carries every timestamped step between them.

**Is reverse line movement good or bad?**
Neither on its own. It is a signal: the line moving against the side holding most of the tickets. You can detect it with two fields, `sharpGap` and `lineMovement`.

**Is it profitable to bet against the public?**
That is a modelling question, not a data question. What this Actor does is give you the public percentages and the closing numbers you need to test it yourself, with history back to around 2024 for odds and splits.

**Is there a free API for sports betting odds?**
Free odds feeds exist but are usually thin: a handful of books, no betting splits and tight rate limits. Public betting percentages in particular are rarely free anywhere.

**How far back does the history go?**
Scores and box scores reach 2015. Odds and betting splits begin around 2024, so a 2019 game returns the result but no closing line.

**Why are some leagues empty?**
They are out of season. An empty league is a normal answer, not an error, and it costs nothing.

**Can I get first-half or quarter lines?**
Yes, through `periods`. Not every game prices every segment, so an empty result there is also a real answer.

**What are book IDs 15 and 30?**
Not sportsbooks. 15 is the consensus line that carries the betting splits, and 30 is the opening line. Both are always included, so splits and movement never go missing even if you filter to a single book.

**Can I export this to Google Sheets or my own database?**
Yes. Every run writes a dataset you can download as JSON, CSV, Excel or HTML, push through an integration, or read from the Apify API.

**Something looks wrong. What do I do?**
Open the **Issues** tab on this Actor with the run ID and the input you used. If you need a different shape of this data, a different source or a custom pipeline, say so there and it can be built.

### Is It Legal to Scrape Action Network?

This is an unofficial tool that collects publicly accessible information. It is not affiliated with, endorsed by, or connected to The Action Network, Inc.

Scraping public data is generally lawful in the US and the EU. How you use it is your responsibility.

The output is odds, teams, aggregate betting percentages, published injury reports, player names on prop markets, and public expert profiles. All of it is already published by the source and none of it is private. If you combine it with anything that is, GDPR and similar rules apply to you as the controller.

Odds and betting data are provided for informational and analytical purposes only and are not betting advice. You are responsible for complying with the laws and terms that apply to you, including the gambling regulations in your jurisdiction.

### More Zen Studio scrapers for sports betting

**🏟️ Sportsbook odds**

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-oLjv3CSV3BhHm5dGN-62o7r64lQq-fanduel-odds-api-logo.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **FanDuel**
  - [FanDuel Odds API](https://apify.com/zen-studio/fanduel-odds)
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-W8rOXiLSj8wrgF96k-PQehXxTEV5-draftkings-real-time-api-logo.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **DraftKings**
  - [DraftKings Odds API](https://apify.com/zen-studio/draftkings-odds)
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-TjShOnNguT17e9hfQ-ntCswWAqze-betmgm-real-time-api-logo-padded.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **BetMGM**
  - [BetMGM Odds API](https://apify.com/zen-studio/betmgm-odds)
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-l6JP3yaLczAdUaiSf-yDHq17ycGp-bet365-icon_lc6m4t.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **Bet365**
  - [Bet365 Real-Time Odds API](https://apify.com/zen-studio/bet365-real-time-odds)
  - [Bet365 Live Scores API](https://apify.com/zen-studio/bet365-live-scores)
  - [Bet365 Sports Data Scraper](https://apify.com/zen-studio/bet365-sports-data)

**🎯 Daily fantasy & player props**

- <img src="https://api.apify.com/v2/key-value-stores/pJ7iaZsTFhR3k9tjV/records/player-props-aggregator-icon.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **Player Props Aggregator**
  - [Player Props Line Shopping](https://apify.com/zen-studio/player-props-aggregator)
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-4AmgQeem8dEgMEiRF-VGffbe665M-prizepicks-scraper-logo.jpeg" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **PrizePicks**
  - [PrizePicks Player Props Scraper](https://apify.com/zen-studio/prizepicks-player-props)
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-09TtSjF9Uzs5qfvLc-f9HhMKXsLt-underdog-fantasy-picks-api-logo.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **Underdog Fantasy**
  - [Underdog Fantasy Player Props API](https://apify.com/zen-studio/underdog-player-props)
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-vZGwNIMCrwkjp76uR-6jWYFxsPSD-sleeper-fantasy-api-logo.jpg" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **Sleeper**
  - [Sleeper Player Props](https://apify.com/zen-studio/sleeper-player-props)
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-otCGHYjTnE0YKgVNJ-iYqrcfxJiq-draftkings-pick6-api-logo.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **DraftKings Pick6**
  - [DraftKings Pick6 Player Props](https://apify.com/zen-studio/draftkings-pick6-player-props)
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-l6JP3yaLczAdUaiSf-yDHq17ycGp-bet365-icon_lc6m4t.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **Bet365**
  - [Bet365 Player Props API](https://apify.com/zen-studio/bet365-player-props)

**🎾 Live scores & match data**

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-aSaCGC6CeIt8UFbft-ecvNy7YBDA-tennis-abstract-icon.png" width="16" height="16" alt="Tennis Abstract scraper icon" style="vertical-align:middle;border-radius:3px"> **Tennis Abstract**
  - [Tennis Abstract Scraper](https://apify.com/zen-studio/tennis-abstract-scraper)
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-V6kpzFq0uj3tyobvM-VF7ryKjCXg-flashscore-tennis-api-logo.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **Flashscore**
  - [Flashscore Tennis Scraper & API](https://apify.com/zen-studio/flashscore-tennis-api)

***

*Action Network scraper and API for betting splits, public betting percentages, sportsbook odds, line movement and expert picks across 18 leagues, as structured JSON.*

# Actor input Schema

## `leagues` (type: `array`):

Which leagues to cover. Out-of-season leagues simply return nothing. ATP, WTA, UFC and Boxing return one row per match or fight, with the two competitors instead of teams. Soccer (all leagues) already covers the Premier League, La Liga, Bundesliga, Serie A, Ligue 1 and MLS, so a fixture reached both ways is collected and charged once.

## `date` (type: `string`):

Day to cover, as YYYY-MM-DD. Leave empty for the current slate. <b>Leave it empty for NFL and NCAA Football</b>, which are scheduled by week: setting a date alongside either of them stops the run rather than quietly returning the wrong week.

## `week` (type: `integer`):

Week number. Only these two leagues are scheduled by week; everything else uses the date above.

## `season` (type: `integer`):

Season year, for example 2026. Scores reach back to 2015; odds and betting splits begin around 2024.

## `seasonType` (type: `string`):

Regular season, postseason or preseason.

## `gameIds` (type: `array`):

Cover only these games. Overrides the league and date selection above.

## `gameUrls` (type: `array`):

Paste game page links instead of IDs. Overrides the league and date selection above.

## `gameStatus` (type: `array`):

Keep only games in these states. Leave empty for all.

## `teams` (type: `array`):

Keep only games involving these teams. Names or abbreviations both work.

## `onlyTrending` (type: `boolean`):

Keep only games flagged as drawing unusual attention.

## `minBets` (type: `integer`):

Skip games with less action than this. Useful for ignoring thin markets.

## `books` (type: `array`):

Limit pricing to these sportsbook IDs. Leave empty for the majors (DraftKings 68, FanDuel 69, BetMGM 75, bet365 79, BetRivers 71, Caesars 123). The consensus and opening lines are always included, so betting splits and line movement never go missing.

## `periods` (type: `array`):

Full game, halves or quarters. Leave empty for the full game.

## `includeExpertPicks` (type: `boolean`):

Attach expert selections with their verified win/loss records, units and ROI. Included at no extra charge.

## `includeLineMovement` (type: `boolean`):

Every timestamped price change per sportsbook, back to the opening line. Opening and current prices are always included without this.

## `includeProps` (type: `boolean`):

The full prop board per game. Adds a lot of data, so expect longer runs.

## `includeStandings` (type: `boolean`):

League table for each selected league.

## `includeInjuries` (type: `boolean`):

Current injury report for each selected league.

## `maxGames` (type: `integer`):

Stop after this many games. Leave empty for no limit.

## Actor input object example

```json
{
  "leagues": [
    "nfl"
  ],
  "seasonType": "reg",
  "onlyTrending": false,
  "includeExpertPicks": true,
  "includeLineMovement": false,
  "includeProps": false,
  "includeStandings": false,
  "includeInjuries": false
}
```

# Actor output Schema

## `games` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "leagues": [
        "nfl"
    ],
    "seasonType": "reg"
};

// Run the Actor and wait for it to finish
const run = await client.actor("zen-studio/action-network-odds").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "leagues": ["nfl"],
    "seasonType": "reg",
}

# Run the Actor and wait for it to finish
run = client.actor("zen-studio/action-network-odds").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "leagues": [
    "nfl"
  ],
  "seasonType": "reg"
}' |
apify call zen-studio/action-network-odds --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,zen-studio/action-network-odds"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Pjlm871yhJCOjQh6I/builds/cbjU7C3Qs4CUEYO8s/openapi.json
