ParseForge Scrapers

TeamRankings Scraper - Ratings, Stats & Odds

parseforge/teamrankings-scraper

OtherAIDeveloper tools

Power ratings, 1,300+ team and player stat leaderboards, betting odds, projections and situational trends for NFL, NBA, MLB, WNBA and college sports.

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

Overview

ParseForge

TeamRankings Scraper - Ratings, Stats & Odds

Scrape TeamRankings.com across NFL, NBA, MLB, WNBA and college sports. Power ratings, 1,316 team and player stat leaderboards, live betting odds, playoff projections, situational betting trends and season game logs with closing lines. Eleven datasets behind one input. No login, no API key. Export to CSV, JSON, Excel, or XML.

TeamRankings is the site handicappers open before a bet: its predictive ratings, strength-of-schedule numbers and situational ATS records have no public API. This Actor reads them straight from the pages and gives you back typed rows, including the full-precision values the site hides behind rounded display text.

Who uses it What they scrape TeamRankings for
Bettors and handicappers Predictive ratings, ATS and over/under trends by situation
Quants and modellers 1,316 stat leaderboards with home/away/last-3 splits as model features
Fantasy and DFS tools Team and player leaderboards refreshed daily
Sports media and affiliates Power rankings tables and playoff odds for weekly articles
Betting-model backtesters Season game logs carrying the closing spread, total and money line

What it does

Pick a league and a dataset; the Actor returns one row per team, player, game or study bucket. Every row carries the source URL and a scrape timestamp.

  • ๐Ÿ† Power rankings & ratings: 138 ranking pages across the six leagues: predictive, home, away, last-5, last-10, strength of schedule, luck, consistency, and performance against each rank tier.
  • ๐Ÿ“Š Team stat leaderboards: 922 stat pages, each with the season value, last 3, last 1, home, away and last season, all in one row.
  • ๐Ÿง Player stat leaderboards: 394 stat pages, top 100 players each, with team and position.
  • ๐Ÿ’ฐ Betting odds, the current board with spread (or run line), total and money line, plus implied probability, the book's hold and de-vigged fair probabilities computed for you.
  • ๐Ÿ“… Schedule: today's slate with TeamRankings' hotness score, or the full published season.
  • ๐Ÿ“‹ Standings: division by division, with home, road, division records and streak.
  • ๐Ÿ”ฎ Projections: projected win totals with playoff, division, top-seed and title odds; MLB adds per-seed probabilities.
  • ๐Ÿ“ˆ Betting trends: win, against-the-spread and over/under records across 26 situational splits, back to the 2007 season.
  • ๐Ÿ—‚๏ธ Team profiles, the full season game log carrying the closing spread, total and money line of every game played, plus power ratings and key stats.
  • ๐Ÿ•ฐ๏ธ Odds history & movement: how teams performed historically at each closing line, and what line movement did to cover rates.

Leagues covered

League Rankings Team stats Player stats Odds Projections Trends Odds history
NFL 23 226 112 Yes Standings Yes Yes
NBA 23 147 41 Yes Standings Yes Yes
MLB 21 141 100 Yes + seed odds Yes :
WNBA 23 147 41 Yes Standings Yes Yes
NCAA Basketball 24 115 33 Yes Standings Yes Yes
NCAA Football 24 146 67 Yes Standings Yes Yes

There is no NHL. teamrankings.com/nhl/ redirects to the home page, the site does not cover hockey. MLB is the only league with postseason seed projections, and the only one without the odds-history and odds-movement studies (baseball has no point spread).

Basketball and football have offseasons. Out of season a league's odds board is legitimately empty and the Actor says so in the log rather than failing.

What you can do with TeamRankings data

๐Ÿ† Pull the power rankings everyone searches for.

nfl power rankings is a 301,000-a-month search, with nba power rankings and mlb power rankings at 74,000 each. The rankings dataset returns all 32 NFL teams with the predictive rating, its high, low and last rank, and the head-to-head record against each rank tier: 23 different ranking pages for NFL alone.

๐Ÿ“… Feed the pages people actually look for.

Schedule and standings are the highest-volume queries in this space by an order of magnitude: nfl schedule runs 9.1 million searches a month, mlb standings and nfl standings 7.5 million each. Both are one request and one dataset here. nfl injury report adds another 40,500 and is one of the optional matchup blocks.

๐Ÿ•ฐ๏ธ Rebuild any day in history.

Set Historical snapshot date and rankings and team stats come back as they stood on that date. TeamRankings keeps daily snapshots going back years, so you can build a training set of "what the ratings said the morning of the game" without a paid archive.

๐Ÿ“ˆ Backtest a situational angle.

The trends dataset crosses three trend types with 26 situations: as home underdog, on no rest, after a loss, in division games, and accepts any season back to 2007. Three types by five situations is fifteen pages and one run.

๐Ÿงฎ Get closing lines for a whole season.

team-profiles returns each team's full game log with the closing spread, total and money line already attached. That is the hard half of any backtest, and no listing page on the site exposes it.

๐Ÿ’ฐ Build an odds page.

nfl odds is 135,000 searches a month at a $4.65 CPC, mlb odds 40,500, college football odds 27,100 at $2.79, and world series odds 22,200 at $5.70, the projections dataset covers that last one with title odds per team. The odds dataset is a single request for a whole league's board.

โš–๏ธ Read the vig without doing the maths.

Every odds row already carries awayImpliedProb, homeImpliedProb, moneyLineHold and the de-vigged awayFairProb / homeFairProb. Computed from prices already downloaded, so it costs no extra request and no extra event.

Why choose this scraper

What you get
Eleven datasets, one Actor Ratings, stats, players, odds, schedule, standings, projections, trends, profiles and two historical studies.
Full precision, not the rounded text The site displays 5.23 and hides 5.23485 in a sort attribute. Rows carry the precise value, but only where it is genuinely the same number (see below).
Historical snapshots Rankings and team stats accept any date; trends accept any season back to 2007.
Every column kept Named fields for the stable columns, plus a columns object holding every column of that page verbatim, so a layout that varies by stat never silently drops data.
No login or API key Every surface used here is public and anonymous.
No proxy for normal runs It ran clean from a plain datacenter IP. The proxy is off by default and only suggested for full-league sweeps.
Opt-in extras, off by default Five matchup blocks, each its own checkbox, each billed only when it returns data.
Filters that cut before billing Team, rank, value and text filters run on the complete row before any optional block is fetched.

Two traps this Actor handles for you

The sort attribute is not always the value. Stat pages hide full precision behind the rounded display text, which is worth keeping. Ranking pages do not: a rating displayed as 7.6 carries 507.591, a +500 offset used only for sorting, and a blank preseason rating carries a bare 500. Taking the attribute blindly ships 500 as if it were a rating. Rows here take the attribute only when it agrees with the displayed number, and return null when the cell is empty.

College leagues use two different slugs. Section pages live at /ncb/ and /ncf/; the stat, ranking and player-stat pages live at /ncaa-basketball/ and /college-football/. Mixing them up is not an error: /college-football/rankings/ answers HTTP 200 and quietly lands on the sport home page. The Actor follows the site's own links instead of rebuilding URLs.

How it compares

No other Apify Actor scrapes TeamRankings. We checked the Store: searches for teamrankings and power rankings return no competitor on this site. The comparison below is therefore against adjacent sports-data Actors, which cover different sources.

Feature ParseForge (this) scrapemint/sports-odds zhorex/sports-odds-aggregator ichigowa/sports-standings-api
Source TeamRankings Odds aggregators Odds aggregators Standings feeds
Power ratings & SOS Yes No No No
Stat leaderboards 1,316 team + player pages No No No
Historical date snapshots Yes No No No
Situational ATS / O-U trends 26 splits, back to 2007 No No No
Season game log with closing lines Yes No No No
Playoff / seed projections Yes No No No
De-vigged probability on odds rows Included No Paid extra No
Price per 1,000 rows $7.00 $4.00 $10.00 $0.10

Why $7 per 1,000. This Actor is HTTP-only with no browser and no proxy. Measured on the platform, its own running cost is $0.02 per 1,000 rows on the worst case, a small 10-row run, where the fixed cost of the discovery page is spread over the fewest rows, and $0.0053 per 1,000 on a 736-row run. We are not pricing on cost. The house floor is $5 and we price at $7 because the row is not a commodity odds line: it is a rating, a split-adjusted stat or a closing-line game log with no other public API. Actors below us on price scrape different, cheaper-to-get data: ichigowa/sports-standings-api at $0.10 per 1,000 sells plain standings, which is one of eleven datasets here. If standings is all you need, buy that one.

What a row looks like

Rankings (dataset: rankings)

{
  "sport": "nfl",
  "sportLabel": "NFL",
  "dataset": "rankings",
  "sourceUrl": "https://www.teamrankings.com/nfl/ranking/predictive-by-other",
  "scrapedAt": "2026-08-25T20:18:13.643Z",
  "rankingSlug": "predictive-by-other",
  "rankingName": "Predictive Rating",
  "pageTitle": "NFL Predictive Rankings & Ratings",
  "snapshotDate": null,
  "rank": 1,
  "team": "LA Rams",
  "teamSlug": "los-angeles-rams",
  "teamId": 14,
  "divisionId": 117,
  "teamRecord": "0-0",
  "rating": 7.6,
  "ratingLabel": "Rating",
  "highRank": 1,
  "lowRank": 1,
  "lastRank": 1,
  "columns": { "Rating": 7.6, "v 1-5": "0-0", "v 6-10": "0-0", "Hi": 1, "Lo": 1, "Last": 1 }
}

Team stats (dataset: team-stats) adds statSlug, statName, statCategory, and the split columns:

{
  "statSlug": "runs-per-game",
  "statName": "Runs per Game",
  "statCategory": "Team Batting",
  "rank": 1,
  "team": "Chi Cubs",
  "value": 5.23485,
  "seasonLabel": "2026",
  "last3": 10,
  "last1": 7,
  "home": 4.96923,
  "away": 5.49254,
  "prevSeasonLabel": "2025",
  "prevSeasonValue": 4.8
}

Odds (dataset: odds), the de-vig block is always included:

{
  "gameId": "patriots-seahawks-week-1-2026",
  "date": "2026-09-09",
  "startTimeLabel": "8:20 PM EST",
  "awayTeam": "New England",
  "homeTeam": "Seattle",
  "spreadLabel": "Spread",
  "awaySpread": 3.5,
  "homeSpread": -3.5,
  "total": 44.5,
  "awayMoneyLine": 157,
  "homeMoneyLine": -188,
  "awayImpliedProb": 0.3891,
  "homeImpliedProb": 0.6528,
  "moneyLineHold": 0.041883,
  "awayFairProb": 0.373463,
  "homeFairProb": 0.626537,
  "favorite": "Seattle"
}

Team profiles (dataset: team-profiles): 162 game-log entries for a full MLB season:

{
  "team": "Milwaukee Brewers",
  "standingsSummary": "1st Place, NL Central",
  "recordText": "81-50",
  "predictiveRank": 3,
  "streak": "L1",
  "gameLogCount": 162,
  "gameLog": [
    {
      "date": "03/26",
      "dateIso": "2026-03-26T18:10:00.000Z",
      "opponent": "Chi Sox",
      "result": "W 14-2",
      "location": "Home",
      "closingSpread": "-1.5",
      "closingSpreadPrice": "+114",
      "closingTotal": "Ov 7.5",
      "closingMoneyLine": "-194"
    }
  ],
  "powerRatings": [{ "rating": "Predictive", "pointsAboveAverage": 0.65 }],
  "keyStats": [{ "side": "offense", "stat": "Win % - All", "value": 0.618 }]
}

Configure the run

Setting What it does
League NFL, NBA, MLB, WNBA, NCAA Basketball, NCAA Football.
Dataset Which of the eleven surfaces to pull. Each bills its own per-row event.
Specific pages Slugs to fetch for rankings / team stats / player stats. Empty means every page the league publishes, capped by Max pages.
Stat categories Take a whole category instead: Rushing Defense, Team Pitching, Shooting. Ignored when Specific pages is set.
Historical snapshot date YYYY-MM-DD. Rebuilds rankings and team stats as of that day.
Schedule view Today's slate, or the full season.
Projection view Projected standings, or MLB postseason seed odds.
Trend types / situations / season Win, ATS and over/under across 26 situations, any season back to 2007.
Odds history / movement view Which historical study to pull. Not published for MLB.
Teams, rank, value, search Filters, applied to the full row before optional blocks are fetched.
Five matchup checkboxes Line movement, power ratings, head to head, injuries, matchup trends. Off by default.
Max items / Max pages Hard caps on rows written and pages fetched.
Concurrency 5 by default. See the throttling note below before raising it.
Proxy Off by default. Worth turning on for full-league sweeps.

About throttling

TeamRankings serves ordinary runs without complaint: measured 25 sequential and 24 concurrent requests with no rate limiting, and a full 226-page NFL stat sweep completed on Apify with no throttling at all.

It can throttle a single IP that keeps sweeping. From one workstation running repeated back-to-back sweeps we tripped an HTTP 403 that lasted minutes, not seconds. The Actor treats 403 as a throttle rather than a failure and waits it out with a long backoff, because dropping an index page would silently lose every row behind it. If it ever has to give up on a page, it says so in the run log.

Practically: leave Concurrency at 5, and if you are sweeping a whole league repeatedly on a schedule, turn the proxy on.

Pricing

Pay-per-event. You are billed per row written, plus a small charge for each source 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
Page scan $0.008 Each source page or index fetched
Ranking row $0.007 rankings
Team stat row $0.007 team-stats
Player stat row $0.007 player-stats
Game odds $0.007 odds
Schedule game $0.006 schedule
Standings row $0.006 standings
Projection row $0.012 projections
Trend row $0.008 trends
Team profile $0.015 team-profiles, one per team page with its full game log
Odds history row $0.010 odds-history
Odds movement row $0.010 odds-movement
Line movement $0.020 Checkbox on, per game: three extra requests
Matchup power ratings $0.012 Checkbox on, per game
Head to head $0.014 Checkbox on, per game
Injury report $0.010 Checkbox on, per game: not billed when both teams report no injuries
Matchup trends $0.010 Checkbox on, per game

Exactly one per-row event fires on any given run, the one for the dataset you picked.

Rows collected Approximate cost (rankings / team stats)
100 $0.79
1,000 $7.31
10,000 $72.60

The five matchup blocks are off by default. A run that leaves them off pays only the run-start fee, one page scan per page fetched, and the per-row rate for its dataset.

Free users

Apify's free plan caps what any paid Actor can bill in a month. If a run stops early with a usage message, that is the plan cap, not this Actor.

Separately, Apify gives every run a maximum cost derived from your remaining allowance, and aborts the run when it reaches it, the run's status message names the figure. A full-league sweep is large enough to hit that on a small plan. Set Max items to keep a run inside a budget you choose, and it will finish cleanly instead of being aborted.

Run it

  1. Pick a League and a Dataset.
  2. Optionally narrow with Specific pages or Stat categories, or set a Historical snapshot date.
  3. Set Max items if you want a hard ceiling on cost.
  4. Run, then export from the dataset as CSV, JSON, Excel or XML: or pull it from the API.

The default input: NFL power rankings: returns 736 rows from 23 ranking pages in about three seconds.

Troubleshooting

"No stat pages found" or an empty result. The index page was throttled. The log says so explicitly and distinguishes it from a genuinely empty page. Wait a minute, lower Concurrency, or enable the proxy.

The odds board is empty. That league is between seasons. NBA and NCAA basketball boards are empty through the summer; NFL and NCAA football through the spring. The log says so explicitly.

A ranking's rating is null. The season has not started, so TeamRankings has not published that rating yet. The row still carries the team, its rank and its record. This is the site's state, not a parse failure: see the note on sort attributes above.

odds-history or odds-movement returned nothing for MLB. Those studies are built on the point spread and TeamRankings does not publish them for baseball. The log warns and the run ends cleanly.

Postseason seeds came back as projected standings. Only MLB publishes seed projections. For any other league the Actor falls back to projected standings and warns.

A slug came back missing. Slugs differ by league: NFL has points-per-game, MLB has runs-per-game. The log lists which requested slugs that league does not publish. Leave Specific pages empty to see everything available.

FAQ

Does it need a login or an API key? No. Every surface used here is public and anonymous.

Does it need a proxy? No. A full 226-page sweep ran clean on Apify without one. Turn it on only if you are sweeping a whole league repeatedly from the same IP.

How far back does the history go? Rankings and team stats accept any date the site has a snapshot for, which is years. Trends accept any season back to 2007. Head-to-head histories start at 2007.

Why is there no NHL? TeamRankings does not cover hockey; the URL redirects to the home page.

Can I get every stat for a league in one run? Yes: leave Specific pages empty and raise Max pages to the league's count (226 for NFL). That run returned 7,232 rows. Watch your Max items on a sweep that size so the run finishes rather than hitting the per-run cost cap.

Is the data live? Odds are the current board as TeamRankings publishes it. Ratings and stats update daily.

Related actors

Input

FieldTypeWhat it doesDefault
sport required string (6 options) Which league to scrape. TeamRankings publishes NFL, NBA, MLB, WNBA, NCAA basketball and NCAA football. There is no NHL section: teamrankings.com/nhl/ redirects to the home page. nfl
dataset required string (11 options) Which surface to pull. Each dataset bills its own per-row event, so you only pay for the one you ask for. Rankings and team stats accept a historical date; odds and schedule accept the matchup enrichment blocks below. rankings
slugs array Page slugs to pull for rankings / team stats / player stats, e.g. "predictive-by-other" or "points-per-game". Leave empty to take every page the league publishes, up to Max pages. A slug that does not exist is reported in the log rather than failing the run. not set
categories array Alternative to Specific pages: take every stat in these categories. NFL/NCF use "Scoring Offense", "Rushing Defense", "Turnovers"โ€ฆ NBA/WNBA/NCB use "Scoring", "Shooting", "Rebounding"โ€ฆ MLB uses "Team Batting", "Team Pitching"โ€ฆ Ignored when Specific pages is set. Rankings have no categories. not set
date string YYYY-MM-DD. Rankings and team stats are rebuilt as they stood on that date: TeamRankings keeps daily snapshots going back years. Leave empty for today. not set
scheduleView string (2 options) Daily returns today's slate with the site's hotness score; Season returns the full published schedule (2,430 games for MLB, 272 for NFL). daily
projectionView string (2 options) Projected standings gives projected win totals plus playoff, division, top-seed and title odds. Postseason seeds gives per-seed probabilities and is published for MLB only. standings
trendTypes array Which trend tables to pull: straight-up win records, against-the-spread records, or over/under records. ["win"]
trendSituations array Situational split for each trend table. Every combination of type x situation is one page, so 3 types x 5 situations is 15 pages. ["all_games"]
trendSeason string Four-digit season for the trends dataset, e.g. 2019. TeamRankings keeps trends back to 2007. Leave empty for the current season. not set
oddsHistoryView string (5 options) Which historical study to pull. Not published for MLB. results
oddsMovementView string (6 options) Which line-movement study to pull. Not published for MLB. ats-movement
teams array Keep only rows whose team name or slug contains one of these, case-insensitive. Matches either side of a game for the odds and schedule datasets. not set
minRank integer Keep only rows ranked at or below this number (1 is best). not set
maxRank integer Keep only rows ranked at or above this number. Set 10 to keep the top ten. not set
minValue number Keep rows whose headline value (the stat value, or the rating on rankings) is at least this. Decimals are supported. not set
maxValue number Keep rows whose headline value is at most this. Decimals are supported. not set
search string Keep only rows containing this text anywhere, case-insensitive. Useful for a player name or a venue. not set
includeLineMovement boolean For odds and schedule rows: open / high / low / current for the spread, money line and total, plus the per-book history table. Three extra requests per game. Billed as line-movement. false
includePowerRatings boolean Both teams' eleven power ratings side by side with their league ranks and the resulting edge. One extra request per game. Billed as matchup-power-ratings. false
includeHeadToHead boolean Every prior meeting since 2007 with score, who covered and the over/under result. One extra request per game. Billed as head-to-head. false
includeInjuries boolean Player, position, injury, status and the written detail for both teams. One extra request per game. Not billed when both teams report no injuries. Billed as injury-report. false
includeMatchupTrends boolean The situational records TeamRankings shows on the matchup trends tab. One extra request per game. Billed as matchup-trends. false
maxItems integer Hard cap on rows written, and therefore on what the run can bill. Leave empty for no cap. not set
maxPages integer Cap on how many leaf pages a run fetches (stat pages, ranking pages, trend combinations, team pages). Guards against asking for all 226 NFL stat pages by accident. 40
concurrency integer Parallel requests. 5 is safe for any run, a full 226-page sweep completed on Apify with no throttling. TeamRankings can throttle a single IP that sweeps repeatedly; the run waits that out rather than dropping pages. 5
timeoutSecs integer Stop issuing requests after this long and flush what has been collected. The run also respects the platform timeout when that is nearer. 1500
proxyConfiguration object Optional and off by default, and normally unnecessary: a full 226-page NFL stat sweep ran clean from an Apify container without one. Turn it on if you sweep a whole league repeatedly from the same IP, which can trip a multi-minute HTTP 403. {"useApifyProxy":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
Source page scanned One TeamRankings page or index fetched and parsed. This is the fixed cost of discovery and paging, shared across every row that page yields. $0.008
Power ranking row One team on one ranking page: rank, rating with its label, high, low and last rank, record, team and division ids, plus every column of that ranking verbatim. $0.007
Team stat row One team on one stat leaderboard, with the season value at full precision plus the last-3, last-1, home, away and previous-season splits. $0.007
Player stat row One player on one leaderboard with rank, value, team and position. $0.007
Game with odds One game from the current board: spread or run line with prices, total, both money lines, plus implied probabilities, the book hold and de-vigged fair probabilities. $0.007
Scheduled game One scheduled game with both teams, start time, venue, poll ranks and TeamRankings' hotness score. $0.006
Standings row One team in the standings with overall, division, home and road records, win percentage, games back and current streak. $0.006
Projection row One team's projected win total with playoff, division-win, top-seed and title odds. For MLB, per-seed probabilities as well. $0.012
Betting trend row One team's record for one situational split: home underdog, after a loss, on no rest: for any season back to 2007. $0.008
Team profile One team page: the full season game log carrying the closing spread, total and money line of every game played, plus power ratings and key offensive and defensive stats. $0.015
Odds history row One closing-line bucket with its historical game count, win record, cover record and average margin. $0.01
Odds movement row One line-movement bucket with how favourites and totals performed after that move. $0.01
Line movement Optional. Open, high, low and current for the spread, money line and total on one game, plus the per-book history table. Three extra requests per game. $0.02
Matchup power ratings Optional. Both teams' eleven power ratings side by side with league ranks and the resulting edge. $0.012
Head to head history Optional. Every prior meeting since 2007 with score, who covered and the over/under result. $0.014
Injury report Optional. Player, position, injury, status and the written detail for both teams. Not charged when both teams report no injuries. $0.01
Matchup trends Optional. The situational records TeamRankings shows on the matchup trends tab for both sides. $0.01

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~teamrankings-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 TeamRankings Scraper - Ratings, Stats & Odds on Apify All scrapers