{
  "openapi": "3.0.1",
  "info": {
    "title": "SportsLine Scraper - Odds, Expert Picks & Projections",
    "description": "Scrape SportsLine betting data across 16 leagues. Odds from seven sportsbooks per game, public betting splits, final scores with graded outcomes back to 2018, expert picks with writeups, futures, injuries and SportsLine model simulations.",
    "version": "0.1",
    "x-build-id": "bmp3ANMxnyPosSUTy"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/parseforge~sportsline-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-parseforge-sportsline-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~sportsline-scraper/runs": {
      "post": {
        "operationId": "runs-sync-parseforge-sportsline-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~sportsline-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-parseforge-sportsline-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": {
          "datasets": {
            "title": "What to collect",
            "type": "array",
            "description": "Which SportsLine feeds to write. Each one produces its own row shape, tagged by resultType. Games is the odds board; the rest are separate datasets that share the same league and filter settings.",
            "items": {
              "type": "string",
              "enum": [
                "games",
                "expertPicks",
                "futures",
                "injuries",
                "experts",
                "simulations"
              ],
              "enumTitles": [
                "Games - odds board, scores and betting splits",
                "Expert picks - graded picks with writeups",
                "Futures - outright and season-long markets",
                "Injuries - league injury report",
                "Experts - handicapper leaderboard and streaks",
                "Simulations - SportsLine model picks with grades"
              ]
            },
            "default": [
              "games"
            ]
          },
          "leagues": {
            "title": "Leagues",
            "type": "array",
            "description": "Leagues to read. SportsLine only publishes a slate while a league is in season, so an out-of-season pick returns nothing rather than failing. UFC is not offered: SportsLine has a UFC odds page but its data API returns zero fights on every query, including the archive, so shipping it as a choice would only waste a run.",
            "items": {
              "type": "string",
              "enum": [
                "NFL",
                "NCAAF",
                "NBA",
                "NCAAB",
                "MLB",
                "NHL",
                "MLS",
                "NWSL",
                "EPL",
                "LIGA",
                "BUND",
                "SERI",
                "FRAN",
                "CHLG",
                "WCS"
              ],
              "enumTitles": [
                "NFL",
                "College Football",
                "NBA",
                "College Basketball",
                "MLB",
                "NHL",
                "MLS",
                "NWSL",
                "Premier League",
                "La Liga",
                "Bundesliga",
                "Serie A",
                "Ligue 1",
                "Champions League",
                "FIFA World Cup"
              ]
            },
            "default": [
              "NFL",
              "NBA",
              "MLB",
              "NHL"
            ]
          },
          "maxItems": {
            "title": "Maximum rows",
            "minimum": 1,
            "type": "integer",
            "description": "Stop after this many rows across every selected dataset. Leave empty to collect everything the filters allow. Free Apify plans are capped at 25 rows regardless."
          },
          "startDate": {
            "title": "Games from (date)",
            "type": "string",
            "description": "Only games kicking off on or after this date, as YYYY-MM-DD. Leave empty for the upcoming schedule. SportsLine's archive reaches back to October 2018, and pulling a historical window returns the closing line, the graded outcome and the final score."
          },
          "endDate": {
            "title": "Games until (date)",
            "type": "string",
            "description": "Only games kicking off on or before this date, as YYYY-MM-DD. Combine with the from-date for a window. On its own it means everything from the start of the archive up to that date."
          },
          "gameStatus": {
            "title": "Game status",
            "type": "array",
            "description": "Keep only games in these states. Leave empty for every state. FINAL games carry the final score and each market's graded WIN/LOSS/PUSH outcome.",
            "items": {
              "type": "string",
              "enum": [
                "SCHEDULED",
                "IN_PROGRESS",
                "FINAL",
                "POSTPONED",
                "CANCELLED"
              ],
              "enumTitles": [
                "Scheduled",
                "In progress",
                "Final",
                "Postponed",
                "Cancelled"
              ]
            }
          },
          "teams": {
            "title": "Teams",
            "type": "array",
            "description": "Team abbreviations such as KC, NYY or PHI. A game is kept when either side matches. Also filters expert picks and injuries.",
            "items": {
              "type": "string"
            }
          },
          "sportsbooks": {
            "title": "Sportsbooks to keep",
            "type": "array",
            "description": "Trim the odds block down to these books. Applies only when \"Add every sportsbook\" is on — without it the row carries the consensus line alone. Leave empty to keep every book fetched. This narrows the output, not the run, because SportsLine returns all books in the same response. If your selection would leave a game with no price at all, the consensus line is kept so the row still stands on its own.",
            "items": {
              "type": "string",
              "enum": [
                "consensus",
                "draftkings",
                "fanduel",
                "betmgm",
                "caesars",
                "betrivers",
                "thescore"
              ],
              "enumTitles": [
                "Consensus",
                "DraftKings",
                "FanDuel",
                "BetMGM",
                "Caesars",
                "BetRivers",
                "theScore"
              ]
            }
          },
          "onlyWithOdds": {
            "title": "Only games with odds",
            "type": "boolean",
            "description": "Drop games no book has priced yet. Useful on a schedule pulled far in advance.",
            "default": false
          },
          "minTotal": {
            "title": "Minimum total",
            "type": "number",
            "description": "Keep games where at least one book posts an over/under of at least this many points, runs or goals."
          },
          "maxTotal": {
            "title": "Maximum total",
            "type": "number",
            "description": "Keep games where at least one book posts an over/under no higher than this."
          },
          "minSpread": {
            "title": "Minimum spread",
            "type": "number",
            "description": "Keep games whose point spread is at least this wide, measured as an absolute value. Use it to isolate blowout candidates."
          },
          "maxSpread": {
            "title": "Maximum spread",
            "type": "number",
            "description": "Keep games whose point spread is no wider than this, measured as an absolute value. Set it to 3 for coin-flip games."
          },
          "minMoneyline": {
            "title": "Minimum moneyline",
            "type": "number",
            "description": "Keep games where some quoted moneyline is at least this price, in American odds. Also filters futures. Set 200 to find long shots."
          },
          "maxMoneyline": {
            "title": "Maximum moneyline",
            "type": "number",
            "description": "Keep games where some quoted moneyline is no higher than this price, in American odds. Also filters futures."
          },
          "minPublicBetPercent": {
            "title": "Minimum public bet %",
            "minimum": 0,
            "maximum": 100,
            "type": "number",
            "description": "Keep games where one side has drawn at least this share of public bets. Reads the betting-splits block even when you have not turned it on, so you can screen for lopsided public action without buying the column."
          },
          "pickStatus": {
            "title": "Pick result",
            "type": "array",
            "description": "Keep only expert picks with these results. Settled picks (win, loss, push) show the plain-language selection; pending picks show the market, line, price and side but label the selection Subscribers Only.",
            "items": {
              "type": "string",
              "enum": [
                "PENDING",
                "WIN",
                "LOSS",
                "PUSH",
                "ERROR"
              ],
              "enumTitles": [
                "Pending",
                "Win",
                "Loss",
                "Push",
                "Error"
              ]
            }
          },
          "pickMarketTypes": {
            "title": "Pick market",
            "type": "array",
            "description": "Keep only picks on these markets. Leave empty for all four.",
            "items": {
              "type": "string",
              "enum": [
                "MONEY_LINE",
                "POINT_SPREAD",
                "OVER_UNDER",
                "PROP"
              ],
              "enumTitles": [
                "Moneyline",
                "Point spread",
                "Over/under",
                "Prop"
              ]
            }
          },
          "expertIds": {
            "title": "Expert IDs",
            "type": "array",
            "description": "Keep only picks from these SportsLine expert IDs. Run the Experts dataset first to find the IDs you want.",
            "items": {
              "type": "string"
            }
          },
          "onlyFeaturedPicks": {
            "title": "Only featured picks",
            "type": "boolean",
            "description": "Keep only the picks SportsLine flags as featured.",
            "default": false
          },
          "minPickUnits": {
            "title": "Minimum units staked",
            "type": "number",
            "description": "Keep only picks staked at this many units or more. Experts stake 0.5 to 3 units, so 1 removes the low-conviction plays."
          },
          "futureTypes": {
            "title": "Futures scope",
            "type": "array",
            "description": "Which futures buckets to keep: league-wide markets (division and conference winners, win totals), team markets, or player awards. Leave empty for all three.",
            "items": {
              "type": "string",
              "enum": [
                "league",
                "team",
                "player"
              ],
              "enumTitles": [
                "League markets",
                "Team markets",
                "Player awards"
              ]
            }
          },
          "injuryStatuses": {
            "title": "Injury status",
            "type": "array",
            "description": "Keep only players carrying one of these designations. Matching ignores case and matches on substring, so IL also catches the 10-Day IL and SUS also catches Reserve-Sus. Leave empty for the whole report.",
            "items": {
              "type": "string",
              "enum": [
                "OUT",
                "DOUBTFUL",
                "QUESTIONABLE",
                "PROBABLE",
                "GTD",
                "IL",
                "SUS",
                "NFI-A"
              ],
              "enumTitles": [
                "Out",
                "Doubtful",
                "Questionable",
                "Probable",
                "GTD - game-time decision",
                "IL - injured list",
                "SUS - suspended",
                "NFI-A - non-football injury"
              ]
            }
          },
          "includeAllBooks": {
            "title": "Add every sportsbook",
            "type": "boolean",
            "description": "Adds DraftKings, FanDuel, BetMGM, Caesars, BetRivers and theScore alongside the consensus line, each with its own moneyline, spread and total. Off by default, and the base row still carries the consensus price on its own.",
            "default": false
          },
          "includeBettingSplits": {
            "title": "Add public betting splits",
            "type": "boolean",
            "description": "Adds the share of public bets on each side of the moneyline, spread and total. SportsLine publishes the bet count share but not the money share, so only bet percentages are returned.",
            "default": false
          },
          "includeScoreByPeriod": {
            "title": "Add score by period",
            "type": "boolean",
            "description": "Adds quarter, inning or period scoring for both teams. Only populated once a game is under way or final.",
            "default": false
          },
          "includeTeamForm": {
            "title": "Add projected score and team form",
            "type": "boolean",
            "description": "Adds SportsLine's projected score for each side plus the head-to-head form strip (win-loss, against-the-spread and over/under records). One extra request per league, not per game.",
            "default": false
          },
          "includeSeasonTrends": {
            "title": "Add season betting trends",
            "type": "boolean",
            "description": "Adds each team's season records by situation on the moneyline, spread and total, with units won or lost. One extra request per game.",
            "default": false
          },
          "includePlayerProps": {
            "title": "Add player prop lines",
            "type": "boolean",
            "description": "Adds the player prop markets SportsLine lists for the game — market, line, both sides priced, plus SportsLine's rank and matchup score. The model's own projection is subscriber-only and is not returned. One extra request per game, coverage is thin: 25 props across 125 games measured on 2026-08-25, and games with none are neither returned nor billed.",
            "default": false
          },
          "includeAnalytics": {
            "title": "Add line-shopping analytics",
            "type": "boolean",
            "description": "Adds bookmaker hold per book, de-vigged fair probability, best price per side with the book that holds it, line-shopping gain in basis points, and a cross-book arbitrage check with the stake split. It fetches every sportsbook in order to compute those numbers, but only writes them to the row if you also turn on \"Add every sportsbook\" — so you can buy the analysis without buying the price grid.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}