# Watch odds for price changes

**Use case:** 

Run this on a schedule and receive only prices whose numbers have actually changed since the last run. A board re-read every ten minutes is mostly identical to the previous read, and paying for the identical part is the whole problem this solves.

## Input

```json
{
  "leagues": [
    "nfl",
    "mlb"
  ],
  "date": "",
  "maxGames": 24,
  "maxPrices": 80,
  "monitoringMode": true,
  "resetMonitoringState": true,
  "providers": [],
  "teams": [],
  "gameStates": [],
  "onlyMoved": false,
  "minSpreadMove": 0,
  "onlyFavoriteFlips": false,
  "requireMoneyLine": false,
  "keywords": [],
  "keywordMatch": "any",
  "excludeKeywords": [],
  "useProxy": false
}
```

## Output

```json
{
  "league": {
    "label": "League",
    "format": "string"
  },
  "gameDate": {
    "label": "Game Date",
    "format": "string"
  },
  "homeTeam": {
    "label": "Home Team",
    "format": "string"
  },
  "awayTeam": {
    "label": "Away Team",
    "format": "string"
  },
  "provider": {
    "label": "Provider",
    "format": "string"
  },
  "spread": {
    "label": "Spread",
    "format": "string"
  },
  "overUnder": {
    "label": "Over Under",
    "format": "string"
  },
  "homeMoneyLine": {
    "label": "Home Money Line",
    "format": "string"
  },
  "awayMoneyLine": {
    "label": "Away Money Line",
    "format": "string"
  },
  "source": {
    "label": "Source",
    "format": "string"
  },
  "status": {
    "label": "Status",
    "format": "string"
  },
  "gameId": {
    "label": "Game Id",
    "format": "string"
  },
  "leagueName": {
    "label": "League Name",
    "format": "string"
  },
  "sport": {
    "label": "Sport",
    "format": "string"
  },
  "gameName": {
    "label": "Game Name",
    "format": "string"
  },
  "gameShortName": {
    "label": "Game Short Name",
    "format": "string"
  },
  "gameStatus": {
    "label": "Game Status",
    "format": "string"
  },
  "gameState": {
    "label": "Game State",
    "format": "string"
  },
  "isCompleted": {
    "label": "Is Completed",
    "format": "string"
  },
  "venue": {
    "label": "Venue",
    "format": "string"
  },
  "venueCity": {
    "label": "Venue City",
    "format": "string"
  },
  "homeTeamId": {
    "label": "Home Team Id",
    "format": "string"
  },
  "homeTeamAbbreviation": {
    "label": "Home Team Abbreviation",
    "format": "string"
  },
  "awayTeamId": {
    "label": "Away Team Id",
    "format": "string"
  },
  "awayTeamAbbreviation": {
    "label": "Away Team Abbreviation",
    "format": "string"
  },
  "providerId": {
    "label": "Provider Id",
    "format": "string"
  },
  "details": {
    "label": "Details",
    "format": "string"
  },
  "homeSpreadOdds": {
    "label": "Home Spread Odds",
    "format": "string"
  },
  "awaySpreadOdds": {
    "label": "Away Spread Odds",
    "format": "string"
  },
  "overOdds": {
    "label": "Over Odds",
    "format": "string"
  },
  "underOdds": {
    "label": "Under Odds",
    "format": "string"
  },
  "openSpread": {
    "label": "Open Spread",
    "format": "string"
  },
  "openOverUnder": {
    "label": "Open Over Under",
    "format": "string"
  },
  "openHomeMoneyLineDecimal": {
    "label": "Open Home Money Line Decimal",
    "format": "string"
  },
  "openAwayMoneyLineDecimal": {
    "label": "Open Away Money Line Decimal",
    "format": "string"
  },
  "currentHomeMoneyLineDecimal": {
    "label": "Current Home Money Line Decimal",
    "format": "string"
  },
  "currentAwayMoneyLineDecimal": {
    "label": "Current Away Money Line Decimal",
    "format": "string"
  },
  "spreadMove": {
    "label": "Spread Move",
    "format": "string"
  },
  "totalMove": {
    "label": "Total Move",
    "format": "string"
  },
  "homeMoneyLineMove": {
    "label": "Home Money Line Move",
    "format": "string"
  },
  "awayMoneyLineMove": {
    "label": "Away Money Line Move",
    "format": "string"
  },
  "homeIsFavorite": {
    "label": "Home Is Favorite",
    "format": "string"
  },
  "homeWasFavoriteAtOpen": {
    "label": "Home Was Favorite At Open",
    "format": "string"
  },
  "favoriteFlipped": {
    "label": "Favorite Flipped",
    "format": "string"
  },
  "scrapedAt": {
    "label": "Scraped At",
    "format": "string"
  },
  "oddsKey": {
    "label": "Odds Key",
    "format": "string"
  },
  "searchUrl": {
    "label": "Search Url",
    "format": "string"
  },
  "note": {
    "label": "Note",
    "format": "string"
  },
  "pricesRead": {
    "label": "Prices Read",
    "format": "string"
  }
}
```

## About this Actor

This example demonstrates how to use [Sports Betting Odds Scraper & Line Move Monitor - NFL, MLB, NBA](https://apify.com/neverempty/sports-betting-odds-scraper.md) with a specific input configuration. Visit the [Actor detail page](https://apify.com/neverempty/sports-betting-odds-scraper.md) to learn more, explore other use cases, and run it yourself.


## How to integrate an Actor?

This Task's input is already configured above. Use it as-is rather than inventing a new one.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For full API examples (JavaScript, Python, CLI, MCP, OpenAPI), see this Task's Actor page: https://apify.com/neverempty/sports-betting-odds-scraper.md

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).
