{
  "openapi": "3.0.1",
  "info": {
    "title": "FanDuel Odds Scraper - Live Sports, Markets & Player Props",
    "description": "Scrape FanDuel sportsbook odds, including moneylines, spreads, totals, player props and futures. Extract decimal, fractional and American odds, live event markers and kickoff times. Supports scheduled incremental monitoring to track odds changes.",
    "version": "0.1",
    "x-build-id": "7DlbbCoTEc7JpJpqX"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~fanduel-odds-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-fanduel-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/abotapi~fanduel-odds-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-fanduel-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/abotapi~fanduel-odds-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-fanduel-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",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "popular",
              "sports",
              "urls"
            ],
            "type": "string",
            "description": "popular = the site's own cross-sport featured board: every featured event with moneyline, spread and total, plus the player-prop and futures markets the board carries. sports = walk one or more whole sports (pick below). urls = read specific pages you paste (league pages, whole sports, or a single game).",
            "default": "popular"
          },
          "sports": {
            "title": "Sports (sports mode)",
            "uniqueItems": true,
            "type": "array",
            "description": "sports mode: which sports to walk. Each sport reads its richest board (the league page the site maintains for the major US sports, the whole-sport page for the rest).",
            "items": {
              "type": "string",
              "enum": [
                "American Football",
                "Australian Rules",
                "Baseball",
                "Basketball",
                "Boxing",
                "Cricket",
                "Darts",
                "Golf",
                "Ice Hockey",
                "Lacrosse",
                "Mixed Martial Arts",
                "Motor Sport",
                "Rugby League",
                "Rugby Union",
                "Soccer",
                "Snooker",
                "Table Tennis",
                "Tennis",
                "Volleyball"
              ]
            },
            "default": [
              "American Football",
              "Basketball"
            ]
          },
          "urls": {
            "title": "Links (links mode)",
            "type": "array",
            "description": "links mode: paste FanDuel page links. Supported: league pages (sportsbook.fanduel.com/navigation/nfl), whole sports (sportsbook.fanduel.com/soccer), and a single game (the link ends in the game's id). Anything else is skipped with a warning.",
            "default": [
              "https://sportsbook.fanduel.com/navigation/nfl",
              "https://sportsbook.fanduel.com/soccer",
              "https://sportsbook.fanduel.com/football/nfl/jacksonville-jaguars-@-baltimore-ravens-36244870"
            ],
            "items": {
              "type": "string"
            }
          },
          "region": {
            "title": "Sportsbook region",
            "enum": [
              "NJ",
              "PA",
              "AZ",
              "MI",
              "IN",
              "IL",
              "CO",
              "VA",
              "OH",
              "NC",
              "TN",
              "WV",
              "MD",
              "LA",
              "KY",
              "KS",
              "CT",
              "IA",
              "NY",
              "WY",
              "NH",
              "ME",
              "MA",
              "DC"
            ],
            "type": "string",
            "description": "Which FanDuel state site to read. Odds and availability vary by state.",
            "default": "NJ"
          },
          "liveOnly": {
            "title": "Live games only",
            "type": "boolean",
            "description": "Keep only records whose game is flagged in-play on the pages read this run. The live board itself is not anonymously readable, so this filters the pages above rather than walking a live-only feed.",
            "default": false
          },
          "fetchSgpMarkets": {
            "title": "Same Game Parlay markets per event",
            "type": "boolean",
            "description": "Also read each collected event's Same Game Parlay market tab (its full SGP-eligible market set, priced like every other market). Each event whose SGP markets are delivered counts as one enrichment read; events whose tab cannot be read are not counted. Raise Max items to leave room for the extra rows.",
            "default": false
          },
          "maxItems": {
            "title": "Max items",
            "minimum": 0,
            "type": "integer",
            "description": "Stop after this many odds records (event boards, markets, the site's own Same Game Parlay picks, and SGP market tabs all count). Leave 0 for no limit.",
            "default": 20
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Residential US exits are recommended for the most reliable results.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ],
              "apifyProxyCountry": "US"
            }
          },
          "resumeFromRunId": {
            "title": "Resume from run ID",
            "type": "string",
            "description": "Continue a previous run: records that run already delivered are skipped."
          },
          "incrementalMode": {
            "title": "Incremental mode",
            "type": "boolean",
            "description": "Scheduled monitoring: keep a per-scope baseline and emit NEW, UPDATED, REAPPEARED and EXPIRED records. Odds movements are the change signal.",
            "default": false
          },
          "stateKey": {
            "title": "State key (incremental)",
            "type": "string",
            "description": "Optional name for the incremental baseline."
          },
          "emitUnchanged": {
            "title": "Emit unchanged rows",
            "type": "boolean",
            "description": "Incremental mode: also push records whose odds did not move.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired rows",
            "type": "boolean",
            "description": "Incremental mode: after a complete scan, push rows for records no longer present.",
            "default": false
          },
          "ignoreFieldsForChanges": {
            "title": "Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "Additional record fields that must never mark a row UPDATED.",
            "items": {
              "type": "string"
            }
          },
          "mcpConnectors": {
            "title": "MCP connectors",
            "type": "array",
            "description": "Apify MCP connector IDs to notify with the first collected rows. Leave empty to skip.",
            "items": {
              "type": "string"
            }
          },
          "maxNotifyListings": {
            "title": "Max rows sent to connectors",
            "type": "integer",
            "description": "Internal: how many of the first collected rows a connector export may send.",
            "default": 10
          },
          "notionParentPageUrl": {
            "title": "Notion parent page URL",
            "type": "string",
            "description": "Internal: target page for a Notion connector export."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}