ParseForge Scrapers

TheLines Scraper - NFL & NBA Odds, Player Props

parseforge/thelines-scraper

AIDeveloper toolsOther

Scrape TheLines.com for NFL and NBA odds, NBA player props with the best sportsbook and price, Super Bowl and MVP futures boards, sportsbook promo codes and betting news. No proxy or login needed.

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

Overview

ParseForge

TheLines Scraper - NFL & NBA Odds, Player Props

Scrape NFL odds, NBA odds and NBA player props from TheLines.com: no login, no API key, no proxy. Every matchup preview comes back as one row with the moneyline, spread and total plus the sportsbook quoting each number, and optional blocks for player usage, rest and travel, form, season profile, injuries, quarter splits and head-to-head history. Player-prop pages return every priced over and under for tonight's slate with its line, its best book and its price. Super Bowl, NBA MVP, division and award futures come from 334 odds boards. Export to CSV, JSON, Excel, or XML.

TheLines publishes something most odds sites keep behind a widget: static, server-rendered pages with the numbers already in the HTML. This reads them directly. Measured live, an NBA prop page carries 152 priced props on average across six markets from up to ten sportsbooks, and 50 matchup pages fetch and parse in 3.4 seconds over plain HTTP.

Who uses it What they scrape TheLines for
Bettors and handicappers Prop lines with the best book already named, and TheLines' own highlighted picks
Odds-comparison sites Futures boards across 334 pages: Super Bowl, NBA MVP, divisions, majors, World Cup
Quants and modellers Usage%, pace, ratings, rest, travel miles and ATS records as model inputs
Affiliate and media teams Sportsbook promo codes, welcome offers, wagering terms and eligible states
Content and SEO teams 3,000+ betting articles with author, publish date, categories and full text

What it does

This Actor reads six different parts of TheLines and returns each page as a structured row.

  • ๐Ÿ€ Matchup previews (NBA + NFL). Teams, tip-off time, broadcaster, and the moneyline, spread and total with the book quoting each side. Every price is restated as American odds, decimal odds, implied probability and profit per $100, and each row carries a computed hold, no-vig probability and favourite.
  • ๐ŸŽฏ Player props (NBA). Every over and under on the page with its line, the best book, the price, and whether TheLines highlighted it as its own pick. Six markets: points, rebounds, assists, 3-pointers made, points + assists, and points + rebounds + assists.
  • ๐Ÿ† Futures and award boards. 334 pages: Super Bowl odds, NBA MVP odds, division winners, Cy Young, the golf majors, March Madness, the World Cup, horse racing and elections: read table by table, with the price as printed kept alongside the parsed number.
  • ๐Ÿ’ธ Sportsbook reviews. Bonus code, welcome offer, offer type, wagering requirement, eligible states, minimum deposit and last-verified date, plus the comparison card of rival offers.
  • ๐Ÿ“ฐ Articles. 5,005 betting posts. Headline, author, publish and update dates, word count, categories, breadcrumbs and optionally the full body as Markdown.
  • ๐Ÿ—‚๏ธ Category archives. Which posts a section currently lists, with titles and URLs.

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

What is actually on the site

Scraping is only worth what the source publishes, so here is the measured inventory rather than a promise:

Dataset Pages available What each row carries
Matchup previews 192 NBA + 7 NFL Game lines, records, and up to 7 optional stat blocks
Player props 165 NBA + 7 NFL 152 priced props per game on average (NBA)
Futures and award boards 334 pages under /odds/ Futures, award races and historical results
Sportsbook reviews 544 pages Bonus terms where the page publishes a facts box
Articles 5,005 posts Full metadata, optional full text
Category archives 116 sections The posts each section lists

Two limits worth knowing before you run it:

  • NFL player-prop pages carry no priced props. All seven publish injury reports, quarterback and backfield stat comparisons and the game's moneyline, but no prop board. Priced props are NBA-only. The Actor returns the NFL pages' stat and injury content rather than pretending otherwise.
  • Matchup pages do not all carry every block. Across 30 live pages, trends appeared on 28, usage leaders on 21, head-to-head on 21, injuries on 19, season profile on 17, rest and travel on 15 and quarter splits on 14. Optional blocks are billed only on rows that actually carry them, so turning one on costs nothing when a page does not publish it.

What you can do with it

๐ŸŽฏ Shop prop lines with the book already named.

Every prop row names the sportsbook offering that price. Filter by bookmakers to see only the books you hold an account with, or sort by impliedProbability to find the shortest prices on the slate.

โญ Follow the site's own picks.

TheLines highlights rows on its prop tables where it likes the number: about 23 per game page. Set onlyHighlightedPicks to return only those.

๐Ÿงฎ Measure the vig on a game.

Each matchup row carries bettingLines.analytics with the moneyline hold, both sides' no-vig probability and which side is favoured, computed from the two prices on the page.

๐Ÿ“ Feed a model.

Turn on the stat blocks and each matchup row carries pace, offensive and defensive rating, net rating, turnovers, rebounding rates, travel miles since the last game, days of rest, schedule strength and last-5 ATS and over/under records.

๐Ÿ’ธ Track sportsbook offers.

The reviews dataset returns bonus codes, welcome offers, wagering requirements and the state list for each brand, with a lastVerified stamp, across sportsbooks, casinos, sweepstakes and prediction markets.

Why choose this scraper

  • No proxy, no browser, no login. TheLines serves every page anonymously over plain HTTP. Measured at 50 pages across 12 sockets with no challenge, no rate limit and no blocking. That keeps runs fast and cheap, and it is why the price below is what it is.
  • Nothing is thrown away. Turn on includeRawTables and every table on the page comes back with its headers, rows and section heading, so a block the typed fields do not cover is still in your dataset.
  • Prices restated four ways. American, decimal, implied probability and profit per $100 on every quote, so you never convert by hand.
  • Honest about gaps. Where a page prices only one side of a market, the row shows that side and leaves the other null with the book still named: rather than dropping the market.
  • The item cap is exact. Ask for 37 rows and you get 37, even with 16 pages parsing in parallel and 154 props on each.

How it compares

This Actor Widget-based odds scrapers Manual copy-paste
Proxy needed No Usually yes :
Browser needed No Usually yes :
Props per game Up to 214 Varies A few
Book named per price Yes Sometimes Yes
Team stat blocks 7 optional No No
Futures and award boards 334 pages No No
Bonus/promo data Yes No Yes

What a matchup row looks like

{
  "dataset": "matchup",
  "url": "https://www.thelines.com/nba/match-ups/04-01-2026-phi-at-was/",
  "sport": "nba",
  "gameDate": "2026-04-01",
  "gameSlug": "04-01-2026-phi-at-was",
  "headline": "Philadelphia 76ers @ Washington Wizards Picks and Predictions - April 1st 2026",
  "away": { "abbr": "PHI", "name": "76ers" },
  "home": { "abbr": "WAS", "name": "Wizards" },
  "gameDateText": "Wednesday, April 1, 2026",
  "startTimeText": "7:00 PM ET",
  "broadcast": "NBCS",
  "bettingLines": {
    "moneyline": {
      "away": { "american": null, "decimal": null, "impliedProbability": null, "payoutPer100": null, "bookmaker": "Sportzino" },
      "home": { "american": 690, "decimal": 7.9, "impliedProbability": 12.658, "payoutPer100": 690, "bookmaker": "Sportzino" }
    },
    "spread": {
      "away": { "american": -111, "decimal": 1.9009, "impliedProbability": 52.607, "payoutPer100": 90.09, "bookmaker": "Sportzino", "points": 14 },
      "home": { "american": -110, "decimal": 1.9091, "impliedProbability": 52.381, "payoutPer100": 90.91, "bookmaker": "Betr", "points": -14 }
    },
    "total": {
      "points": 238.5,
      "over": { "american": -110, "decimal": 1.9091, "impliedProbability": 52.381, "payoutPer100": 90.91, "bookmaker": "Sportzino" },
      "under": { "american": null, "decimal": null, "impliedProbability": null, "payoutPer100": null, "bookmaker": "Onyx Odds" }
    },
    "analytics": {
      "moneylineHoldPct": null,
      "fairProbabilityAway": null,
      "fairProbabilityHome": null,
      "spreadHoldPct": 4.988,
      "totalHoldPct": null,
      "favorite": "home"
    }
  },
  "author": "Nick Crain",
  "datePublished": "2026-04-01T11:57:52.000Z",
  "scrapedAt": "2026-08-25T20:15:09.143Z"
}

With the optional blocks on, the same row also carries:

{
  "playerStats": [
    { "Team": "Philadelphia 76ers", "Player": "Joel Embiid", "Min": "32", "Usage%": "33.7", "PPG": "26.9", "RPG": "7.7", "APG": "3.9", "TS%": "60.5", "eFG%": "52.7", "+/-": "4.1", "TO/G": "2.9" }
  ],
  "restAndTravel": {
    "Days since last game": { "away": "2", "home": "2" },
    "Travel miles since last game": { "away": "924.8", "home": "2296.5" },
    "Schedule strength": { "away": "52.2", "home": "36.5" }
  },
  "seasonProfile": {
    "Tempo, Ratings & Turnovers": {
      "Pace": { "away": "102.3", "home": "104" },
      "Net Rating": { "away": "0.5", "home": "-11.4" },
      "Offensive Rating": { "away": "112.5", "home": "108.2" },
      "Defensive Rating": { "away": "112", "home": "119.6" }
    }
  },
  "trends": [ { "section": "Quick Trends", "headers": ["Metric", "76ers", "Wizards"], "rows": [ { "Metric": "ATS record", "76ers": "3-2-0", "Wizards": "2-3-0" } ] } ],
  "headToHead": [ { "headers": ["Item", "Value"], "rows": [ { "Item": "Last meeting score", "Value": "122-103" } ] } ]
}

What a player-prop row looks like

With flattenPlayerProps on, each over and under is its own row:

{
  "dataset": "playerProp",
  "url": "https://www.thelines.com/nba/player-props/04-01-2026-phi-at-was/",
  "sport": "nba",
  "gameDate": "2026-04-01",
  "away": { "abbr": "PHI", "name": "Philadelphia 76ers" },
  "home": { "abbr": "WAS", "name": "Washington Wizards" },
  "player": "Tyrese Maxey",
  "teamAbbr": "PHI",
  "market": "assists",
  "marketSection": "76ers at Wizards Player Assists Props Picks",
  "line": 6.5,
  "side": "over",
  "bookmaker": "Caesars",
  "american": 128,
  "decimal": 2.28,
  "impliedProbability": 43.86,
  "payoutPer100": 128,
  "isHighlightedPick": false,
  "scrapedAt": "2026-08-25T20:22:41.008Z"
}

Leave flattenPlayerProps off and you get one row per game with every prop nested under it: far cheaper when you want the whole slate.

Configure the run

Input What it does
datasets Which parts of the site to collect: matchups, playerProps, oddsPages, articles, reviews, categories. Selecting several interleaves them so each is represented.
startUrls Scrape exact URLs instead of discovering from the sitemaps. The page type is detected from the URL.
maxItems Hard cap on rows. Exact, even under concurrency.
sports nba, nfl, or both.
dateFrom / dateTo Filter games by date, read from the URL so no page is fetched to check it.
teams Team abbreviations as they appear in the URL: PHI, WAS, SEA, NE.
propMarkets The six markets TheLines publishes: points, rebounds, assists, 3PM, points + assists, and points + rebounds + assists.
bookmakers Keep only props whose best price comes from these books.
minOdds / maxOdds Filter props by American price.
minPropLine / maxPropLine Filter props by line.
onlyHighlightedPicks Keep only the rows TheLines highlights as its own pick.
flattenPlayerProps One row per prop instead of one row per game.
oddsSections Limit odds boards by URL section: nfl, nba, mlb, golf, world-cup, march-madness, horse-racing, election.
flattenOddsTables One row per selection on an odds board.
reviewSections betting, casino, prediction-markets, sportsbooks.
publishedAfter / publishedBefore / authors / titleContains Article filters.
locales US, UK or Canadian edition. Matchup and prop pages exist only on the US edition.
include* The optional blocks, each billed only on rows that carry it.
sortBy Order rows before writing. Buffers the result set, so it is slower than the default stream.
maxConcurrency Pages in flight. TheLines serves 12 without throttling.

Pricing

Pay per event. You are charged for the rows you receive, plus any optional block a row actually carries.

Event Price What it is
Actor start $0.03 Once per run, and it covers finding the pages the run needs
Matchup preview $0.007 One game with its lines and records
Player props, one row per game $0.02 Every prop on the page nested in one row
Player prop line $0.002 One over or under, when flattened
Odds board $0.01 One futures page with its selections nested
Odds board selection $0.003 One team, player or entrant, when flattened
Sportsbook review $0.006 One review with its bonus terms
Article $0.004 One post with its metadata
Category archive $0.004 One section listing
Player stats block $0.003 Optional
Season profile block $0.003 Optional
Trends block $0.003 Optional
Rest and travel block $0.003 Optional
Head-to-head block $0.003 Optional
Injury block $0.003 Optional
Quarter splits block $0.003 Optional
Written analysis block $0.003 Optional
Competing promo offers $0.002 Optional
Full article text $0.002 Optional
Raw tables $0.002 Optional

A 100-game matchup run with no extras costs $0.73. The same run with every optional block turned on costs $2.38: pages carry 4.5 blocks each on average, so you are not billed for seven.

The whole NBA prop slate: 165 game pages holding roughly 25,000 individual prop lines: costs $3.33 nested one row per game, or $50.19 flattened to one row per line. Nested is the cheap way to take the slate; flatten when you want each line as its own record.

Free users

Free Apify accounts cannot be charged, so a free run returns a 10-row preview. Everything else is identical. Upgrade to lift the cap.

Run it

  1. Pick your datasets: start with Matchup previews.
  2. Set maxItems.
  3. Turn on the optional blocks you want.
  4. Run, then export from the Dataset tab or pull from the API.

The default input is a live health check: it returns 50 NBA matchup rows in about 35 seconds on the platform.

Use with AI agents (MCP)

The Actor is callable over Apify's MCP server, so an agent can request odds directly:

https://mcp.apify.com/?actors=parseforge/thelines-scraper

Ask it for "NBA player props today where FanDuel has the best price over +150" and it will map that onto datasets, flattenPlayerProps, bookmakers and minOdds.

Troubleshooting

No rows came back. Check the dataset selection. Matchup and prop pages exist for NBA and NFL only, and only on the US edition, a run filtered to locales: ["uk"] with datasets: ["matchups"] has nothing to find.

A prop market is missing. TheLines publishes six prop markets for NBA and none for NFL. If marketsFound is empty on an NFL prop page, that is the page, not the scraper: those pages carry injuries and stat comparisons instead.

Moneyline is null on one side. The page priced only one side. The row keeps the side that exists and names the book on the empty side, rather than dropping the market.

A review has no bonus code. Most review pages are prose with no facts box. headline, author, brandSlug, vertical and the page content fill on every review; the bonus fields fill where the page publishes them.

The run stopped early. The Actor stops before the run timeout so the dataset is written cleanly. Raise the timeout or lower maxItems.

FAQ

Do I need a proxy? No. TheLines serves everything anonymously.

Is it blocked? No challenge or rate limit was observed at 12 concurrent requests.

How fresh is the data? Each row carries scrapedAt, and matchup and article rows carry the page's own datePublished and dateModified.

Can I scrape one game? Yes: put its URL in startUrls.

What about the UK and Canadian sites? Set locales. Those editions carry articles, reviews and category pages; matchups and props are US-only.

Related actors

Input

FieldTypeWhat it doesDefault
datasets array Which parts of TheLines to collect. Matchups and player props carry the odds; odds boards carry futures; reviews carry sportsbook bonuses. ["matchups"]
startUrls array Scrape these exact TheLines URLs instead of discovering pages from the sitemaps. The page type is detected from the URL. not set
maxItems integer Stop after this many dataset rows. Free Apify accounts are capped at 10 rows. 50
sports array Limit matchups and player props to these leagues. TheLines only publishes structured matchup pages for NBA and NFL. not set
dateFrom string Keep only games played on or after this date (YYYY-MM-DD). Read from the game URL, so no page is fetched to check it. not set
dateTo string Keep only games played on or before this date (YYYY-MM-DD). not set
teams array Keep only games involving these teams, by the abbreviation in the URL: for example PHI, WAS, SEA, NE. not set
propMarkets array Keep only these player-prop markets. These six are the markets TheLines publishes on NBA prop pages; leave empty for all of them. not set
bookmakers array Keep only props whose best price comes from these books: FanDuel, DraftKings, BetMGM, Caesars, BetRivers, Fanatics, SugarHouse and others. not set
minOdds integer Drop props priced below this. Use -150 to exclude heavy favourites. not set
maxOdds integer Drop props priced above this. Use 200 to exclude long shots. not set
minPropLine number Drop props whose line is below this number. not set
maxPropLine number Drop props whose line is above this number. not set
onlyHighlightedPicks boolean Keep only the prop rows TheLines highlights on the page as its own pick. false
flattenPlayerProps boolean Write each over and under as its own row instead of nesting every prop inside one row per game. Charged per prop row. false
oddsSections array Limit odds boards to these URL sections: nfl, nba, mlb, nhl, golf, world-cup, march-madness, horse-racing, election, ncaa-basketball and more. not set
flattenOddsTables boolean Write each team, player or entrant on an odds board as its own row instead of nesting the whole board in one row. false
reviewSections array Limit reviews to these verticals. not set
categorySlugs array Limit category archives to URLs containing these fragments: for example nfl, college-football, states/ohio. not set
publishedAfter string Keep only articles published on or after this date (YYYY-MM-DD). not set
publishedBefore string Keep only articles published on or before this date (YYYY-MM-DD). not set
authors array Keep only articles by these authors, matched exactly against the byline. not set
titleContains array Keep only pages whose headline or category contains one of these phrases. not set
locales array TheLines publishes a US, UK and Canadian edition. Matchup and player-prop pages exist only on the US edition. ["us"]
includePlayerStats boolean Usage%, minutes, scoring and shooting splits for the featured players. Charged per row that carries the block. false
includeTeamStats boolean Record, scoring, efficiency, tempo, ratings, turnovers and rebounding for both teams. false
includeTrends boolean Last-5 and last-10 form, ATS records and over/under records. false
includeRestTravel boolean Days since last game, back-to-backs, travel miles, time-zone changes and schedule strength. false
includeHeadToHead boolean Previous meetings, last result, average margin and the series ATS record. false
includeInjuries boolean Ruled out, questionable, practice participation and the rotation minutes at stake. false
includeQuarterSplits boolean Scoring by quarter and by half for both teams. false
includeAnalysis boolean TheLines' own preview prose, picks and betting takeaways for the game. false
includePromoOffers boolean On review pages, the comparison table of rival sportsbook bonuses. false
includeArticleContent boolean The complete body text of articles and reviews as Markdown. false
includeRawTables boolean Every table on the page exactly as published, with its headers, rows and section heading. Use this when a page carries something the typed fields do not cover. false
sortBy string (9 options) Order rows before writing them. Sorting buffers the whole result set, so it is slower than the default stream. none
maxConcurrency integer How many pages to fetch at once. TheLines serves 12 in parallel without throttling. 10
requestTimeoutSecs integer How long to wait for one page before retrying it. 30
maxRequestRetries integer How many times to retry a failed page. Retries are also bounded by the run timeout, so a slow upstream cannot consume the whole run. 2

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.03
Matchup preview One NBA or NFL game with its moneyline, spread, total, book attribution, hold and no-vig probabilities. $0.007
Player props, nested per game One game with every priced prop on the page nested inside it: around 152 props on an NBA slate. $0.02
Player prop line One over or under with its line, best bookmaker and price. Only charged when props are flattened. $0.002
Odds board One futures or award page with every selection nested inside it. $0.01
Odds board selection One team, player or entrant with its price. Only charged when odds boards are flattened. $0.003
Sportsbook review One review with its bonus code, welcome offer, wagering terms and eligible states. $0.006
Article One betting post with headline, author, dates, word count and categories. $0.004
Category archive One section listing with the posts it currently surfaces. $0.004
Player stats block Optional. Usage%, minutes, scoring and shooting splits for the featured players. Charged only on rows that carry it. $0.003
Season profile block Optional. Record, scoring, efficiency, tempo, ratings, turnovers and rebounding for both teams. $0.003
Trends and form block Optional. Last-5 and last-10 form, ATS records and over/under records. $0.003
Rest and travel block Optional. Days of rest, back-to-backs, travel miles, time-zone changes and schedule strength. $0.003
Head-to-head block Optional. Previous meetings, last result, average margin and the series ATS record. $0.003
Injury report block Optional. Ruled out, questionable, practice participation and the rotation minutes at stake. $0.003
Quarter splits block Optional. Scoring by quarter and by half for both teams. $0.003
Written analysis block Optional. TheLines' own preview prose, picks and betting takeaways. $0.003
Competing promo offers Optional. The comparison card of rival sportsbook bonuses on a review page. $0.002
Full article text Optional. The complete body of an article or review as Markdown. $0.002
Raw tables Optional. Every table on the page with its headers, rows and section heading. $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~thelines-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 TheLines Scraper - NFL & NBA Odds, Player Props on Apify All scrapers