ScanGoal APIscangoal.ru ↗
Access ScanGoal.ru match data via API: live/pre/FT football matches, 1X2 and Asian handicap odds, dominance indices, xG, events, H2H history, and period stats.
What is the ScanGoal API?
The ScanGoal.ru API exposes two endpoints covering football match listings and detailed match statistics from the ScanGoal scanner. list_matches returns paginated rows of live, upcoming, and finished matches — each including status, kickoff time, league, team IDs, current score, dominance and activity indices, and 1X2/Asian handicap/totals odds. get_match returns a single match's full stat page: timeline events, period scores, xG, head-to-head history, and venue details.
curl -X GET 'https://api.parse.bot/scraper/e19ad085-a523-4550-8bef-a13706d359e2/list_matches?mode=all&page=2&sort=Dominance' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace scangoal-ru-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: ScanGoal football matches — bounded, re-runnable."""
from parse_apis.scangoal_ru_api import ScanGoal, MatchSort, MatchNotFound
client = ScanGoal()
# Browse today's finished matches sorted by dominance.
for summary in client.match_summaries.list(mode="ft", sort=MatchSort.DOMINANCE, limit=5):
print(summary.home_team, summary.home_score, ":", summary.away_score, summary.away_team,
"—", summary.league_name)
# Drill into the first finished match for full statistics.
first = client.match_summaries.list(mode="ft", limit=1).first()
if first is not None:
match = first.details()
print(match.title, "|", match.status)
print("Venue:", match.venue)
if match.home_xg is not None:
print(f"xG: {match.home_xg} - {match.away_xg}")
for stat in match.statistics.full:
print(f" {stat.label}: {stat.home_raw} - {stat.away_raw}")
for event in match.events[:5]:
print(f" {event.minute}' [{event.type}] {event.detail}")
# Point lookup by slug discovered from the listing.
if first is not None:
try:
detail = client.matches.get(slug=first.slug)
print(detail.home_team, "goals:", len(detail.home_goals))
except MatchNotFound:
print("Match no longer available")
print("exercised: match_summaries.list / details / matches.get")
Returns one page of football matches from the ScanGoal scanner grid. Each row is one match with status (LIVE / PRE / FT), kickoff time in UTC (null for rows whose badge shows only the live minute), league, teams with their numeric ids, current score, dominance and activity indices, bookmaker odds (1X2, Asian handicap, totals, prematch totals) and each team's recent form. The default call covers all matches of the current day; the mode filter restricts to live, upcoming or finished matches and the date filter shows another day (the site only serves history up to about 3 days back to anonymous visitors; when it clamps the date, date_limited is true). Paging is server-side: page selects the page (1-based, default 1), page_size is decided by the site (50 or 100 rows observed), total_count and total_pages describe the whole result set and has_more tells whether another page exists. The search filter matches team names as typed on the site's search box and ignores the day boundary (matches from roughly ±7 days). The slug of every row is the input of get_match. A valid empty page (no matches for the filters) returns an empty matches array.
| Param | Type | Description |
|---|---|---|
| date | string | Calendar day to list, ISO YYYY-MM-DD. Omitted = today. Days older than about 3 days are clamped by the site for anonymous visitors (see date_limited). |
| mode | string | Which matches to show: all matches of the day, only live, only upcoming (pre-match), or only finished. |
| page | integer | 1-based page number of the server-side paging; values above total_pages return an empty matches array. |
| sort | string | Server-side ordering of the grid, mirroring the column sort buttons of the site. |
| search | string | Free-text team-name filter, e.g. a club name; applied server-side across roughly ±7 days regardless of mode. |
{
"type": "object",
"fields": {
"page": "integer, the page returned",
"matches": "array of match rows; each has match_id (string), slug (input for get_match), status (LIVE/PRE/FT), minute_label (site badge text: kickoff time, live minute, HT or FT), kickoff_utc (ISO UTC or null), league_id, league_name, home_team/away_team names, home_team_id/away_team_id (numeric strings, null when the site has no logo id), home_score/away_score, goals_total, home_red_cards/away_red_cards, dominant_side (H/A), home_dominance_pct/away_dominance_pct (null when not shown), power, activity, odds object, home_form/away_form (W/D/L string of last matches, null when not shown), home_form_goals/away_form_goals ({scored, conceded} over that form window)",
"has_more": "boolean, true when page < total_pages",
"page_size": "integer, rows per page as decided by the site",
"total_count": "integer, total matches for these filters",
"total_pages": "integer, number of pages for these filters",
"date_limited": "boolean, true when the site clamped the requested date to its anonymous history window",
"matches[].odds": "object: home_win, draw, away_win (1X2 decimal odds), handicap_line/handicap_home/handicap_away (Asian handicap), total_line/total_over/total_under (current total), prematch_total_line/prematch_total_over/prematch_total_under"
},
"sample": {
"data": {
"page": 1,
"matches": [
{
"odds": {
"draw": 3.8,
"away_win": 1.91,
"home_win": 3.7,
"total_line": 2.75,
"total_over": 1.98,
"total_under": 1.88,
"handicap_away": 1.95,
"handicap_home": 1.9,
"handicap_line": 0.5,
"prematch_total_line": 2.75,
"prematch_total_over": 1.98,
"prematch_total_under": 1.88
},
"slug": "coventry-vs-brighton-20260913",
"power": 99.5,
"status": "FT",
"activity": 84.8,
"match_id": "4553103",
"away_form": "DLWWDWWW",
"away_team": "Брайтон",
"home_form": "LLWLWWD",
"home_team": "Ковентри Сити",
"league_id": "FE5E254B-5A09-4881-9920-0FCC6AF94AFD",
"away_score": 5,
"home_score": 0,
"goals_total": 5,
"kickoff_utc": "2026-09-13T13:00:00Z",
"league_name": "Английская Премьер-лига",
"away_team_id": "18508",
"home_team_id": "28577",
"minute_label": "13.09\n16:00",
"dominant_side": "A",
"away_red_cards": 0,
"home_red_cards": 1,
"away_form_goals": {
"scored": 20,
"conceded": 8
},
"home_form_goals": {
"scored": 10,
"conceded": 8
},
"away_dominance_pct": 100,
"home_dominance_pct": 0
}
],
"has_more": true,
"page_size": 100,
"total_count": 1169,
"total_pages": 12,
"date_limited": false
},
"status": "success"
}
}About the ScanGoal API
Match Listing with list_matches
list_matches pages through the ScanGoal scanner grid with four optional filters: mode (all / live / pre / FT), date (ISO YYYY-MM-DD, clamped to roughly a 3-day history window for anonymous requests), sort (mirrors the site's column-sort buttons), and search (free-text team name, applied across approximately ±7 days regardless of mode). Each entry in the matches array carries a match_id, slug, status (LIVE/PRE/FT), minute_label, league name, home and away team names with their numeric IDs, live score, and an odds object containing home_win, draw, away_win, handicap_line, handicap_home, handicap_away, total_line, and over/under values. The response also returns total_count, total_pages, has_more, and a date_limited flag that signals when the requested date was clamped.
Single Match Detail with get_match
get_match accepts a slug from any list_matches row (format: home-vs-away-YYYYMMDD) and returns the full match statistics page in one call. Always-present fields include title, status, venue, phases (period-by-period partial scores), and a summary array of the site's own match summary sentences. When available, the response includes home_xg and away_xg (expected goals), an events array of timeline entries — each with minute, side, type (goal/red/yellow/sub etc.), detail, and score_after — and an h2h array of historical head-to-head meetings with per-match stats objects.
Coverage and Freshness
Date filtering in list_matches is clamped by the site to an anonymous history window of approximately 3 days for past dates; the date_limited boolean in the response signals when this clamping occurred. The search parameter reaches across roughly ±7 days independently of the mode filter. The events and phases arrays in get_match are empty before a match kicks off; xG values may be null for matches where the site has not computed them.
The ScanGoal API is a managed, monitored endpoint for scangoal.ru — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when scangoal.ru changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official scangoal.ru API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Track live match status, score, and dominance index across all ongoing games using
list_matcheswith mode=live - Compare 1X2 and Asian handicap odds from the ScanGoal grid before a fixture kicks off
- Build a pre-match dashboard by filtering upcoming fixtures with mode=pre and sorting by dominance
- Retrieve xG values and timeline events for a finished match via
get_matchfor post-match analysis - Pull head-to-head history between two clubs from the
h2harray to inform betting or editorial content - Monitor period-by-period partial scores from the
phasesfield to analyse in-game momentum shifts - Search for a specific club's upcoming and recent fixtures across ±7 days using the
searchparameter
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does ScanGoal.ru have an official public developer API?+
What does the `odds` object in `list_matches` contain?+
odds object with home_win, draw, and away_win decimal odds (1X2 market), plus handicap_line, handicap_home, and handicap_away for the Asian handicap market, and total_line with over/under values for the totals market. These reflect the odds displayed in the ScanGoal scanner grid at the time of the request.How far back does the date filter in `list_matches` reach?+
date_limited field in the response is set to true when this happens. Future dates can be queried for scheduled fixtures without restriction.Does the API cover player-level statistics such as passes, shots on target per player, or ratings?+
Are competitions outside the major European leagues included in `list_matches`?+
league field on each match row indicates which competition it belongs to.