{
  "openapi": "3.0.1",
  "info": {
    "title": "RotoWire Odds Scraper - Lines, Props & Futures",
    "description": "Scrape RotoWire betting odds across 10 sports. Moneyline, spread and totals from nine sportsbooks per game, plus player props, full market breakdowns, injury reports, futures, and computed hold, fair probability and arbitrage.",
    "version": "0.1",
    "x-build-id": "MC4OzKHw0Kee3p7zF"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/parseforge~rotowire-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-parseforge-rotowire-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~rotowire-scraper/runs": {
      "post": {
        "operationId": "runs-sync-parseforge-rotowire-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~rotowire-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-parseforge-rotowire-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": {
          "sports": {
            "title": "Sports",
            "type": "array",
            "description": "Which RotoWire betting sections to scrape. Each sport is fetched for the slate you choose below, or for the slate RotoWire is currently showing if you leave the slate fields empty.",
            "items": {
              "type": "string",
              "enum": [
                "nfl",
                "college-football",
                "nba",
                "college-basketball",
                "mlb",
                "nhl",
                "wnba",
                "soccer",
                "golf",
                "mma"
              ],
              "enumTitles": [
                "NFL",
                "College Football (NCAAF)",
                "NBA",
                "College Basketball (NCAAB)",
                "MLB",
                "NHL",
                "WNBA",
                "Soccer",
                "Golf (PGA)",
                "MMA (UFC)"
              ]
            },
            "default": [
              "nfl"
            ]
          },
          "dates": {
            "title": "Dates",
            "type": "array",
            "description": "Slate dates as YYYY-MM-DD, for the date-based sports: NBA, MLB, NHL, WNBA, college basketball and soccer. Leave empty to use the date RotoWire is currently showing.",
            "items": {
              "type": "string"
            }
          },
          "weeks": {
            "title": "Weeks",
            "type": "array",
            "description": "Week numbers for NFL and college football, for example 1 or 12. Leave empty to use the week RotoWire is currently showing.",
            "items": {
              "type": "string"
            }
          },
          "soccerLeagues": {
            "title": "Soccer leagues",
            "type": "array",
            "description": "Which competitions to pull when Soccer is selected. RotoWire serves one slate per league, so each league costs one slate scan. Defaults to the Premier League.",
            "items": {
              "type": "string",
              "enum": [
                "epl",
                "eng_ch",
                "liga",
                "bund",
                "seri",
                "fran",
                "mls",
                "ucl",
                "uel",
                "super",
                "woc"
              ],
              "enumTitles": [
                "English Premier League",
                "English Championship",
                "Spanish La Liga",
                "German Bundesliga",
                "Italian Serie A",
                "French Ligue 1",
                "Major League Soccer",
                "UEFA Champions League",
                "UEFA Europa League",
                "UEFA Super Cup",
                "World Cup"
              ]
            }
          },
          "eventIds": {
            "title": "Golf / MMA event ids",
            "type": "array",
            "description": "RotoWire event ids for golf tournaments or UFC cards, taken from the event picker on the betting page. Leave empty to use the event RotoWire is currently showing.",
            "items": {
              "type": "string"
            }
          },
          "includeGameBets": {
            "title": "Add the full market breakdown",
            "type": "boolean",
            "description": "Fetch every market RotoWire lists for each game — moneyline, spread, every total, and sport-specific markets such as MLB's first-inning run lines — with all nine books quoted side by side. One extra request per game.",
            "default": false
          },
          "includePlayerProps": {
            "title": "Add player props",
            "type": "boolean",
            "description": "Fetch player props for each NFL game — passing, rushing and receiving lines, touchdown scorers, and the rest — with every book's price. NFL only; RotoWire publishes props for no other sport. One extra request per game.",
            "default": false
          },
          "includeTeamInjuries": {
            "title": "Add team injury reports",
            "type": "boolean",
            "description": "Attach both teams' injury reports to each game: player, position, injury, status and depth-chart rank. Reports are fetched once per team and reused across that team's games.",
            "default": false
          },
          "includeFutures": {
            "title": "Add futures markets",
            "type": "boolean",
            "description": "Also write championship, conference, division, win-total and award futures for each sport picked, one row per book quote. Available for NFL, NBA, MLB, NHL, WNBA and both college sports.",
            "default": false
          },
          "includeLineShopping": {
            "title": "Add line-shopping analytics",
            "type": "boolean",
            "description": "Add the derived block: bookmaker hold per book, de-vigged fair probability, what shopping the best price is worth in basis points, and cross-book arbitrage detection with stake split. Computed from the quotes already fetched, so it costs no extra request.",
            "default": false
          },
          "sportsbooks": {
            "title": "Sportsbooks",
            "type": "array",
            "description": "Keep only these books in the output. RotoWire ignores a book parameter on its own endpoints, so this is applied after the fetch — it trims the row, it does not make the run cheaper or faster. Leave empty for all nine.",
            "items": {
              "type": "string",
              "enum": [
                "draftkings",
                "fanduel",
                "mgm",
                "caesars",
                "betrivers",
                "hardrock",
                "fanatics",
                "thescore",
                "circasports"
              ],
              "enumTitles": [
                "DraftKings",
                "FanDuel",
                "BetMGM",
                "Caesars",
                "BetRivers",
                "Hard Rock",
                "Fanatics",
                "theScore",
                "Circa Sports"
              ]
            }
          },
          "teams": {
            "title": "Teams, fighters or golfers",
            "type": "array",
            "description": "Keep only rows involving these names. Matches team abbreviations and full names, and fighter and golfer names, case-insensitively — for example DAL, Cowboys, or Scheffler.",
            "items": {
              "type": "string"
            }
          },
          "marketTypes": {
            "title": "Required markets",
            "type": "array",
            "description": "Keep only games that have at least one of these markets priced. Leave empty to keep every game.",
            "items": {
              "type": "string",
              "enum": [
                "moneyline",
                "spread",
                "total"
              ],
              "enumTitles": [
                "Moneyline",
                "Spread",
                "Total (over/under)"
              ]
            }
          },
          "minMoneyline": {
            "title": "Minimum moneyline",
            "type": "integer",
            "description": "Keep games where at least one side's best moneyline is this price or longer, in American odds. Use -150 to skip games with a heavy favourite on both books."
          },
          "maxMoneyline": {
            "title": "Maximum moneyline",
            "type": "integer",
            "description": "Keep games where at least one side's best moneyline is this price or shorter, in American odds. Use 200 to drop games with only long shots."
          },
          "minTotal": {
            "title": "Minimum total points",
            "type": "number",
            "description": "Keep games whose over/under line is at least this many points. Decimals allowed, for example 7.5 or 44.5."
          },
          "maxTotal": {
            "title": "Maximum total points",
            "type": "number",
            "description": "Keep games whose over/under line is at most this many points. Decimals allowed, for example 7.5 or 44.5."
          },
          "minSpread": {
            "title": "Minimum spread size",
            "type": "number",
            "description": "Keep games whose spread is at least this large, ignoring which side is favoured. Decimals allowed. Use 7 for lopsided games only."
          },
          "maxSpread": {
            "title": "Maximum spread size",
            "type": "number",
            "description": "Keep games whose spread is at most this large, ignoring which side is favoured. Decimals allowed. Use 3.5 for close games only."
          },
          "minBooksQuoting": {
            "title": "Minimum books quoting",
            "type": "integer",
            "description": "Keep games priced by at least this many of the nine sportsbooks. Useful for dropping thin markets before comparing prices."
          },
          "onlyWithOdds": {
            "title": "Only games with odds",
            "type": "boolean",
            "description": "Skip games RotoWire lists on the slate but has no priced market for yet.",
            "default": false
          },
          "onlyArbitrage": {
            "title": "Only arbitrage opportunities",
            "type": "boolean",
            "description": "Keep only games where the best moneyline or the best total across the nine books guarantees a profit. Turns on the line-shopping block automatically, since that is where the check is computed.",
            "default": false
          },
          "startsAfter": {
            "title": "Starts after",
            "type": "string",
            "description": "Keep games starting at or after this time, as YYYY-MM-DD or a full ISO timestamp. RotoWire publishes start times in US Eastern."
          },
          "startsBefore": {
            "title": "Starts before",
            "type": "string",
            "description": "Keep games starting at or before this time, as YYYY-MM-DD or a full ISO timestamp. RotoWire publishes start times in US Eastern."
          },
          "maxItems": {
            "title": "Maximum rows",
            "minimum": 1,
            "type": "integer",
            "description": "Stop after writing this many rows. Free-plan runs stop at 25 rows regardless.",
            "default": 1000
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Optional. RotoWire served the endpoints this Actor uses without a challenge from a plain datacenter IP, so no proxy is configured by default and no proxy cost is billed. Turn one on only if a run starts getting blocked."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}