{
  "openapi": "3.0.1",
  "info": {
    "title": "Sports Betting Odds Scraper - Live Lines, Arbitrage & +EV",
    "description": "Scrape live sports betting odds from FanDuel, Bovada & Pinnacle (sharp lines): moneyline, spread & totals for NFL, NBA, MLB, NHL, UFC, soccer & more. Best price per outcome, no-vig fair odds, arbitrage & +EV value detection, line-movement monitoring. No third-party API key. JSON, CSV, Excel.",
    "version": "0.1",
    "x-build-id": "EyzuenCHP3ZAxX4UB"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapesage~sports-betting-odds-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapesage-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/scrapesage~sports-betting-odds-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapesage-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/scrapesage~sports-betting-odds-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapesage-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 / sports",
            "type": "array",
            "description": "Which leagues to pull odds for. The actor returns whatever games each book currently lists for these leagues (out-of-season leagues simply return nothing). Pick in-season leagues for live data: NFL, NCAA Football, NBA, NHL and European soccer in the fall and winter; MLB, WNBA and MLS in the summer; UFC, boxing and tennis all year.",
            "items": {
              "type": "string",
              "enum": [
                "MLB",
                "WORLDCUP",
                "NBA",
                "WNBA",
                "NCAAB",
                "NFL",
                "NCAAF",
                "NHL",
                "UFC",
                "EPL",
                "UCL",
                "MLS",
                "LALIGA",
                "ATP",
                "WTA",
                "PGA",
                "BOXING",
                "SERIEA",
                "BUNDESLIGA",
                "LIGUE1",
                "UEL",
                "LIGAMX",
                "CFL"
              ],
              "enumTitles": [
                "MLB (baseball)",
                "Soccer - FIFA World Cup",
                "NBA (basketball)",
                "WNBA (basketball)",
                "NCAA Basketball",
                "NFL (football)",
                "NCAA Football",
                "NHL (hockey)",
                "UFC / MMA",
                "Soccer - English Premier League",
                "Soccer - UEFA Champions League",
                "Soccer - MLS",
                "Soccer - La Liga",
                "Tennis - ATP",
                "Tennis - WTA",
                "PGA Golf (matchups)",
                "Boxing",
                "Soccer - Serie A (Italy)",
                "Soccer - Bundesliga (Germany)",
                "Soccer - Ligue 1 (France)",
                "Soccer - UEFA Europa League",
                "Soccer - Liga MX (Mexico)",
                "CFL (Canadian football)"
              ]
            },
            "default": [
              "MLB",
              "WORLDCUP",
              "NBA",
              "WNBA",
              "NFL",
              "UFC",
              "EPL"
            ]
          },
          "books": {
            "title": "Sportsbooks",
            "type": "array",
            "description": "Which sportsbooks to pull odds from. <b>Pinnacle</b> = the sharp reference book (its no-vig line powers +EV detection). <b>FanDuel</b> = largest US book. <b>Bovada</b> = popular offshore book. Use 2+ books to unlock best-price line shopping and arbitrage.",
            "items": {
              "type": "string",
              "enum": [
                "pinnacle",
                "fanduel",
                "bovada"
              ],
              "enumTitles": [
                "Pinnacle (sharp lines)",
                "FanDuel",
                "Bovada"
              ]
            },
            "default": [
              "pinnacle",
              "fanduel",
              "bovada"
            ]
          },
          "markets": {
            "title": "Markets",
            "type": "array",
            "description": "Which betting markets to include. <b>Moneyline</b> = who wins. <b>Spread</b> = point spread / run line / puck line / handicap. <b>Total</b> = over/under total points/runs/goals.",
            "items": {
              "type": "string",
              "enum": [
                "moneyline",
                "spread",
                "total"
              ],
              "enumTitles": [
                "Moneyline",
                "Spread / handicap",
                "Total (over/under)"
              ]
            },
            "default": [
              "moneyline",
              "spread",
              "total"
            ]
          },
          "outputMode": {
            "title": "Output shape",
            "enum": [
              "events",
              "rows"
            ],
            "type": "string",
            "description": "<b>Rich event records</b> = one record per game with every book's prices nested, best price, no-vig fair odds, arbitrage and +EV value bets (the richest format). <b>Flat odds rows</b> = one row per book × market × selection (great for spreadsheets and databases).",
            "default": "events"
          },
          "includeLive": {
            "title": "Include live (in-play) games",
            "type": "boolean",
            "description": "Include games that have already started (live, in-play odds) in addition to upcoming games.",
            "default": true
          },
          "includeAlternateLines": {
            "title": "Include alternate spreads & totals",
            "type": "boolean",
            "description": "Also capture alternate point spreads and totals (e.g. every available line, not just the main one). Adds many more selections per game.",
            "default": false
          },
          "onlyArbitrage": {
            "title": "Only arbitrage games",
            "type": "boolean",
            "description": "Emit only games where a guaranteed-profit arbitrage exists across the selected books (best price on each side, from at least two different books, sums to under 100%).",
            "default": false
          },
          "onlyValueBets": {
            "title": "Only +EV value games",
            "type": "boolean",
            "description": "Emit only games that contain at least one positive-expected-value bet (a book price on a moneyline, spread or total beating the sharp / consensus no-vig fair odds at the same line).",
            "default": false
          },
          "minArbitrageProfit": {
            "title": "Min arbitrage profit %",
            "minimum": 0,
            "type": "integer",
            "description": "Only flag arbitrage opportunities with at least this guaranteed profit percentage. 0 = flag any positive arbitrage.",
            "default": 0
          },
          "minValueEdge": {
            "title": "Min value edge %",
            "minimum": 0,
            "type": "integer",
            "description": "Only flag +EV value bets whose edge over the fair price is at least this percentage. 0 = flag any positive edge.",
            "default": 0
          },
          "maxEvents": {
            "title": "Max events",
            "minimum": 1,
            "type": "integer",
            "description": "Maximum number of games (events) to output this run, live games first, then the soonest. In flat-rows mode each game still expands to multiple rows. Leave it empty to get up to 200 games for the leagues you picked. An API call that sets no leagues, books, markets or Max events runs a 25-game preview."
          },
          "monitorMode": {
            "title": "Monitoring mode: only new odds & line moves",
            "type": "boolean",
            "description": "Remember odds across runs in a named key-value store and emit ONLY games whose odds are new or have MOVED since the last run. Perfect for line-movement alerts, steam moves and new-game tracking. Works with Apify Schedules: schedule the run, and monitoring mode dedupes against prior runs.",
            "default": false
          },
          "monitorKey": {
            "title": "Monitor key",
            "type": "string",
            "description": "Names the memory used by monitoring mode. Use a distinct key per saved watch so different monitors don't share state.",
            "default": "default"
          },
          "fanduelState": {
            "title": "FanDuel state",
            "enum": [
              "az",
              "co",
              "ct",
              "il",
              "in",
              "ia",
              "ks",
              "ky",
              "la",
              "md",
              "mi",
              "nj",
              "ny",
              "oh",
              "pa",
              "tn",
              "va",
              "wv",
              "wy",
              "nc",
              "vt",
              "dc"
            ],
            "type": "string",
            "description": "US state whose FanDuel sportsbook to read (FanDuel serves slightly different lines per state). Most users can leave the default.",
            "default": "va"
          },
          "pinnacleApiKey": {
            "title": "Pinnacle API key (optional)",
            "type": "string",
            "description": "Optional override for the Pinnacle guest API key. Leave blank to use the built-in public key."
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 12,
            "type": "integer",
            "description": "Maximum parallel requests across books and leagues. Keep moderate (3 to 6) to avoid rate limits.",
            "default": 4
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Proxy settings. Apify Proxy (datacenter) works for all three books; switch to Residential if a book starts blocking.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}