{
  "openapi": "3.0.1",
  "info": {
    "title": "Sports Betting Odds Scraper & Line Move Monitor - NFL, MLB, NBA",
    "description": "Turn monitoring on and every later run returns only the prices that have actually moved, so you are never charged for the same line twice. Every ESPN bookmaker line as JSON: spread, total and moneyline, plus the opening line and how far it has moved since. NFL, MLB, NBA and NHL.",
    "version": "0.1",
    "x-build-id": "I1J757dNkn0mlga77"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/neverempty~sports-betting-odds-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-neverempty-sports-betting-odds-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/neverempty~sports-betting-odds-scraper/runs": {
      "post": {
        "operationId": "runs-sync-neverempty-sports-betting-odds-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/neverempty~sports-betting-odds-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-neverempty-sports-betting-odds-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "leagues": {
            "title": "Leagues",
            "type": "array",
            "description": "Which leagues to read. Odds appear closer to the game: on 2026-09-06, all 4 NFL games checked carried a line and all 4 MLB games did, while NBA (next game 2026-10-03) and NHL (2026-09-19) carried none at all - which is 'not posted yet', not 'no odds exist'.",
            "items": {
              "type": "string",
              "enum": [
                "nfl",
                "nba",
                "mlb",
                "nhl"
              ],
              "enumTitles": [
                "NFL",
                "NBA",
                "MLB",
                "NHL"
              ]
            },
            "default": [
              "nfl",
              "mlb"
            ]
          },
          "date": {
            "title": "Day (YYYY-MM-DD)",
            "type": "string",
            "description": "Which day's board to read. Empty = ESPN's current board for each league."
          },
          "maxGames": {
            "title": "Maximum games to check per league",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "Each game costs one extra request for its odds, so this caps how much of the board is read. Reading is free; only returned prices are charged.",
            "default": 40
          },
          "maxPrices": {
            "title": "Maximum prices to return",
            "minimum": 1,
            "maximum": 2000,
            "type": "integer",
            "description": "How many rows to return. One row is one game at one bookmaker. You are charged for the rows you actually receive.",
            "default": 200
          },
          "monitoringMode": {
            "title": "Monitoring mode: return only prices that moved",
            "type": "boolean",
            "description": "Off = return every price for the games you picked. On = remember the exact numbers already returned and, on later runs, return a price again only when it has actually changed. Run it on a schedule to follow line movement and pay only for the moves.",
            "default": false
          },
          "resetMonitoringState": {
            "title": "Forget what was already returned",
            "type": "boolean",
            "description": "Clear the remembered prices before this run, so everything counts as new again.",
            "default": false
          },
          "providers": {
            "title": "Only these bookmakers",
            "type": "array",
            "description": "Keep a price only if the bookmaker name contains one of these (case-insensitive, partial). ESPN's own feed carried DraftKings on every priced game checked on 2026-09-06.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "teams": {
            "title": "Only these teams",
            "type": "array",
            "description": "Keep a game only if either side's name or abbreviation contains one of these (case-insensitive, partial). Example: Seahawks, SEA.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "gameStates": {
            "title": "Only these game states",
            "type": "array",
            "description": "ESPN's own state for the game: pre (not started), in (in progress), post (finished). Empty = all. Note that finished games still carry the closing line.",
            "items": {
              "type": "string",
              "enum": [
                "pre",
                "in",
                "post"
              ],
              "enumTitles": [
                "Not started",
                "In progress",
                "Finished"
              ]
            },
            "default": []
          },
          "onlyMoved": {
            "title": "Only lines that have moved",
            "type": "boolean",
            "description": "Keep a price only if at least one of spread, total or moneyline differs from where it opened. Prices whose opening line is not published are kept, because unknown is not the same as unmoved.",
            "default": false
          },
          "minSpreadMove": {
            "title": "Minimum spread move (points)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Keep a price only if the spread has moved at least this far from its open, in points, in either direction. 0 = no limit. Prices with no opening spread are kept.",
            "default": 0
          },
          "onlyFavoriteFlips": {
            "title": "Only games where the favourite flipped",
            "type": "boolean",
            "description": "Keep only games where the side favoured now is not the side favoured when the line opened.",
            "default": false
          },
          "requireMoneyLine": {
            "title": "Only prices that carry a moneyline",
            "type": "boolean",
            "description": "Drop rows where neither side has a moneyline price.",
            "default": false
          },
          "keywords": {
            "title": "Keywords",
            "type": "array",
            "description": "Keep a price only if one (Any) or all (All) of these appear in the game name, either team, the bookmaker or the line summary.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "keywordMatch": {
            "title": "Keyword match",
            "enum": [
              "any",
              "all"
            ],
            "type": "string",
            "description": "Any = at least one keyword. All = every keyword.",
            "default": "any"
          },
          "excludeKeywords": {
            "title": "Exclude keywords",
            "type": "array",
            "description": "Drop a price if any of these appear in the same fields.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "useProxy": {
            "title": "Use an Apify proxy",
            "type": "boolean",
            "description": "Off by default: ESPN's public feeds answered 200 from a plain Apify datacentre address when this Actor was built (2026-09-06). If they start answering 403, 429 or 503, the Actor switches to a proxy session on its own and tries again.",
            "default": false
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}