{
  "openapi": "3.0.1",
  "info": {
    "title": "Sportsbook Review Scraper - NFL, NBA & MLB Odds, Betting Lines",
    "description": "Scrape NFL, NBA, MLB, NHL and college odds from SportsbookReview. Point spreads, moneylines and totals from 5 sportsbooks, with opening lines, line movement, betting splits and history back to 2008.",
    "version": "0.1",
    "x-build-id": "spdG8q06CoDHWLCr3"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/parseforge~sportsbook-review-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-parseforge-sportsbook-review-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/parseforge~sportsbook-review-scraper/runs": {
      "post": {
        "operationId": "runs-sync-parseforge-sportsbook-review-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/parseforge~sportsbook-review-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-parseforge-sportsbook-review-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": "Leagues to pull odds for. Every league returns the same fields.",
            "items": {
              "type": "string",
              "enum": [
                "nfl-football",
                "college-football",
                "nba-basketball",
                "ncaa-basketball",
                "mlb-baseball",
                "nhl-hockey",
                "wnba-basketball",
                "cfl-football",
                "english-premier-league",
                "champions-league",
                "major-league-soccer"
              ],
              "enumTitles": [
                "NFL",
                "NCAA Football",
                "NBA",
                "NCAA Basketball",
                "MLB",
                "NHL",
                "WNBA",
                "CFL",
                "English Premier League",
                "UEFA Champions League",
                "MLS"
              ]
            },
            "default": [
              "nfl-football"
            ]
          },
          "startUrls": {
            "title": "Start URLs (optional)",
            "type": "array",
            "description": "Paste SportsbookReview odds or futures URLs to scrape exactly those pages. When set, the league, date and week fields below are ignored.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "dateFrom": {
            "title": "Date from",
            "type": "string",
            "description": "First slate day, as YYYY-MM-DD. SportsbookReview keeps closed lines back to 2008, so historical dates work for every league except NFL and NCAA Football, which are selected by week instead. Leave both dates empty for today's board."
          },
          "dateTo": {
            "title": "Date to",
            "type": "string",
            "description": "Last slate day, as YYYY-MM-DD. Defaults to the same day as Date from. Capped at 400 days per run."
          },
          "dates": {
            "title": "Specific dates",
            "type": "array",
            "description": "Exact days to scrape, as YYYY-MM-DD. Takes priority over the date range.",
            "items": {
              "type": "string"
            }
          },
          "weeks": {
            "title": "Football weeks",
            "type": "array",
            "description": "NFL and NCAA Football weeks, written the way SportsbookReview writes them: Week1 … Week18, PreSeasonWeek1 … PreSeasonWeek3. Football is the only schedule SportsbookReview serves by week, and only for the current season — dates do not work there. Ignored for every other league.",
            "items": {
              "type": "string"
            }
          },
          "oddsMarket": {
            "title": "Primary market",
            "enum": [
              "pointspread",
              "money-line",
              "totals"
            ],
            "type": "string",
            "description": "The market the base row carries. Point spread also fills in the run line (MLB) and puck line (NHL); for soccer it returns the real three-way home / draw / away board, because SportsbookReview has no handicap board for soccer. Moneyline is the two-way price with the draw removed.",
            "default": "pointspread"
          },
          "oddsScope": {
            "title": "Game scope",
            "enum": [
              "full-game",
              "1st-half",
              "2nd-half",
              "1st-quarter",
              "2nd-quarter",
              "3rd-quarter",
              "4th-quarter",
              "1st-period",
              "2nd-period",
              "3rd-period"
            ],
            "type": "string",
            "description": "Which part of the game the base row prices. Full game is what most boards quote; halves, quarters and periods depend on the league and are not always posted.",
            "default": "full-game"
          },
          "includeMoneyline": {
            "title": "Add moneyline odds",
            "type": "boolean",
            "description": "Fetches the moneyline board and merges every book's price, draw price, hold and no-vig probability into the same row. One extra page request per slate. Off by default, and never charged when Moneyline is already your primary market.",
            "default": false
          },
          "includeTotals": {
            "title": "Add totals odds",
            "type": "boolean",
            "description": "Fetches the over/under board and merges every book's total, prices, best number and hold into the same row. One extra page request per slate. Off by default, and never charged when Totals is already your primary market.",
            "default": false
          },
          "includePeriodOdds": {
            "title": "Add half / quarter / period odds",
            "type": "boolean",
            "description": "Fetches the scopes listed below and appends them as a periodOdds array on each game. One extra page request per scope per slate.",
            "default": false
          },
          "periodScopes": {
            "title": "Which periods",
            "type": "array",
            "description": "Scopes to fetch when the box above is ticked. Not every league posts every scope; a scope with no lines is skipped and not charged.",
            "items": {
              "type": "string",
              "enum": [
                "1st-half",
                "2nd-half",
                "1st-quarter",
                "2nd-quarter",
                "3rd-quarter",
                "4th-quarter",
                "1st-period",
                "2nd-period",
                "3rd-period"
              ],
              "enumTitles": [
                "1st half",
                "2nd half",
                "1st quarter",
                "2nd quarter",
                "3rd quarter",
                "4th quarter",
                "1st period",
                "2nd period",
                "3rd period"
              ]
            },
            "default": [
              "1st-half",
              "2nd-half"
            ]
          },
          "includeLineHistory": {
            "title": "Add timestamped line movement",
            "type": "boolean",
            "description": "Every price change SportsbookReview recorded for each book, with a timestamp: spread, total and moneyline series, plus the high, low and swing of each. One extra page request per slate. Not available for the three soccer leagues, where the page does not exist.",
            "default": false
          },
          "includeMatchupStats": {
            "title": "Add team matchup stats",
            "type": "boolean",
            "description": "Season form for both teams from the matchup page: win-loss and over/under records, ATS record where the sport tracks one, moneyline units, and the sport's own box-score averages. One extra request per game, so this is the most expensive box on the list. Soccer matchups carry no stats block and are never charged.",
            "default": false
          },
          "includeFutures": {
            "title": "Add futures markets",
            "type": "boolean",
            "description": "Scrapes the league's futures board too — title, conference and division winners — and writes one row per selection with every book's price. One extra page request per league.",
            "default": false
          },
          "sportsbooks": {
            "title": "Only these sportsbooks",
            "type": "array",
            "description": "Keep only these books in every odds array. Leave empty for all five.",
            "items": {
              "type": "string",
              "enum": [
                "betmgm",
                "fanduel",
                "draftkings",
                "bet365",
                "fanatics"
              ],
              "enumTitles": [
                "BetMGM",
                "FanDuel",
                "DraftKings",
                "bet365",
                "Fanatics Sportsbook"
              ]
            },
            "default": []
          },
          "teamQuery": {
            "title": "Team contains",
            "type": "array",
            "description": "Keep only games where either side matches one of these, by city, nickname, full name or abbreviation. Case-insensitive.",
            "items": {
              "type": "string"
            }
          },
          "gameStatus": {
            "title": "Game status",
            "enum": [
              "any",
              "scheduled",
              "in-progress",
              "final",
              "postponed"
            ],
            "type": "string",
            "description": "Keep only games in this state. Final games carry scores and graded ATS / over-under results.",
            "default": "any"
          },
          "onlyGamesWithOdds": {
            "title": "Skip games with no posted line",
            "type": "boolean",
            "description": "Drops games no book has priced yet. Leave on unless you want the bare schedule too.",
            "default": true
          },
          "minBooks": {
            "title": "Minimum sportsbooks",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Keep only games priced by at least this many books. Useful when you compare prices and need a real market."
          },
          "minSpread": {
            "title": "Min home spread",
            "type": "number",
            "description": "Keep only games whose consensus home spread is at or above this. Home favourites are negative, so -7 keeps everything from a 7-point home favourite up to any home underdog."
          },
          "maxSpread": {
            "title": "Max home spread",
            "type": "number",
            "description": "Keep only games whose consensus home spread is at or below this."
          },
          "minTotal": {
            "title": "Min total",
            "type": "number",
            "description": "Keep only games whose consensus over/under is at or above this."
          },
          "maxTotal": {
            "title": "Max total",
            "type": "number",
            "description": "Keep only games whose consensus over/under is at or below this."
          },
          "minPriceHome": {
            "title": "Min home price",
            "type": "integer",
            "description": "Keep only games whose consensus home price is at or above this, in American odds. Use 100 to keep home underdogs only."
          },
          "maxPriceHome": {
            "title": "Max home price",
            "type": "integer",
            "description": "Keep only games whose consensus home price is at or below this, in American odds. Use -150 to keep heavy home favourites only."
          },
          "minPublicBetPercent": {
            "title": "Min public bet %",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Keep only games where one side holds at least this share of public tickets. Set to 70 to find the games the crowd is piled onto."
          },
          "maxPublicBetPercent": {
            "title": "Max public bet %",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Keep only games where no side exceeds this share of public tickets, in other words the evenly split board."
          },
          "minSpreadMovement": {
            "title": "Min spread move",
            "type": "number",
            "description": "Keep only games whose consensus spread moved at least this many points from the opener, in either direction."
          },
          "minTotalMovement": {
            "title": "Min total move",
            "type": "number",
            "description": "Keep only games whose consensus total moved at least this much from the opener, in either direction."
          },
          "maxHoldPercent": {
            "title": "Max hold %",
            "type": "number",
            "description": "Keep only games whose median book margin is at or below this. A tighter market usually means a sharper number."
          },
          "startTimeFrom": {
            "title": "Kickoff after",
            "type": "string",
            "description": "ISO timestamp, for example 2026-09-13T17:00:00Z. Keeps only games starting at or after it."
          },
          "startTimeTo": {
            "title": "Kickoff before",
            "type": "string",
            "description": "ISO timestamp. Keeps only games starting at or before it."
          },
          "venueState": {
            "title": "Venue state",
            "type": "array",
            "description": "Two-letter state or province codes, for example NY or CA.",
            "items": {
              "type": "string"
            }
          },
          "venueCountry": {
            "title": "Venue country",
            "type": "array",
            "description": "Country as SportsbookReview writes it, for example USA, CAN or England.",
            "items": {
              "type": "string"
            }
          },
          "maxItems": {
            "title": "Max rows",
            "minimum": 1,
            "type": "integer",
            "description": "Hard cap on rows written and billed. The run stops as soon as it is reached.",
            "default": 200
          },
          "maxConcurrency": {
            "title": "Concurrency",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many games are enriched at once. Raise it for long historical ranges; lower it if you hit timeouts.",
            "default": 8
          },
          "maxRequestRetries": {
            "title": "Request retries",
            "minimum": 0,
            "maximum": 8,
            "type": "integer",
            "description": "Retries per failed page, with exponential backoff.",
            "default": 3
          },
          "requestTimeoutSecs": {
            "title": "Request timeout (seconds)",
            "minimum": 5,
            "maximum": 180,
            "type": "integer",
            "description": "Per-request timeout.",
            "default": 45
          },
          "proxyConfiguration": {
            "title": "Proxy (optional)",
            "type": "object",
            "description": "SportsbookReview serves these pages to anonymous clients, so this Actor needs no proxy and leaves it off. Turn it on only if your own network is blocked.",
            "default": {
              "useApifyProxy": 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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}