ParseForge Scrapers

SportsLine Scraper - Odds, Expert Picks & Projections

parseforge/sportsline-scraper

Developer toolsAutomation

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.

Run this scraper See the API call
Total users
2
Monthly active
1
Total runs
17
Bookmarked
0
Rating
Not rated yet
Last modified
9 hours ago

Overview

ParseForge

SportsLine Scraper - Odds, Expert Picks & Projections

Scrape SportsLine's betting data across 15 leagues. Every game comes with the consensus line plus six named sportsbooks, opening and current prices, the share of public bets on each side, and: on finished games, the final score with every market already graded WIN, LOSS or PUSH. Five more datasets sit alongside it: expert picks with the analyst's writeup, futures, injury reports, the handicapper leaderboard and SportsLine's own model simulations. No login, no API key, no proxy. Export to CSV, JSON, Excel, or XML.

SportsLine is CBS Sports' betting arm. Its odds board, its public-money splits and its settled pick history are served by a public API that needs no account, and this Actor reads it directly rather than parsing a page. Measured on the platform on 2026-08-25: 569 rows across all six datasets, with every optional block switched on, finished in 7.3 seconds inside 68 MB. A 1,200-game historical pull took 17 seconds.

Who uses it What they scrape SportsLine for
Bettors and handicappers Six books on one row, plus which side the public is on
Quants and backtesters Closing lines and graded outcomes back to October 2018
Model builders 110,001 archived games with the line, the result and the public split
Affiliate and media teams Futures boards, injury reports and expert records for content pages
Tipster-tracking tools 94,000+ expert picks, all but 41 already settled, with units staked and result
Arbitrage and +EV tools Cross-book price gaps, with the hold and arbitrage check already run

What it does

This Actor reads SportsLine's public data API and writes one row per record, tagged with resultType. Pick the datasets you want; they share the same league list and filters.

  • ๐ŸŸ๏ธ Games: teams, venue, kickoff, TV, weather, plus the consensus line and up to six named books.
  • ๐Ÿ’ฐ Seven price sources per game: Consensus, DraftKings, FanDuel, BetMGM, Caesars, BetRivers and theScore, each with moneyline, spread and total.
  • ๐Ÿ“ Every price four ways: American odds, decimal odds, implied probability and profit per $100, opening and current, so you never convert by hand.
  • ๐Ÿ“Š Public betting splits, the share of bets on each side of the moneyline, spread and total.
  • ๐Ÿ Graded history: finished games carry the final score, period-by-period scoring, and each market side marked WIN, LOSS or PUSH against the closing line.
  • ๐ŸŽฏ Expert picks, the market, line, price, side and units staked, the analyst's full writeup, their current streak, and the result once it settles.
  • ๐Ÿ† Futures: division, conference, championship, win-total and player-award markets, one row per selection, with the field overround and a de-vigged fair probability.
  • ๐Ÿš‘ Injuries, the league injury report with designation, body part, estimated return and the beat note.
  • ๐Ÿฅ‡ Experts, the handicapper leaderboard with rank, dollars returned to a $100 bettor, streak record and live pick count.
  • ๐Ÿค– Simulations: SportsLine's model picks with a letter grade, a confidence score and a win probability.
  • ๐Ÿงฎ Optional analytics: 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.

Results export to CSV, JSON, Excel, or XML, or stream from the API.

Leagues covered

Measured on 2026-08-25. "Archive" is how many past games the API still serves for that league.

League Upcoming games Archive Expert picks Futures markets Injury report
NFL 264 2,506 19,278 123 324
College Football 214 11,019 10,995 37 207
NBA 15 10,740 16,615 59 77
College Basketball : 43,201 15,021 8 810
MLB 28 20,546 23,915 76 277
NHL 19 11,092 6,459 25 70
MLS 31 2,168 10 : :
NWSL 7 711 12 : :
Premier League 14 1,548 448 : :
La Liga 13 1,344 177 : :
Bundesliga 17 1,052 167 : :
Serie A 16 1,535 198 : :
Ligue 1 9 1,310 122 : :
Champions League 4 1,062 694 1 :
FIFA World Cup : 167 281 : :

The upcoming column moves with the calendar: college basketball shows nothing in August and 43,201 archived games. Soccer gets odds and an archive but almost no expert picks, and no futures board. Leave the dates empty and each league returns whatever it is currently showing, so a scheduled run is self-maintaining.

What you can do with SportsLine data

๐Ÿ“ˆ Backtest against real closing lines.

Set a date window and every finished game comes back with the closing spread, total and moneyline, the final score, and each side already marked WIN, LOSS or PUSH. That is the join you normally have to build yourself. Combined with the public betting split on the same row, you can test fade-the-public strategies without stitching two feeds together.

๐Ÿฅ‡ Shop every line at once.

Turn on Add every sportsbook and each game carries six named books beside the consensus. Turn on the analytics block and you get each book's hold, the best price per side with the book that has it, and how many basis points shopping is worth, the analytics block reads every book whether or not you buy the price grid, so you can take the analysis alone. Measured on one MLB game: DraftKings held 1.65% on the moneyline against BetRivers' 4.32%.

๐Ÿง  Track handicappers.

The expert pick dataset is effectively an archive of settled bets: 94,392 picks across every league the day this was written, of which 94,351 had already been graded. Each carries the exact line and price, the units staked, the result, and the analyst's reasoning. Filter to one expert with expertIds and you have their full public record.

๐Ÿ† Build a futures page.

Futures return one row per selection with the market, the price, the field overround and a de-vigged fair probability. NFL alone posts 123 markets: division winners, conference and Super Bowl odds, win totals, playoff berths and player awards.

๐Ÿš‘ Watch the injury wire.

The injury dataset returns every listed player with designation, body part, estimated return and the beat writer's note: 810 college basketball players and 324 NFL players on the day measured.

Why choose this scraper

What you get
Six named books, plus consensus Not one unnamed aggregate. Six books quoted on the same game in one row, with booksQuoting saying how many priced it.
Graded history back to 2018 Closing line, final score and a WIN/LOSS/PUSH outcome per market side, on 110,001 archived games.
Public money on the same row The share of bets on each side, which most odds feeds either omit or sell separately.
Six datasets, one Actor Games, expert picks, futures, injuries, experts and model simulations, sharing one league list and one filter set.
No login or API key The API this reads is public and anonymous. Nothing to authenticate, nothing to expire.
No proxy cost It ran clean from a plain datacenter IP, so no proxy is configured and no proxy line hits your bill.
Opt-in extras, off by default Seven separate checkboxes. Leave them off and you are never billed for them.
Filters that cut before billing Price bands, spread and total ranges, team lists, date windows and public-money thresholds all run before anything is written.
You can filter on what you did not buy Screening by public bet percentage fetches the splits block, filters on it, then drops it. You pay the row rate, not the block.

How it compares

Be clear about the trade-off before you pick this one.

This Actor reads SportsLine, not the sportsbooks themselves. SportsLine refreshes on its own schedule, so these are near-live prices rather than tick-by-tick book feeds. If you need sub-second line movement straight from a book's API, a single-book scraper serves you better. What you get instead is six books normalised into one row, with the public split, the graded result and the fair-probability work already done.

Feature ParseForge harvest/sportsline-picks-scraper
Odds board with six named books Yes No
Public betting splits Optional block No
Graded outcomes and final scores Yes No
Historical archive Back to Oct 2018 No
Expert picks with writeups Yes Yes
Futures markets Yes No
Injury reports Yes No
Expert leaderboard and streaks Yes No
Model simulations with grades Yes Yes
Line-shopping and arbitrage analytics Optional block No
Price per 1,000 rows $7.00 $15.00

The one direct competitor on the Store covers SportsLine's model picks alone, at more than twice the rate, on a single flat event with no filters and no optional blocks.

What a game row looks like

Every game returns as one JSON row. Here is a real record with five of the six named books trimmed out:

{
  "resultType": "game",
  "league": "MLB",
  "gameId": 50021911,
  "abbr": "MLB_20260825_TB@DET",
  "url": "https://www.sportsline.com/mlb/game-forecast/MLB_20260825_TB@DET/",
  "matchup": "TB @ DET",
  "scheduledTime": "2026-08-25T22:40:00Z",
  "status": "SCHEDULED",
  "seasonYear": 2026,
  "seasonType": "REGULAR_SEASON",
  "home": {
    "id": 306, "abbr": "DET", "location": "Detroit", "nickName": "Tigers",
    "colorPrimary": "001C42",
    "logoUrl": "https://sports.cbsimg.net/fly/images/team-logos/306.svg",
    "score": null
  },
  "away": { "id": 329, "abbr": "TB", "location": "Tampa Bay", "nickName": "Rays", "score": null },
  "venue": {
    "name": "Comerica Park", "city": "Detroit", "state": "MI",
    "zipCode": "48201", "timeZone": "US/Eastern", "type": "Outdoor"
  },
  "broadcast": { "name": "Detroit SportsNet", "callLetters": "DSN", "type": "Streaming - Regional" },
  "weather": { "temperature": 79, "description": "Passing clouds. Warm.", "metric": false },
  "odds": {
    "consensus": {
      "bookId": "31", "bookName": "consensus",
      "moneyline": {
        "home": {
          "price": { "american": 115, "decimal": 2.15, "impliedProbability": 0.46512, "payoutPer100": 115 },
          "openingPrice": { "american": 108, "decimal": 2.08, "impliedProbability": 0.48077 },
          "outcome": null
        },
        "away": { "price": { "american": -127, "decimal": 1.7874, "impliedProbability": 0.55947 } }
      },
      "spread": {
        "home": { "line": 1.5, "openingLine": 1.5, "price": { "american": -159 } },
        "away": { "line": -1.5, "openingLine": -1.5, "price": { "american": 133 } }
      },
      "total": {
        "over": { "line": 7.5, "openingLine": 7.5, "price": { "american": -119 } },
        "under": { "line": 7.5, "price": { "american": -102 } }
      },
      "hasMoneyline": true, "hasSpread": true, "hasTotal": true
    }
  },
  "booksQuoting": 6,
  "finalScore": null,
  "scrapedAt": "2026-08-25T20:41:02.118Z"
}

With Add public betting splits and Add line-shopping analytics on, the row also carries:

{
  "bettingSplits": {
    "moneyline": { "betType": "Moneyline", "awayBetPercent": 81, "homeBetPercent": 19 },
    "spread":    { "betType": "Spread",    "awayBetPercent": 85, "homeBetPercent": 15 },
    "total":     { "betType": "Total",      "overBetPercent": 70, "underBetPercent": 30 }
  },
  "analytics": {
    "booksQuotingMoneyline": 6,
    "moneylineHoldByBook": {
      "draftkings": 1.653, "fanduel": 2.048, "betmgm": 3.594,
      "caesars": 2.068, "betrivers": 4.318, "thescore": 3.193
    },
    "lowestMoneylineHoldPercent": 1.653,
    "averageMoneylineHoldPercent": 2.812,
    "fairProbability": { "home": 0.45396, "away": 0.54604 },
    "best": {
      "moneyline": { "home": { "price": 116, "book": "draftkings" }, "away": { "price": -124, "book": "draftkings" } },
      "spread":    { "home": { "price": -149, "book": "betrivers" }, "away": { "price": 140, "book": "thescore" } },
      "total":     { "over": { "price": -114, "book": "betrivers" }, "under": { "price": 100, "book": "fanduel" } }
    },
    "shoppingGainBps": { "moneylineHome": 87, "moneylineAway": 1049.5, "over": 701.5 },
    "arbitrage": { "moneyline": { "exists": false, "roiPercent": -1.625, "stakeSplit": null } }
  }
}

A finished game replaces the nulls with results:

{
  "status": "FINAL",
  "finalScore": { "home": 1, "away": 0 },
  "odds": { "consensus": {
    "spread":    { "home": { "line": -1.5, "outcome": "LOSS" } },
    "total":     { "over": { "line": 8.5, "outcome": "LOSS" } },
    "moneyline": { "home": { "price": { "american": -136 }, "outcome": "WIN" } }
  } },
  "scoreByPeriod": { "home": [{ "label": "1", "period": 1, "points": 0 }, "..."] }
}

And an expert pick row:

{
  "resultType": "expert-pick",
  "league": "MLB",
  "gameAbbr": "MLB_20260824_CIN@SF",
  "scheduledTime": "2026-08-25T01:45:00Z",
  "result": "LOSS",
  "marketType": "PROP",
  "pick": "First 5 Innings Cincinnati -0.5 -103",
  "pickIsRevealed": true,
  "selection": {
    "market": "FIRST_5_INNINGS_HANDICAP",
    "marketLabel": "First 5 Innings - Spread",
    "side": "AWAY",
    "line": -0.5,
    "price": { "american": -103, "decimal": 1.9709, "impliedProbability": 0.50739 },
    "team": { "id": 317, "abbr": "CIN" }
  },
  "units": 0.5,
  "sportsbook": "Sugar House",
  "writeup": "The Reds F5 ML is around -200 with Chase Burns on the mound but we've still got some value...",
  "expert": {
    "cbsExpertId": 51295899, "fullName": "Angelo Magliocca",
    "nickName": "Amags", "twitterHandle": "@amagspicks"
  },
  "streaks": [{ "league": "MLB", "label": "6-5 in Last 11 MLB Game Props Picks", "recordLabel": "RECORD: 6-5", "profit": 39.5, "hot": false }]
}

Futures return one row per selection with the field overround and de-vigged probability. Injuries return one row per player with every listed injury. Experts return one row per handicapper with their streak records and live pick list. Simulations return one row per graded model pick.

Configure the run

Pick your datasets and leagues. Everything else is a filter or a checkbox. The Input tab lists every parameter.

Tonight's MLB board, six books and the public split:

{
  "datasets": ["games"], "leagues": ["MLB"],
  "includeAllBooks": true, "includeBettingSplits": true, "maxItems": 200
}

A historical window for backtesting: closing lines, results and public money:

{
  "datasets": ["games"], "leagues": ["NFL"],
  "startDate": "2025-09-01", "endDate": "2025-12-31",
  "gameStatus": ["FINAL"], "includeBettingSplits": true, "includeScoreByPeriod": true
}

Every settled NFL expert pick, biggest stakes first:

{
  "datasets": ["expertPicks"], "leagues": ["NFL"],
  "pickStatus": ["WIN", "LOSS", "PUSH"], "minPickUnits": 1, "maxItems": 5000
}

Games the public is piling onto, across two leagues:

{
  "datasets": ["games"], "leagues": ["NFL", "NBA"],
  "minPublicBetPercent": 80, "onlyWithOdds": true
}

Hunt for cross-book price gaps on close games:

{
  "datasets": ["games"], "leagues": ["MLB", "NHL"],
  "maxSpread": 2, "includeAnalytics": true, "maxItems": 500
}

Super Bowl and division futures, plus the injury wire:

{ "datasets": ["futures", "injuries"], "leagues": ["NFL"], "maxItems": 500 }

Filters run on the complete row before the optional blocks are trimmed off, so you can filter on a market you did not buy: screen by public bet percentage without paying for the splits column.

Pricing

Pay-per-event. You are billed per row written, plus a small charge for each listing page fetched and a $0.054 run-start fee. Filtered-out rows cost nothing.

Event Price When it fires
Run start $0.054 Once per run
League scan $0.010 Each listing page fetched: one per page of up to 200 records, plus one per league for the team-form board and two per league for the expert leaderboard. A page that failed after retries is not billed.
Game row $0.007 Each game row written
Expert pick row $0.004 Each expert pick written
Futures row $0.002 Each futures selection written
Injury row $0.003 Each injured player written
Expert row $0.004 Each handicapper written
Simulation row $0.005 Each model pick written
Every sportsbook $0.003 Only with Add every sportsbook on, per game that has named books
Betting splits $0.002 Only with Add public betting splits on, per game that has them
Score by period $0.001 Only with Add score by period on, per game that has periods
Team form $0.003 Only with Add projected score and team form on, per game that has one
Season trends $0.006 Only with Add season betting trends on, per game that returns them
Player prop lines $0.008 Only with Add player prop lines on, per game that has props
Line-shopping analytics $0.002 Only with Add line-shopping analytics on, per row
Game rows collected Approximate cost
100 $0.76
1,000 $7.10
10,000 $70.55

The seven optional blocks are off by default. A run that leaves them off pays the run-start fee, one league scan per page of 200, and $0.007 per game row. An optional block is only billed when it actually came back with data, a scheduled game has no period scoring, so Add score by period costs nothing on it.

Why $7 per 1,000 and not $1. Measured on the platform, this Actor's own cost is under a cent per 1,000 rows: 1,200 historical game rows with the betting splits attached billed $0.0068 in compute, and 569 rows across all six datasets with every optional block on billed $0.0033. It is HTTP-only, with no proxy and no browser, and peaked at 78 MB. We price on what the row is worth rather than what it costs us: six books, both sides, three markets, opening and closing prices, the public split and a graded outcome in a single row. The one direct competitor charges $15 per 1,000 for a narrower slice.

Free users

Free-plan runs return up to 25 rows as a preview. Upgrade your Apify plan to collect the full slate.

Run it

  1. Create a free Apify account with $5 in credit.
  2. Open the SportsLine Scraper.
  3. Pick your datasets and leagues, add any filters, and click Start.
  4. Export the results as CSV, Excel, JSON, or XML from the Dataset tab.

Run it programmatically through the Apify API or the ApifyClient for JavaScript and Python.

Use with AI agents (MCP)

Give an AI agent live access to SportsLine's odds, picks and public-money data through the Model Context Protocol. Add the Actor to Claude, Cursor, or any MCP client:

claude mcp add --transport http apify "https://mcp.apify.com?tools=parseforge/sportsline-scraper"

Then prompt it in plain language:

  • "Pull tonight's MLB board with every book and tell me which side the public is on in each game."
  • "Get every settled NFL expert pick from last season and rank the analysts by units won."
  • "Fetch NFL futures and show me the best price on each division winner."

Copy this into ChatGPT, Claude, or Cursor to start:

Use the Apify Actor "parseforge/sportsline-scraper" to collect betting data from SportsLine. Input: { "datasets": ["games","expertPicks","futures","injuries","experts","simulations"], "leagues": ["NFL","NCAAF","NBA","NCAAB","MLB","NHL","MLS","NWSL","EPL","LIGA","BUND","SERI","FRAN","CHLG","WCS"], "startDate": "YYYY-MM-DD", "endDate": "YYYY-MM-DD", "includeAllBooks": true, "includeBettingSplits": true, "includeAnalytics": true, "maxItems": <n> }. Each game row carries the consensus line plus six named sportsbooks with moneyline, spread and total in American and decimal odds, the share of public bets per side, and on finished games the final score with each market graded WIN/LOSS/PUSH. Call it with the ApifyClient and my APIFY_TOKEN.

Troubleshooting

Why did I get no rows?

The league is probably between seasons. SportsLine only publishes a slate when there are games on it: college basketball returns nothing in August. The log says how many records matched before filters. Pass a startDate that lands on a slate with games, or add a league that is in season.

Why does my date window return the wrong games?

It should not, but the reason it could is worth knowing. SportsLine's own date arguments do not describe a window: one date alone acts as a lower bound, and passing both drops the lower bound and honours only the end date, which silently returns the whole archive from October 2018. The Actor works around this by sending the start date to the API and trimming the end date itself. Use plain YYYY-MM-DD and you get exactly the window you asked for, a single-day MLB window returned all 15 games from that date and nothing else.

Why are some books missing from a game?

Three reasons, in order of likelihood. Add every sportsbook is off, so the row carries the consensus line alone, that is the default. Not every book prices every game. And historical games keep only the consensus line, because the named books are not archived. booksQuoting tells you how many named books are on the row.

I set sportsbooks and nothing changed.

sportsbooks trims the named books, so it only bites when Add every sportsbook is on. Without that block there are no named books to trim, and the row keeps its consensus line. If your selection would leave a game with no price at all, the consensus line is kept anyway rather than writing a row with an empty odds block.

Why does a pending expert pick say "Subscribers Only"?

That is SportsLine's own label on the human-readable pick string until the game starts. The structured selection block on the same row still carries the market, the line, the price, the side and the units, so the pick is usable either way. Settled picks (win, loss, push) show the plain-language string too, and they are almost all of them: across every league, 94,351 of 94,392 picks were already graded on the day this was measured.

Why is the money percentage missing from the betting splits?

SportsLine publishes the share of bets but not the share of money. We measured 246 split outcomes across five leagues and the money field was null in all 246, so it is not shipped as an always-null column.

Why did the player props block come back empty?

Coverage is thin. Across 125 games in five leagues we found 25 prop records, all in MLB. Games with none are neither returned nor billed, so an empty block costs nothing.

Why are the model projection numbers null?

SportsLine gates its projected numbers behind a subscription on the prop feed. What the public feed does return, the market, the line, both sides priced, and SportsLine's rank: is what this Actor ships. The Simulations dataset is the one that does carry public grades, confidence scores and win probabilities.

A run stopped early.

It hit the run timeout and wrote what it had rather than being killed with rows in memory. Narrow the leagues or the date window, or raise the timeout.

FAQ

Question Answer
Do I need a SportsLine account or subscription? No. The API this Actor reads is public and anonymous.
Do I need a proxy? No. It ran clean from a plain datacenter IP, so no proxy is configured and none is billed.
How many sportsbooks does it return? Seven price sources: Consensus, DraftKings, FanDuel, BetMGM, Caesars, BetRivers and theScore. The consensus line is always there; the six named books need Add every sportsbook, and only those that priced a given game appear on its row.
Are these live odds? They are SportsLine's published prices, refreshed on SportsLine's schedule. Near-live, not tick-by-tick.
How far back does the archive go? October 2018. Across the 15 leagues that was 110,001 games on 2026-08-25, with closing lines, final scores and graded outcomes.
Does the archive include every book? No. Historical games keep the consensus line only.
Does it cover college sports? Yes, both college football and college basketball, with the two largest archives of any league here.
Is UFC supported? No. SportsLine has a UFC odds page, but its data API returned zero fights on every query we ran, including the archive, so we left it out rather than ship a dead option.
Does it do player props? It returns the prop lines with both sides priced, as an opt-in checkbox. SportsLine's own projection on those props is subscriber-only and is not returned.
What is the arbitrage check? It takes the best price on each side across every book quoting the game and tests whether the implied probabilities sum below 100%. When they do, you get the ROI and the stake split.
How many rows per run? Free plan: 25. Paid: as many as the leagues and filters you select contain.
Can I collect several datasets at once? Yes. With more than one selected, maxItems is split evenly across them and whatever one leaves unused rolls forward to the next.
Is this an official SportsLine product? No. It is unofficial and reads only public SportsLine endpoints.

Related actors

Browse the full ParseForge collection for more scrapers.

๐Ÿ†˜ Need help? Email parseforge@protonmail.com with your run ID, your input, and what you expected.

โš ๏ธ Disclaimer. This Actor is unofficial and is not affiliated with, endorsed by, or sponsored by SportsLine, CBS Sports, Paramount, or any sportsbook named in its output. It collects only publicly available data. Odds are informational and are not betting advice; you are responsible for complying with SportsLine's terms, with applicable gambling law in your jurisdiction, and with data-protection law including GDPR and CCPA.

Input

FieldTypeWhat it doesDefault
datasets array 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. ["games"]
leagues array 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. ["NFL","MLB"]
maxItems integer 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. 100
startDate string 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. not set
endDate string 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. not set
gameStatus array 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. not set
teams array Team abbreviations such as KC, NYY or PHI. A game is kept when either side matches. Also filters expert picks and injuries. not set
sportsbooks array 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. not set
onlyWithOdds boolean Drop games no book has priced yet. Useful on a schedule pulled far in advance. false
minTotal number Keep games where at least one book posts an over/under of at least this many points, runs or goals. not set
maxTotal number Keep games where at least one book posts an over/under no higher than this. not set
minSpread number Keep games whose point spread is at least this wide, measured as an absolute value. Use it to isolate blowout candidates. not set
maxSpread number Keep games whose point spread is no wider than this, measured as an absolute value. Set it to 3 for coin-flip games. not set
minMoneyline number Keep games where some quoted moneyline is at least this price, in American odds. Also filters futures. Set 200 to find long shots. not set
maxMoneyline number Keep games where some quoted moneyline is no higher than this price, in American odds. Also filters futures. not set
minPublicBetPercent number 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. not set
pickStatus array 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. not set
pickMarketTypes array Keep only picks on these markets. Leave empty for all four. not set
expertIds array Keep only picks from these SportsLine expert IDs. Run the Experts dataset first to find the IDs you want. not set
onlyFeaturedPicks boolean Keep only the picks SportsLine flags as featured. false
minPickUnits number Keep only picks staked at this many units or more. Experts stake 0.5 to 3 units, so 1 removes the low-conviction plays. not set
futureTypes array Which futures buckets to keep: league-wide markets (division and conference winners, win totals), team markets, or player awards. Leave empty for all three. not set
injuryStatuses array 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. not set
includeAllBooks boolean 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. false
includeBettingSplits boolean 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. false
includeScoreByPeriod boolean Adds quarter, inning or period scoring for both teams. Only populated once a game is under way or final. false
includeTeamForm boolean 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. false
includeSeasonTrends boolean Adds each team's season records by situation on the moneyline, spread and total, with units won or lost. One extra request per game. false
includePlayerProps boolean 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. false
includeAnalytics boolean 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. false

Pricing

from $7.00 per 1,000 results

Charged forWhat it isPrice each
Actor Start Charged when the Actor starts running. Number of events charged depends on Actor memory (one event per GB, minimum one event). $0.054
League scan One listing page fetched from SportsLine, up to 200 records. $0.01
Game row One game with the consensus line, teams, venue, broadcast and status. $0.007
Expert pick row One expert pick with market, line, price, units, result and writeup. $0.004
Futures row One futures selection with price, field overround and fair probability. $0.002
Injury row One listed player with designation, body part, return date and note. $0.003
Expert row One handicapper with rank, profit, streak records and live picks. $0.004
Simulation row One SportsLine model pick with grade, confidence and win probability. $0.005
Every sportsbook Optional: six named books added to a game row. Off by default. $0.003
Betting splits Optional: the share of public bets per side. Off by default. $0.002
Score by period Optional: quarter, inning or period scoring. Off by default. $0.001
Team form Optional: projected score and head-to-head form strip. Off by default. $0.003
Season trends Optional: season records by situation on all three markets. Off by default. $0.006
Player prop lines Optional: prop markets with both sides priced. Off by default. $0.008
Line-shopping analytics Optional: hold per book, fair odds, best price and arbitrage. Off by default. $0.002

Tiered: the lower figure is the price on a higher Apify plan. Billing and the free credit live on Apify.

API

One POST returns the dataset directly. Same shape for every scraper in the library, so swapping the slug is the only change.

POST ยท run and get results
curl -X POST "https://api.apify.com/v2/acts/parseforge~sportsline-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "helloWorld": 123
  }'

Examples

Input that runs as-is.

input.json
{
  "helloWorld": 123
}

Reviews

No reviews yet. Be the first.

Issues

We build and maintain this scraper, so a problem with it comes to us. Report it on the Apify listing and the thread stays attached to the scraper where the next person can find it: open an issue.

Broken and urgent, or you would rather not post in public? Write to parseforge@protonmail.com and it reaches the people who wrote it.

Related scrapers

Run SportsLine Scraper - Odds, Expert Picks & Projections on Apify All scrapers