
Website Content Crawler
scrape.ly/store/querystone/website-content-crawlerAIDeveloper tools
1 monthly user

Scrape football, basketball, tennis and 6 more sports: scores, fixtures, full seasons, match stats with xG, lineups, player box scores, player profiles, standings, transfers, Bet365 odds and betting trends. Names instead of IDs. No login.
Get scores, fixtures, full seasons, match stats with xG, lineups, player box scores, player profiles, standings, transfers, Bet365 odds and betting trends for football, basketball, tennis and 6 more sports. Type a league, team or player name and get clean rows back in seconds. No login, no API key, no browser.
premier-league, Real Madrid or Haaland; the scraper finds the right competition, team or player.premier-league, nba), Game IDs, Teams, Players or Search query.| Field | Used by | Example |
|---|---|---|
action | all | scores, fixtures, gameDetail, boxScores, teamGames, odds, trends, standings, playerProfile, playerGames, squadStats, teamStats, transfers, search, competitions |
competitions | scores, fixtures, standings, odds, trends, transfers, stats | ["premier-league", "laliga", "nba"] or IDs like 7 |
gameIds | gameDetail, boxScores, odds, trends | ["4742036"] (the gameId of a scores row) |
teams | teamGames, squadStats, teamStats, transfers | ["Real Madrid"] |
players | playerProfile, playerGames | ["Haaland", "Mbappe"] |
searchQuery | search | Barcelona |
maxResults | all | 20 (0 = no limit) |
gameStatus | game lists | finished, upcoming, live, all |
season | fixtures, standings | Current season, Last season, 2 seasons ago |
startDateFrom / startDateTo | game lists | 2026-10-01 / 2026-10-20 |
includeOdds | scores, fixtures, teamGames | true |
statTypes | squadStats, teamStats | ["Goals", "Expected Goals (xG)"] |
language | all | English, Deutsch, Español, ... |
{
"action": "scores",
"competitions": ["premier-league", "bundesliga"],
"startDateFrom": "2026-10-01",
"startDateTo": "2026-10-20",
"includeOdds": true,
"maxResults": 50
}
More examples:
{"action": "fixtures", "competitions": ["premier-league"], "season": "Last season", "maxResults": 0}{"action": "gameDetail", "gameIds": ["4742036"]}{"action": "boxScores", "competitions": ["nba"], "maxResults": 300}{"action": "squadStats", "teams": ["Real Madrid"], "competitions": ["laliga"], "statTypes": ["Goals", "Assists", "Expected Goals (xG)"]}{"action": "odds", "competitions": ["premier-league", "champions-league"]}Each action writes its own row type; the dataset has a view for each.
| Action | One row per | Key fields |
|---|---|---|
| scores, fixtures, teamGames, odds | game | gameId, startTime, competition, homeTeam, awayTeam, homeScore, awayScore, status, result, round, team IDs, codes and logos, odds, webUrl |
| gameDetail | game | everything above plus periodScores, half-time score, events, lineups (formation, players, ratings, per-player stats), statistics, missingPlayers, coaches, officials, topPerformers, venue |
| boxScores | player in a game | player, teamName, group (starter or bench), position, stats (minutes, points, rebounds, goals, shots, passes, ...) |
| playerProfile | player | age, birthdate, nationality, club, position, height, preferredFoot, contractUntil, seasonStats, careerStats, transfers, trophies |
| playerGames | player in a game | teams, score, played, didNotPlayReason, stats |
| squadStats / teamStats | player / stat rank | stat values and ranks per category (goals, xG, assists, rating, ...) |
| standings | team | position, played, won, drawn, lost, goalsFor, goalsAgainst, points, recentForm |
| transfers | transfer | playerName, origin, target, type, price, priceValue, priceCurrency, status, time |
| trends | trend | text, recommendation, percentage, Bet365 odds and opening odds |
| search, competitions | entity | type, name, id, sport, country, popularityRank |
Example scores row with includeOdds (from a test run):
{
"gameId": 4742032,
"sportType": "Football",
"competition": "Premier League",
"competitionId": 7,
"country": "England",
"season": 132,
"round": 7,
"startTime": "2026-10-19T19:00:00Z",
"status": "finished",
"homeTeam": "Tottenham",
"homeTeamId": 114,
"homeTeamCode": "TOT",
"awayTeam": "Coventry",
"awayTeamId": 24,
"awayTeamCode": "COV",
"homeScore": 3,
"awayScore": 1,
"result": "home",
"odds": {
"bookmaker": "Bet365",
"market": "Full Time Result",
"settled": true,
"homeWinOdds": 1.53, "homeWinFractional": "8/15", "homeWinAmerican": "-189", "homeWinOpeningOdds": 1.5, "homeWinWon": true,
"drawOdds": 4.5, "drawFractional": "7/2", "drawAmerican": "+350", "drawOpeningOdds": 4.33,
"awayWinOdds": 5.5
},
"webUrl": "https://www.365scores.com/football/match/premier-league-7/coventry-tottenham-24-114-7#id=4742032"
}
Example boxScores row:
{
"gameId": 4808909,
"competition": "NBA",
"homeTeam": "San Antonio Spurs",
"awayTeam": "Oklahoma City Thunder",
"homeScore": 104,
"awayScore": 116,
"teamName": "San Antonio Spurs",
"player": "Victor Wembanyama",
"group": "Starters",
"position": "Center",
"stats": {"Minutes": "34:09", "Points": 12, "Rebounds": 13, "Assists": 3, "Blocks": 6, "Field Goals": "1/13", "Free Throws": "10/12", "Plus/Minus": -2}
}
$2.50 per 1,000 results ($0.0025 per row), plus a small amount of platform usage (compute and datacenter proxy traffic, usually well under $0.001 per run).
Invalid input and empty results are not charged. Set a maximum charge per run and the scraper stops cleanly when it is reached.
Is it legal to scrape this data? The scraper reads public sports data that anyone can see without an account. You are responsible for how you use it; check the terms that apply to you, especially before republishing odds.
Do I need a login, API key or proxy? No login and no key. Datacenter proxies are on by default and work well.
How many results can I get?
Set maxResults to 0 for everything: a whole season of fixtures, every competition of a sport, or all past results the source keeps (about two years: the current and last season in full).
Why is a field empty?
The source does not publish every field for every game or sport (for example xG for lower leagues, or a venue for some fixtures). Missing values are null; nothing is invented.
Where do game IDs come from?
From the gameId field of scores, fixtures, teamGames or odds rows. You can also paste a 365Scores match URL.
Can I schedule it or use the API? Yes. Save an input as a task, schedule it (for example every morning for yesterday's box scores), and read results through the API or webhooks.
trends returns today's top betting trends instead.Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
actionenumRequireddefault "scores"What to scrape
Pick the data you want. Each action uses only the fields it needs (shown in each field's help). Matches: scores, fixtures, gameDetail, boxScores, teamGames, odds, trends Players: playerProfile, playerGames, squadStats, teamStats Leagues: standings, competitions, search, transfers
competitionsarrayOptionalCompetitions
Competition slugs, names or numeric IDs, e.g. premier-league, laliga, bundesliga, serie-a, champions-league, nba or 7. Run the competitions action to browse every league. Used by: scores, fixtures, standings, odds, trends, transfers, squadStats, teamStats, gameDetail and boxScores (when no game IDs are given).
gameIdsarrayOptionalGame IDs
Numeric game IDs (the gameId field of scores or fixtures rows) or 365Scores match URLs. Used by: gameDetail, boxScores, odds (every market) and trends.
teamsarrayOptionalTeams
Team names or numeric IDs, e.g. Real Madrid, Arsenal, Boston Celtics or 131. Names are matched to the best-known team (football first unless you pick a sport). Used by: teamGames, squadStats, teamStats, transfers.
playersarrayOptionalPlayers
Player names or numeric IDs, e.g. Haaland, Mbappe, LeBron James or 65760. Used by: playerProfile, playerGames.
searchQuerystringOptionalSearch query
Name to look up across teams, players and competitions, e.g. Barcelona. Used by: search.
maxResultsintegerOptionaldefault 20Max results
Stop after this many rows. 0 means no limit (a full season, a whole catalog).
Narrow games by status, season or date window.
gameStatusenumOptionalGame status
Which games to return. Default: finished games for scores, teamGames, gameDetail and boxScores; upcoming games for odds; every game for fixtures and date windows.
seasonenumOptionaldefault "Current season"Season
Season for fixtures and standings. Football leagues usually have many past seasons.
startDateFromstringOptionalDate from
Only games on or after this date (YYYY-MM-DD). With only one date set, a 14-day window is used. Used by scores, teamGames, odds, fixtures, gameDetail and boxScores.
startDateTostringOptionalDate to
Only games on or before this date (YYYY-MM-DD).
statTypesarrayOptionalStat types
Stats to keep for squadStats and teamStats, e.g. Goals, Assists, Expected Goals (xG), Rating, Clean Sheets. Empty = every stat the feed publishes.
includeOddsbooleanOptionaldefault falseAdd Bet365 odds to games
Attach the Bet365 1X2 (or moneyline) odds with opening prices to every scores, fixtures and teamGames row.
sportTypeenumOptionalSport
Sport for competitions and today's trends (default Football). Also steers name matching for teams, players and competitions.
languageenumOptionaldefault "English"Language
Language for team, competition and stat names.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy configuration
Datacenter proxies work well and are the cheapest option.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| startTime | any | Start (UTC) |
| competition | any | Competition |
| homeTeam | any | Home |
| homeScore | any | H |
| awayScore | any | A |
| awayTeam | any | Away |
| status | any | Status |
| result | any | Result |
| round | any | Round |
| gameId | any | Game ID |
| homeTeamLogo | any | Home logo |
| awayTeamLogo | any | Away logo |
| odds | any | Bet365 odds |
| webUrl | any | Match page |
| homeHalftimeScore | any | HT H |
| awayHalftimeScore | any | HT A |
| venue | any | Venue |
| statistics | any | Statistics |
| events | any | Events |
| lineups | any | Lineups |
| missingPlayers | any | Missing players |
| officials | any | Officials |
| teamName | any | Team |
| player | any | Player |
| group | any | Group |
| position | any | Position |
| stats | any | Stats |
| athleteId | any | Player ID |
| photo | any | Photo |
| name | any | Name |
| age | any | Age |
| nationality | any | Nationality |
| club | any | Club |
| formationPosition | any | Role |
| jerseyNumber | any | No. |
| height | any | Height |
| contractUntil | any | Contract until |
| seasonStats | any | Season stats |
| transfers | any | Transfers |
| profileUrl | any | Profile |
| team | any | Team |
| played | any | Played |
| didNotPlayReason | any | Did not play |
| ranks | any | Ranks |
| statType | any | Stat |
| rank | any | Rank |
| value | any | Value |
| secondary | any | Detail |
| teamLogo | any | Logo |
| won | any | W |
| drawn | any | D |
| lost | any | L |
| goalsFor | any | F |
| goalsAgainst | any | A |
| goalDifference | any | +/- |
| points | any | Pts |
| recentForm | any | Form |
| seasonName | any | Season |
| time | any | Date |
| playerName | any | Player |
| origin | any | From |
| target | any | To |
| type | any | Type |
| price | any | Fee |
| priceValue | any | Fee value |
| priceCurrency | any | Currency |
| market | any | Market |
| options | any | Prices |
| bookmaker | any | Bookmaker |
| text | any | Trend |
| recommendation | any | Pick |
| percentage | any | Hit rate |
| oddsFractional | any | Fractional |
| logo | any | Logo |
| sport | any | Sport |
| country | any | Country |
| competitionId | any | Competition ID |
| id | any | ID |
| popularityRank | any | Popularity |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Result | One row saved to the dataset (a game, match detail, player box score, player, stat line, standings row, transfer, odds line or trend). | $0.0025 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('querystone/bet365-scraper').call({
"action": "scores",
"competitions": [
"premier-league"
],
"maxResults": 20,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run querystone/bet365-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=querystone/bet365-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
No examples yet
The developer hasn't published example inputs for this actor.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.