# AFL Tables Scraper (`kinaesthetic_millionaire/afl-tables-scraper`) Actor

Scrapes AFL and VFL match results, player statistics, season ladders and Brownlow Medal votes from AFL Tables for every season from 1897 to today, including scores, quarter-by-quarter progression, venues, attendance, per-player disposals, goals, kicks, marks and tackles, and full standings.

- **URL**: https://apify.com/kinaesthetic_millionaire/afl-tables-scraper.md
- **Developed by:** [Parsedom Inc](https://apify.com/kinaesthetic_millionaire) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $20.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## AFL Tables Scraper - AFL Match Results, Player Stats, Ladders & Brownlow Votes

![AFL Tables Scraper extracting AFL match results, player statistics, ladders and Brownlow Medal votes](https://i.postimg.cc/L6VXvJ7S/image.png)

The **AFL Tables Scraper** extracts **AFL match results, player statistics, season ladders and Brownlow Medal votes** from [AFL Tables](https://afltables.com), every AFL and VFL season from 1897 to today. For every match it returns the round, date, start time, venue, attendance, home and away team, final score, goals and behinds, quarter-by-quarter score progression, winner and margin; for every player the games, kicks, marks, handballs, disposals, goals, behinds, hit outs, tackles, inside 50s, clearances and more; for every team the ladder position, wins, draws, losses, points for and against, percentage and premiership points; and for every Brownlow Medal player the votes and the rounds they polled in. Results are returned as structured JSON, ready to export to CSV or Excel. No login is required and it works without a proxy.

### Key Features of the AFL Stats Scraper

- **Match results** - every home-and-away and finals match of a season, with scores, venue, attendance, winner, margin and score by quarter. Pick one round, or the whole season.
- **Player statistics** - season totals for every player, grouped by team: games, kicks, handballs, disposals, marks, goals, tackles, clearances, inside 50s, contested possessions and more.
- **Season ladder** - the final standings of any season with home and away records, goals and behinds for and against, percentage and premiership points.
- **Brownlow Medal votes** - total votes, 3-2-1 vote games, games polled and the rounds each player polled in (1924 onwards).
- **Team filter** - only return one team, for example Collingwood or Brisbane Lions.
- **Finals and byes options** - include or leave out finals matches, and optionally list the teams that had a bye each round.
- **Pick pages by URL** - paste AFL Tables season, player statistics or Brownlow Medal page links instead of choosing a season.
- **Caching between runs** - give the run a project name and later runs of the same project skip items already returned, so a weekly run returns only new matches.
- **Proxy support** - runs without a proxy; one can be enabled if you want.

### Input Configuration: Scrape AFL Data by Season, Round or Team

| Field | Type | Required | Default | Description |
|-------|------|----------|---------|-------------|
| startUrls | array | - | \[] | Optional AFL Tables season, player statistics or Brownlow Medal page links. Leave empty to use the mode and season below. |
| mode | string | - | matches | What to scrape: `matches`, `playerStats`, `ladder` or `brownlowMedal`. |
| season | integer | - | 2024 | Season (year) to scrape, 1897 to the current season. Brownlow Medal votes exist from 1924. |
| roundNumber | integer | - | - | Matches only: return just this home-and-away round. Finals are not returned when set. |
| includeFinals | boolean | - | true | Matches only: also return finals matches. |
| includeByes | boolean | - | false | Matches only: also return a row for every team that had a bye. |
| team | string | - | - | Only return data for one team, for example `Collingwood`. |
| maxItems | integer | - | 5 | Maximum items (matches, players, ladder rows or Brownlow rows) per start URL. |
| projectName | string | - | - | Set a name to enable caching between runs; leave empty to scrape everything every time. |
| proxyConfiguration | object | - | no proxy | Proxy settings for all requests. |

**Supported URL types:**

- Season page (match results or ladder, depending on the mode): `https://afltables.com/afl/seas/2024.html`
- Player statistics page: `https://afltables.com/afl/stats/2024.html`
- Brownlow Medal page: `https://afltables.com/afl/brownlow/brownlow2024.html`

### Output: AFL Data in JSON, CSV or Excel

The dataset has four views, one per mode:

- **Match results** - season, round, date, teams, scores, venue, attendance, winner and margin.
- **Player statistics** - season totals per player and team.
- **Season ladder** - standings with scores for and against, percentage and premiership points.
- **Brownlow Medal votes** - votes per player with 3, 2 and 1 vote games.

**Sample output (match results):**

```json
{
    "season": 2024,
    "round": 1,
    "roundName": "Round 1",
    "isFinals": false,
    "isBye": false,
    "matchId": "111620240307",
    "matchUrl": "https://afltables.com/afl/stats/games/2024/111620240307.html",
    "date": "2024-03-07",
    "startTime": "7:30 PM",
    "localStartTime": "6:30 PM",
    "attendance": 40012,
    "venue": "S.C.G.",
    "venueUrl": "https://afltables.com/afl/venues/scg.html",
    "homeTeam": "Sydney",
    "homeTeamUrl": "https://afltables.com/afl/teams/swans_idx.html",
    "homeTeamSlug": "swans",
    "homeScore": 86,
    "homeGoals": 12,
    "homeBehinds": 14,
    "homeScoreProgression": ["3.3", "4.3", "7.10", "12.14"],
    "awayTeam": "Melbourne",
    "awayTeamUrl": "https://afltables.com/afl/teams/melbourne_idx.html",
    "awayTeamSlug": "melbourne",
    "awayScore": 64,
    "awayGoals": 9,
    "awayBehinds": 10,
    "awayScoreProgression": ["1.6", "2.8", "7.8", "9.10"],
    "winner": "Sydney",
    "margin": 22,
    "isDraw": false,
    "sourceUrl": "https://afltables.com/afl/seas/2024.html",
    "scrapedAt": "2026-10-03T10:20:13.202Z"
}
```

**Sample output (player statistics):**

```json
{
    "season": 2024,
    "playerName": "Rory Laird",
    "playerUrl": "https://afltables.com/afl/stats/players/R/Rory_Laird.html",
    "team": "Adelaide",
    "teamSlug": "adelaide",
    "jerseyNumber": 29,
    "games": 23,
    "kicks": 271,
    "marks": 83,
    "handballs": 364,
    "disposals": 635,
    "disposalAverage": 27.61,
    "goals": 2,
    "behinds": 5,
    "hitOuts": 0,
    "tackles": 132,
    "inside50s": 70,
    "clearances": 114,
    "brownlowVotes": 7,
    "percentGamePlayed": 77
}
```

**Sample output (season ladder):**

```json
{
    "season": 2024,
    "position": 1,
    "team": "Sydney",
    "played": 23,
    "wins": 17,
    "draws": 0,
    "losses": 6,
    "homeRecord": "9-0-2",
    "awayRecord": "8-0-4",
    "goalsFor": 328,
    "behindsFor": 274,
    "pointsFor": 2242,
    "pointsAgainst": 1769,
    "percentage": 126.7,
    "premiershipPoints": 68
}
```

**Sample output (Brownlow Medal votes):**

```json
{
    "season": 2024,
    "playerName": "Patrick Cripps",
    "team": "CA",
    "teamSlug": "carlton",
    "votes": 45,
    "isEligible": true,
    "gamesPlayed": 23,
    "threeVoteGames": 12,
    "twoVoteGames": 4,
    "oneVoteGames": 1,
    "gamesPolled": 17,
    "votesByRound": [
        { "round": 2, "votes": 3 },
        { "round": 4, "votes": 3 }
    ]
}
```

### Use Cases: What You Can Do With AFL Data

- Build an AFL results database or a historical archive of every match since 1897.
- Model and predict match outcomes using scores, venues, attendance and margins.
- Fantasy football and betting research using player disposals, goals, marks and tackles.
- Track a club's season: ladder position, percentage and home versus away form.
- Analyse Brownlow Medal voting by round, team and season.
- Feed sports journalism, dashboards and charts with up-to-date standings and attendance figures.

### How to Scrape AFL Tables

1. [Sign up](https://apify.com/sign-up) for a free Apify account - includes **$5 monthly credit**.
2. Open the actor page and click **Try for free**.
3. Choose what to scrape and a season, or paste AFL Tables page links into the start URLs.
4. Click **Start** and wait for the run to complete.
5. Download results from the **Output** tab in JSON, CSV, or Excel format.

You can also run this actor via the [Apify API](https://docs.apify.com/api/v2) or integrate it directly into your workflows using [Zapier](https://zapier.com/apps/apify), [Make](https://www.make.com/), or [n8n](https://n8n.io/).

### Limitations & Known Issues

- **Season-level player statistics only** - player statistics are the season totals per team, not game-by-game lines. Players who changed club mid-season appear once per club.
- **Older seasons have fewer statistics** - disposals and most other counts were not recorded in the early decades (for example 1925 and 1950 have no disposals), so those fields are returned as `null` rather than zero.
- **Brownlow Medal starts in 1924** - earlier seasons have no votes. Players who polled votes but were ineligible for the medal are marked `isEligible: false`.
- **Brownlow team is a club code** - the Brownlow page only gives the short club code (for example `CA`), so use `teamSlug` for a readable club name.
- **Home and away follow the site** - the first team listed on AFL Tables is returned as the home team, including in finals.
- **Opening-round layout** - the site lists some seasons' opening-round matches under Round 1 with the other clubs shown as byes (2024 for example); this Actor returns them as the site shows them.

### Notes

- **Works without a proxy** - the site is public and needs no login; a proxy is optional.
- **API integration** - this actor can be called as an API from any automation platform (Zapier, Make, n8n, custom scripts).
- **Scores are in points** - goals count 6 points and behinds 1 point; `homeScore` always equals goals x 6 plus behinds.

### FAQ

#### How do I scrape AFL match results?

Set **mode** to `matches`, choose a **season** (1897 to today) and optionally a **roundNumber**, then click **Start**.

#### Can I get AFL player statistics and the season ladder?

Yes. Set **mode** to `playerStats` for season totals per player, or `ladder` for the final standings of a season.

#### Does it include Brownlow Medal votes?

Yes. Set **mode** to `brownlowMedal` to get each player's votes and the rounds they polled in. Votes exist from 1924 onwards.

#### Can I scrape just one team?

Yes. Use the **team** field, for example `Collingwood` or `Brisbane Lions`.

#### Can I get only new matches each week?

Yes. Set a **projectName**; later runs with the same name skip items already returned.

#### Do I need a login or a proxy?

No. The Actor needs no login and works without a proxy.

### Other Actors by Parsedom

| Category | Actor | What it does |
|----------|-------|--------------|
| 🎟️ Events | [Skiddle Events Scraper](https://apify.com/kinaesthetic_millionaire/skiddle-events-scraper) | Extract event listings from Skiddle.com - names, venues, dates, locations, prices, images and ticket details for clubs, gigs, festivals and more. |
| 📱 Social Media | [TikTok Users Scraper](https://apify.com/kinaesthetic_millionaire/tiktok-users-scraper) | Extracts public TikTok user accounts in bulk - follower, following, like and video counts, bio, bio link, verification status, and avatar. |
| 📱 Social Media | [Truth Social Scraper](https://apify.com/kinaesthetic_millionaire/truth-social-scraper) | Extracts posts and profile details from public Truth Social accounts, including post text, engagement counts, media, hashtags, and mentions. |
| 📈 SEO & Monitoring | [Website Uptime Checker](https://apify.com/kinaesthetic_millionaire/website-uptime-checker) | Monitors websites and APIs for availability, response time, SSL certificate expiry, and expected content, sending email or webhook alerts when something goes wrong. |
| 📈 SEO & Monitoring | [Ahref Website Authority Checker](https://apify.com/kinaesthetic_millionaire/ahref-website-authority-checker) | Extract website authority metrics from Ahrefs including Domain Rating (DR), backlinks, and referring domains. |

See all our Actors on the [Parsedom Inc Apify profile](https://apify.com/kinaesthetic_millionaire).

### 🤝 Support

Need help or have questions?

- Email us at info@parsedom.com
- Or visit https://parsedom.com
- Visit our profile on Fiverr: https://www.fiverr.com/s/rEmNqEb
- You can also contact us if you want to build a custom actor

**Ready to get started? Add your target URLs and start scraping! 🚀**

# Actor input Schema

## `startUrls` (type: `array`):

Optional AFL Tables pages to scrape instead of choosing a season below: a season page such as https://afltables.com/afl/seas/2024.html (match results or ladder, depending on the mode), a player statistics page such as https://afltables.com/afl/stats/2024.html, or a Brownlow Medal page such as https://afltables.com/afl/brownlow/brownlow2024.html. Leave empty to use the mode and season below.

## `mode` (type: `string`):

Match results with scores and venues, per-player season statistics, the season ladder (standings), or Brownlow Medal votes.

## `season` (type: `integer`):

The season (year) to scrape, from 1897 to the current season. Used when no AFL Tables pages are given above. Brownlow Medal votes exist from 1924 onwards.

## `roundNumber` (type: `integer`):

Only for match results: return just this home-and-away round, for example 1. Leave empty for the whole season. Finals are not returned when a round number is set.

## `includeFinals` (type: `boolean`):

Only for match results: also return finals matches (qualifying, elimination and semi finals, preliminary finals and the grand final).

## `includeByes` (type: `boolean`):

Only for match results: also return a row for every team that had a bye in a round.

## `team` (type: `string`):

Only return data for one team, for example Collingwood or Brisbane Lions. Applies to match results (either side), player statistics, the ladder and Brownlow Medal votes. Leave empty for all teams.

## `maxItems` (type: `integer`):

Maximum number of items (matches, players, ladder rows or Brownlow rows) to return for each season page.

## `projectName` (type: `string`):

Set a project name to enable cross-run caching, for example "afl-2025". The Actor remembers the items it returned under that project and skips them in later runs of the same project, so a weekly run returns only new matches. Each project keeps its own separate history, so using a different name starts fresh. Leave empty to scrape everything every time.

## `proxyConfiguration` (type: `object`):

Proxy settings used for all requests. The Actor works without a proxy.

## Actor input object example

```json
{
  "startUrls": [],
  "mode": "matches",
  "season": 2024,
  "includeFinals": true,
  "includeByes": false,
  "maxItems": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "season": 2024,
    "maxItems": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("kinaesthetic_millionaire/afl-tables-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "season": 2024,
    "maxItems": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("kinaesthetic_millionaire/afl-tables-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "season": 2024,
  "maxItems": 5
}' |
apify call kinaesthetic_millionaire/afl-tables-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kinaesthetic_millionaire/afl-tables-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/H3kQeBJCfVMx4yxev/builds/DLdxaiHDzzC02ZCld/openapi.json
