# Grassroots Football League Tracker (FA Full-Time) (`parviz_a/my-actor-2`) Actor

Scrapes FA Full-Time grassroots football leagues effortlessly. Automatically extracts live league tables, match results, and upcoming fixtures into structured JSON dataset. Ideal for football data analytics, tracking local clubs, and automated sports reporting. Built with Playwright.

- **URL**: https://apify.com/parviz\_a/my-actor-2.md
- **Developed by:** [Parviz Abbasov](https://apify.com/parviz_a) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $35.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.

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

## Grassroots Football League Tracker (FA Full-Time)

FA Full-Time (fulltime.thefa.com) is the league-management system behind **800+ English grassroots and youth football leagues** — but it has no public API, and the two previous Apify Actors that scraped it are both now marked **deprecated**. This one tracks league tables, results, and fixtures directly from a league's own FA Full-Time page.

Built for club webmasters who want to auto-populate their own site, local league newsletters, parents/players who want a results feed without checking a clunky admin system, and anyone building a grassroots-football app or bot.

### How it works

Give it the FA Full-Time page URL for your league (find it by visiting fulltime.thefa.com, searching for your league, and copying the URL). The Actor fetches that page and extracts:

- **League table** — position, played, won, drawn, lost, goal difference, points (and goals for/against, on leagues that show them).
- **Recent results** — date, teams, score.
- **Upcoming fixtures** — date, teams (optional).

Turn on **monitoring mode** to schedule this weekly and get only the results that are new since your last run — a genuine "new result posted" feed rather than re-downloading the whole table every time.

### Why text-pattern matching, not fixed CSS selectors

FA Full-Time is an older system, and its exact page markup has varied across different leagues and over the years. Rather than hard-code one specific set of CSS class names (which breaks the moment a page differs even slightly), this Actor identifies the league table by its column headers ("Pos", "Team", "Pts") and identifies results/fixtures by their content pattern (a date, plus either a score or "vs") wherever they appear on the page. This is more resilient to the inconsistencies across different league templates than a brittle selector would be — though see Limitations below for what that trade-off means in practice.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `leagues` | array | 1 example league | Each entry: `name`, `url` (the FA Full-Time page for that league). |
| `onlyNewResultsSinceLastRun` | boolean | `false` | Monitoring mode: only return (and charge for) new results. |
| `includeFixtures` | boolean | `true` | Also extract upcoming fixtures. |
| `requestTimeoutMs` | integer | `20000` | Page fetch timeout. |

### Output

```json
{
  "leagueName": "South London Grassroots Football League - Premiership",
  "sourceUrl": "https://fulltime.thefa.com/index.html?league=934030649",
  "table": [
    { "position": 1, "team": "Croydon Eagles", "played": 8, "won": 6, "drawn": 2, "lost": 0, "goalsFor": null, "goalsAgainst": null, "goalDifference": 31, "points": 20 }
  ],
  "results": [
    { "date": "21/07/23", "homeTeam": "Peckham Dragons", "homeScore": 0, "awayTeam": "Warriors", "awayScore": 8 }
  ],
  "fixtures": [
    { "date": "01/07/23", "homeTeam": "Brixton Pumas", "awayTeam": "Peckham Dragons" }
  ],
  "scrapedAt": "2026-09-18T10:00:00.000Z"
}
```

`goalsFor`/`goalsAgainst` are `null` on leagues whose table doesn't display them — this varies by league, not by a setting.

### Pricing

Pay-per-event:

- A small flat fee per run.
- **Per league checked** — reflects that this does real HTML parsing against a legacy site, not a simple API call.
- **Per new result found** — only charged in monitoring mode, when a result wasn't seen on a previous run. This is the ongoing "results feed" value.

### Limitations

- **FA Full-Time only.** Doesn't cover other grassroots league platforms, or professional/semi-professional leagues (see any of the many Flashscore/SofaScore-style Actors on the Store for those).
- **Results/fixtures parsing is best-effort.** The league table is well-structured and reliably parsed. The results/fixtures list format has shown more variation across different league pages historically — if a specific league's results don't come through, please report the league URL so the pattern can be extended.
- **No historical seasons or cup competitions in this version** — this tracks whatever the given URL currently shows.
- **You provide the URL.** This Actor doesn't search FA Full-Time's league directory for you; you'll need to find your league's URL once, the same way you'd bookmark it in a browser.

### API usage example

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("YOUR_USERNAME/grassroots-football-tracker").call(run_input={
    "leagues": [{"name": "My League", "url": "https://fulltime.thefa.com/index.html?league=123456"}],
    "onlyNewResultsSinceLastRun": True,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["leagueName"], "-", len(item["results"]), "new result(s)")
```

# Actor input Schema

## `leagues` (type: `array`):

Add one or more FA Full-Time league URLs to scrape.

## `onlyNewResultsSinceLastRun` (type: `boolean`):

When ON, the Actor remembers seen results and only returns newly-posted results on subsequent runs.

## `includeFixtures` (type: `boolean`):

Extract upcoming (unplayed) fixtures if available on the target page.

## `requestTimeoutMs` (type: `integer`):

Timeout in milliseconds for each HTTPS request.

## Actor input object example

```json
{
  "leagues": [
    {
      "name": "South London Grassroots Football League - Premiership",
      "url": "https://fulltime.thefa.com/index.html?league=934030649"
    }
  ],
  "onlyNewResultsSinceLastRun": false,
  "includeFixtures": true,
  "requestTimeoutMs": 20000
}
```

# Actor output Schema

## `dataset` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("parviz_a/my-actor-2").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("parviz_a/my-actor-2").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 '{}' |
apify call parviz_a/my-actor-2 --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parviz_a/my-actor-2"
        }
    }
}
```

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/l4zVFYM24EnJmeiC7/builds/VTA2mF64LDSOItJUe/openapi.json
