# Sports Standings, Fixtures, Form & Tennis Rankings (`precious_bathmat/sports-standings-and-fixtures`) Actor

League tables, upcoming fixtures, recent results and form guides for 18 leagues — the big five in Europe, the Champions League, MLS, Liga MX, NBA, NFL, MLB, NHL and more — plus ATP and WTA tennis rankings. From ESPN's public data; no API key.

- **URL**: https://apify.com/precious\_bathmat/sports-standings-and-fixtures.md
- **Developed by:** [Mariam Ahmed](https://apify.com/precious_bathmat) (community)
- **Categories:** News, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $20.00 / 1,000 competition reports

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

## Sports Standings, Fixtures, Form & Tennis Rankings

**Who is top, who is in form, and what is on next?** Pick your competitions and get one report each: the full table, a form guide, the results just played, the fixtures coming up, and — for tennis — the ATP and WTA ranking lists.

Twenty competitions: the big five European leagues, the Champions League and Europa League, Eredivisie, Primeira Liga, Brasileirão, Liga MX, Liga Profesional, MLS, plus NBA, WNBA, NFL, MLB, NHL and the ATP and WTA tours. From **ESPN's public data**. No account, no API key.

### What does this do?

Most sports scrapers hand you a list of matches. This one gives you the state of a competition — table, form, what just happened, what is next — and hands you the matches as well.

```mermaid
flowchart LR
    A[Competitions you pick] --> B[ESPN]
    B --> C[Standings]
    B --> D[Matches, month by month]
    C --> E[One report per competition]
    D --> E
    D --> F[Every match as a row]
```

### Who is it for?

| You are | You use it to |
|---|---|
| **Sports sites and newsletters** | Fill a table, fixture list and form guide automatically, every morning |
| **Bettors and modellers** | Get form, home-advantage rates and scoring averages as structured data |
| **App and bot builders** | Back a fixtures bot or a widget without paying for a sports data API |
| **Fantasy and pool organisers** | Track results and standings across several leagues in one run |
| **Analysts** | Compare leagues: goals per match, home-win rates, how tight the title race is |

### What data do you get?

One row per competition:

| Field | Meaning |
|---|---|
| `standings` | The full table, grouped where the sport uses conferences: position, played, won, drawn, lost, points, goals or points for and against, difference, streak, and any qualification note |
| `leader`, `leaderPoints`, `leaderRecord`, `leadMargin` | Who is top and by how much |
| `seasonStarted`, `note` | Between seasons the table is all zeros, so no leader is declared and the note says why |
| `formGuide` | Each team's latest form string (`WWDLW`), turned into wins, draws, losses and points per match, best run first |
| `recentResults` | The last matches played, with scores, winners and venues |
| `upcomingFixtures`, `nextFixture` | What is on next, with kick-off times, venues and both sides' form |
| `matchesPlayed`, `averageGoalsPerMatch` (or points, or runs) | Scoring level for the period read |
| `homeWinPercent`, `drawPercent`, `awayWinPercent` | How much home advantage is worth right now |
| `biggestWin`, `highestScoringMatch` | The standout results of the period |
| `rankings`, `biggestRise`, `biggestFall` | For ATP and WTA: the ranking list with points and movement, and who is climbing fastest |
| `espnUrl` | The same view on ESPN |

With **Also return every match as a row** on (the default), a second table holds every match read: date, competition, both teams, score, status, winner, venue and each side's form.

### Example: nine competitions, September 2026

One run from Apify's servers, two months of matches, 3.1 seconds, 662 match rows:

| Competition | Teams | Leader | Points | Matches read |
|---|---|---|---|---|
| English Premier League | 20 | Manchester City | 15 | 49 played, 2.84 goals/match, 36.7% home wins |
| Spanish LaLiga | 20 | Barcelona | 21 | 65 played, 3.02 goals/match, 44.6% home wins |
| German Bundesliga | 18 | Borussia Dortmund | 12 | 34 played, 3.91 goals/match, 52.9% home wins |
| Italian Serie A | 20 | AS Roma | 13 | 48 played, 2.92 goals/match, 41.7% home wins |
| UEFA Champions League | 36 | Paris Saint-Germain | 3 | 18 played, 3.83 goals/match, 61.1% home wins |
| NFL | 32 | Buffalo Bills | – | 66 played, 45.5% home wins |
| NBA | 30 | *season not started* | – | 0 played |
| ATP Tour | 100 ranked | Jannik Sinner | 11,500 | – |
| WTA Tour | 100 ranked | Elena Rybakina | 9,901 | – |

Read across that table and you can see the Bundesliga is the highest-scoring of the big leagues at 3.91 goals a game, and that home advantage varies more than people assume — 36.7% of Premier League matches went to the home side in this period against 52.9% in Germany.

### Things worth knowing

- **Between seasons there is no leader.** A league that has not kicked off has a table of zeros, and sorting it would crown whoever happens to be listed first. Those reports carry `seasonStarted: false` and a note instead, with the fixtures still listed. That is why the NBA row above says "season not started" rather than naming a team.
- **The match window is months, not a date range.** ESPN accepts a month (`202609`) or a single day, but rejects a dashed range with HTTP 400. The Actor reads the months you ask for **plus the month ahead**, which is what makes upcoming fixtures appear.
- **Form comes from ESPN, newest first.** `WWDLW` means won the last two. It is converted to points per match so a five-match run and a three-match run can be compared.
- **Conference sports come back grouped.** The NBA, NFL, MLB and NHL return two groups; soccer leagues return one; the Champions League league phase is a single 36-team table.
- **Scores are named for the sport.** Soccer and hockey get `goalsFor`, basketball and football get `pointsScored`, baseball gets `runsScored`, and the averages are labelled to match.
- **An out-of-season competition answers 404**, which the Actor reports as "out of season" rather than treating as an error.

### Popular leagues

Ready-made runs you can open and start, or copy as a starting point:

- [Premier League Table, Fixtures, Results and Form](https://apify.com/precious_bathmat/sports-standings-and-fixtures/examples/premier-league-table-and-fixtures)
- [LaLiga Table, Fixtures, Results and Form Guide](https://apify.com/precious_bathmat/sports-standings-and-fixtures/examples/laliga-table-and-fixtures)
- [Bundesliga Table, Fixtures, Results and Form Guide](https://apify.com/precious_bathmat/sports-standings-and-fixtures/examples/bundesliga-table-and-fixtures)
- [Serie A Table, Fixtures, Results and Form Guide](https://apify.com/precious_bathmat/sports-standings-and-fixtures/examples/serie-a-table-and-fixtures)
- [Ligue 1 Table, Fixtures, Results and Form Guide](https://apify.com/precious_bathmat/sports-standings-and-fixtures/examples/ligue-1-table-and-fixtures)
- [Champions League Table, Fixtures and Results](https://apify.com/precious_bathmat/sports-standings-and-fixtures/examples/champions-league-table-and-fixtures)
- [Europa League Table, Fixtures and Results](https://apify.com/precious_bathmat/sports-standings-and-fixtures/examples/europa-league-table-and-fixtures)
- [Top 5 European League Tables and Form Compared](https://apify.com/precious_bathmat/sports-standings-and-fixtures/examples/top-5-european-leagues-tables)
- [MLS Standings, Fixtures, Results and Form Guide](https://apify.com/precious_bathmat/sports-standings-and-fixtures/examples/mls-standings-and-fixtures)
- [Liga MX Table, Fixtures, Results and Form Guide](https://apify.com/precious_bathmat/sports-standings-and-fixtures/examples/liga-mx-table-and-fixtures)
- [Eredivisie and Primeira Liga Tables and Fixtures](https://apify.com/precious_bathmat/sports-standings-and-fixtures/examples/eredivisie-and-primeira-liga-tables)
- [Brasileirão and Argentine Liga Tables and Fixtures](https://apify.com/precious_bathmat/sports-standings-and-fixtures/examples/brasileirao-and-argentina-tables)
- [NBA and WNBA Standings, Schedule and Form](https://apify.com/precious_bathmat/sports-standings-and-fixtures/examples/nba-and-wnba-standings)
- [NFL, MLB and NHL Standings, Schedule and Results](https://apify.com/precious_bathmat/sports-standings-and-fixtures/examples/nfl-mlb-nhl-standings)
- [ATP and WTA Rankings: Points, Movement and Events](https://apify.com/precious_bathmat/sports-standings-and-fixtures/examples/atp-and-wta-tennis-rankings)

### Pricing

**$0.02 per competition report** plus **$0.0002 per match row** ($0.20 per 1,000 matches). Tables, form guides, fixtures and rankings are all included in the report price. A competition between seasons is reported free.

The nine-competition run above cost $0.31 including all 662 match rows, and used well under a cent of platform usage at 256 MB.

### Input

| Setting | What it does |
|---|---|
| **Competitions** | Pick from 20 leagues and tours |
| **Months of matches to read** | 1 to 12, counting the current month. Two covers recent form; twelve covers a season |
| **Fixtures and results per report** | How many of each to include in the report; every match still comes back as a row |
| **Players per tennis ranking** | Up to 200 for the ATP and WTA lists |

### Integrations

Runs on a schedule and connects to Google Sheets, Slack, Zapier, Make or your own code through the Apify API. Results export as JSON, CSV or Excel. A daily run keeps a table and fixture list current without any work.

### Is it legal?

This Actor reads the same public scores, tables and rankings any visitor sees on ESPN, and stores no personal data.

# Actor input Schema

## `competitions` (type: `array`):

Pick the leagues and tours to report on. Tennis tours return a ranking list instead of a table.

## `monthsOfMatches` (type: `integer`):

How far back to read results, counting the current month. Two months covers recent form; twelve covers a season.

## `listSize` (type: `integer`):

How many upcoming fixtures and recent results to put in each report. Every match still comes back as a row.

## `playersRanked` (type: `integer`):

How many ranked players to return for the ATP and WTA tours.

## `includeMatches` (type: `boolean`):

A second table with every match read: date, teams, score, status, venue and each side's form. Charged per match; turn it off to pay for the reports only.

## Actor input object example

```json
{
  "competitions": [
    "eng.1",
    "esp.1",
    "uefa.champions"
  ],
  "monthsOfMatches": 2,
  "listSize": 10,
  "playersRanked": 100,
  "includeMatches": true
}
```

# Actor output Schema

## `reports` (type: `string`):

Table, form guide, recent results and upcoming fixtures for each competition.

## `matches` (type: `string`):

Every match read, when that option is on.

## `summary` (type: `string`):

What was found per competition and anything skipped.

# 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 = {
    "competitions": [
        "eng.1",
        "esp.1",
        "uefa.champions"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("precious_bathmat/sports-standings-and-fixtures").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 = { "competitions": [
        "eng.1",
        "esp.1",
        "uefa.champions",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("precious_bathmat/sports-standings-and-fixtures").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 '{
  "competitions": [
    "eng.1",
    "esp.1",
    "uefa.champions"
  ]
}' |
apify call precious_bathmat/sports-standings-and-fixtures --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,precious_bathmat/sports-standings-and-fixtures"
        }
    }
}
```

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/2XAiVrYI2BAkPC3vP/builds/MMPePNThI7CgTbI4H/openapi.json
