# PGA Tour Scraper: Leaderboards & Schedules (`recordsdata/pgatour-golf-stats-scraper`) Actor

Scrape PGA Tour golf data: season schedules with courses and cities, plus full tournament leaderboards with position, country, total to par, thru and per-round scores. Filter by season or tournament. Export CSV, Excel, JSON or XML. No login or API key. 50 events in 2025.

- **URL**: https://apify.com/recordsdata/pgatour-golf-stats-scraper.md
- **Developed by:** [RecordsData](https://apify.com/recordsdata) (community)
- **Categories:** Sports, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $12.50 / 1,000 leaderboard rows

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

<p align="center">
  <img src="https://api.apify.com/v2/key-value-stores/AAm3a1h3Z9nYfrvh9/records/banner?v=3" alt="RecordsData" width="100%" />
</p>

> **PGA Tour Scraper** extracts PGA Tour, Champions, Korn Ferry and LPGA season schedules, full tournament leaderboards and ranked player statistics (driving distance, scoring average, strokes gained and hundreds more). Rows carry purse, champion, total strokes, FedExCup points, official money and per-round scores. Export CSV, Excel, JSON or XML. No login and no API key. Verified in cloud on 2026-10-10: the 2025 Masters returned Rory McIlroy at -11, 277 strokes, 750 FedExCup points and $4,200,000. Leaderboard rows cost $15 per 1,000 on the Free plan.

PGA Tour scraper for golf data: the 2025 season lists 50 tournaments, each exportable as a schedule row plus a leaderboard. The actor reads the same GraphQL backend that powers pgatour.com, so the numbers match the official leaderboard, including events in progress. The LPGA Tour is read from ESPN's public JSON.

### ⛳ What does the PGA Tour Scraper do?

- Scrape the PGA Tour schedule for any season: dates, course, city, status, purse, champion and winner points.
- Scrape leaderboards: one row per player (or team) with position, status, total to par, total strokes and every round score.
- Add FedExCup points (Points List points on Korn Ferry) and official money to finished PGA Tour, Champions and Korn Ferry leaderboards.
- Switch to Champions, Korn Ferry or LPGA with the tour input.
- Scrape ranked player statistics (mode `playerStats`): ids such as 101 Driving Distance, 120 Scoring Average, 02675 SG: Total, or a whole category.
- Filter by status, find a tournament by name (Masters, Players, Open) or fetch exact ids such as R2025014.
- Only-new mode with a monitor name: tournaments already delivered are skipped without a charge.
- Export to CSV, Excel, JSON or XML, or use the Apify API.

### 📊 What data can you extract from the PGA Tour?

| Field | Applies to | Example |
|---|---|---|
| recordType | all rows | tournament, leaderboard-row or a stat row type |
| changeType | only-new runs | new or changed |
| tour, season, tournamentId | all rows | R, 2025, R2025014 (LPGA: ESPN event id) |
| name, month, date, startDate, tournamentStatus, format, category | schedule rows | Masters Tournament, April, Apr 10 - 13, completed |
| course, city, state, country, purse | schedule rows | Augusta National Golf Club, Augusta, 21000000 |
| champion, championId, championEarnings, defendingChampion | schedule rows | Rory McIlroy, 4200000 |
| winnerPoints, website | schedule rows | 750 |
| tournament, position, playerId, player | leaderboard rows | Masters Tournament, 1, Rory McIlroy |
| teamMembers, playerStatus, amateur | leaderboard rows | pair members (Zurich Classic), active, false |
| totalToPar, totalStrokes | leaderboard rows | -11, 277 |
| lastRoundScore, thru, currentRound, rounds | leaderboard rows | +1, F, 4, \["72","66","66","73"] |
| tourPoints, officialMoney | finished leaderboard rows | 750, 4200000 |
| statId, statName, statCategory | stat rows | 120, Scoring Average, SCORING |
| rank, rankChange, value, statValues, tourAverage, statsAsOf | stat rows | 1, 68.131, 71.079 |
| scrapedAt | all rows | ISO timestamp |

The dataset schema has 51 properties: 48 data columns plus `error`, `errorType` and `hint`. Schedule, leaderboard and stat rows share one dataset and are told apart by `recordType`. `country` is not uniform: PGA leaderboard rows use 3-letter codes (NIR), PGA stat rows and LPGA rows mostly use full names.

### 🧾 PGA Tour scraper sample output

Trimmed rows from the cloud run on 2026-10-10 (2025 Masters).

```json
{
  "recordType": "tournament",
  "tournamentId": "R2025014",
  "name": "Masters Tournament",
  "season": "2025",
  "tournamentStatus": "completed",
  "course": "Augusta National Golf Club",
  "purse": 21000000,
  "champion": "Rory McIlroy",
  "championEarnings": 4200000,
  "winnerPoints": 750
}
```

```json
{
  "recordType": "leaderboard-row",
  "tournamentId": "R2025014",
  "tournament": "Masters Tournament",
  "player": "Rory McIlroy",
  "country": "NIR",
  "position": "1",
  "playerStatus": "active",
  "totalToPar": "-11",
  "totalStrokes": 277,
  "rounds": ["72", "66", "66", "73"],
  "tourPoints": 750,
  "officialMoney": 4200000
}
```

The Masters run returned 96 rows: 1 schedule row and 95 players.

### 💵 How much does it cost to scrape PGA Tour data?

The actor uses pay-per-event pricing. You pay only for rows that are saved to your dataset.

| Event | What it covers | Free plan price | Gold plan price |
|---|---|---|---|
| Leaderboard row | One player (or team) in one tournament | $0.015 ($15 per 1,000) | $0.0125 ($12.50 per 1,000) |
| Tournament (schedule) | One scheduled tournament | $0.01 ($10 per 1,000) | $0.01 |
| Player stat row | One ranked player for one statistic in player stats mode | $0.01 ($10 per 1,000) | $0.01 |

Prices from the live actor pricing on 2026-10-10; other tiers sit between Free and Gold.

Worked example at the Free plan price: the 2025 Masters run (1 schedule row and 95 players) cost 1 x $0.01 + 95 x $0.015 = $1.435 ($1.1975 on Gold). 1,000 leaderboard rows cost $15.00 on the Free plan, and 1,000 schedule or player stat rows cost $10.00. A Scoring Average run of 500 ranked players costs 500 x $0.01 = $5.00.

**You are not charged for failed or empty runs.** Error rows, input mistakes, empty searches and tournaments with no players are never billed, and an only-new run with nothing new charges 0 events. Set a maximum cost per run and the actor stops cleanly at your limit. Free users get 10 rows per run.

### 🚀 How to scrape the PGA Tour in 3 steps

1. Open the actor and click **Try for free**. Enter a season such as 2025.
2. Optionally add a tournament name filter, exact ids, a status, or another tour. For statistics, set the mode to player stats and pick a category or stat ids.
3. Click **Start**, then download the dataset from the Output tab.

### ⚙️ PGA Tour scraper input

| Field | Type | Default | What it does |
|---|---|---|---|
| mode | select | tournaments | tournaments or playerStats |
| tour | select | R | R = PGA Tour, S = Champions, H = Korn Ferry, L = LPGA (tournaments mode only) |
| years | list of strings | \["2025"] | Season years to scrape |
| tournamentFilter | string | empty | Keep tournaments whose name contains this text |
| tournamentIds | list of strings | empty | Exact tournament ids (LPGA: ESPN event id) |
| status | select | any | any, completed, inProgress or upcoming tournaments |
| maxItems | integer | 10 | Total rows returned |
| includeSchedule, includeLeaderboards | boolean | true | Return schedule rows, leaderboard rows |
| includeEarnings | boolean | true | Add FedExCup points and official money to finished leaderboards (no extra charge) |
| maxTournaments | integer | 5 | How many leaderboards to fetch per run (maximum 60) |
| statCategory, statIds | select, list | none, empty | A whole statistic category (up to 60 per run) or ids such as 101, 120, 02675 |
| onlyNew, monitorName, resetSeen | boolean, string, boolean | false, empty, false | Only new or changed rows since the last run, a label for a separate memory, forget what was seen |

Example input for the 2025 Masters leaderboard only:

```json
{ "years": ["2025"], "tournamentFilter": "Masters", "includeSchedule": false, "maxTournaments": 1, "maxItems": 100 }
```

Limits per run: 30 seasons, 60 statistics and 200 tournament ids. Input mistakes end with one free `invalid-input` error row.

### 📦 PGA Tour scraper output

Failed requests add an unbilled `recordType: "error"` row; if the PGA Tour API cannot be reached at all, the run is marked as failed. Not available: LPGA statistics (free error row), LPGA FedExCup points (official money only), per-tournament strokes gained data, and match play or cup tournaments, which are skipped with a status message. Upcoming tournaments return a schedule row but no leaderboard.

### 📈 PGA Tour scraper vs other Apify actors

Pages read on 2026-10-10. "Not stated" means the listing does not show the feature.

| | This actor | lulzasaur/pgatour-scraper | parseforge/pgatour-leaderboard-scraper |
|---|---|---|---|
| Tours | PGA, Champions, Korn Ferry, LPGA | PGA, Champions, Korn Ferry | PGA, Champions, Korn Ferry, LPGA |
| Player statistics | Yes, ids or categories | Yes, statId or category | Not stated |
| Purse and champion | Yes, plus winner points | Yes | Not stated |
| FedExCup points, money | Yes, finished events | Not stated | Not stated |
| Only-new mode, status filter | Yes, both | Not stated | Not stated |
| Price per 1,000 (Free plan) | $15 leaderboard rows, $10 schedule or stat rows | $10 per API, page shows $5 | $8.50, plus start event |

deriverge/golf-scraper reads ESPN for PGA and LPGA leaderboards, has a change-only mode and a date range, and costs $1.00 per 1,000 on the Free plan, but its listing says it has no prize money or ranking points. We are the most expensive per leaderboard row of the four. The extra buys more columns, player statistics, status and only-new modes in one actor. If you only need cheap PGA or LPGA rows, deriverge or parseforge will cost less.

### 🏌️ PGA Tour data use cases

- **Tournament recaps and historical analysis:** final leaderboards, money, points and season schedules.
- **Fantasy and betting models:** per-round scores, stat rankings and live positions, paying for changes only.

### 🔌 Run the PGA Tour Scraper via API, schedules and integrations

```bash
curl -X POST "https://api.apify.com/v2/acts/RecordsData~pgatour-golf-stats-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"years":["2025"],"tournamentFilter":"Masters","maxItems":50}'
```

Use Apify schedules and send results to Google Sheets, Make, Zapier or n8n. For a watch job, set `onlyNew` to true with a `monitorName`.

### 🤖 PGA Tour Scraper MCP server for AI agents

AI agents can call this Actor through the Apify MCP server at `https://mcp.apify.com?tools=RecordsData/pgatour-golf-stats-scraper`. The URL loads only this Actor as a tool. Defaults are set for every required field, so an agent can run it with an empty input.

Add this to your MCP client configuration (Claude Desktop, Cursor, VS Code):

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=RecordsData/pgatour-golf-stats-scraper"
    }
  }
}
```

Example agent prompt:

> Use the PGA Tour Scraper to get the 2025 Masters leaderboard with schedule rows turned off, then list the top 5 players with their round scores, total strokes and official money.

Tool description: scrape golf tournaments (schedule, purse, champion, leaderboard with rounds, points and money) or ranked player stats; input fields are in the input table above.

### ⚖️ Is it legal to scrape PGA Tour data?

The actor reads leaderboard, schedule and statistics information that pgatour.com and ESPN publish openly, without logging in or bypassing access controls, and collects no private data. You remain responsible for how you use the data, including the PGA Tour terms of use. This is an independent tool, not affiliated with the PGA Tour or ESPN.

### ❓ Frequently asked questions

#### How do I export a PGA Tour leaderboard to CSV or Excel?

Open the PGA Tour Scraper, enter the season such as 2025, add a tournament filter such as Masters, and click Start. When the run finishes, open the Output tab and download the PGA Tour leaderboard as CSV, Excel, JSON or XML, with player, position, total to par, total strokes and every round score.

#### Does the PGA Tour Scraper work during live tournaments?

Yes. PGA Tour Scraper leaderboard rows include `thru` and `currentRound`, and the data is whatever the official pgatour.com leaderboard shows at the moment of the request. For live coverage, schedule the actor with only-new mode on, so rows come back only when values moved.

#### How do I find a PGA Tour tournament id for the PGA Tour Scraper?

Run the PGA Tour Scraper schedule module first. Every tournament row includes its `tournamentId`, for example R2025014 for the 2025 Masters, or a numeric ESPN event id for the LPGA. Copy it into the `tournamentIds` input of a later run to fetch exactly that event.

#### Which tours does the PGA Tour Scraper cover?

The PGA Tour Scraper covers the PGA Tour (value R), PGA Tour Champions (value S), the Korn Ferry Tour (value H) and the LPGA Tour (value L, read from ESPN), chosen with the `tour` input field, which defaults to R. Player statistics are not available for the LPGA, and FedExCup points are not available on LPGA rows.

#### What is in the rounds array of the PGA Tour Scraper output?

The `rounds` array in a PGA Tour Scraper leaderboard row holds each completed round score in order, as the tour publishes them, for example 72, 66, 66, 73 for Rory McIlroy at the 2025 Masters. It only appears once the player has completed at least one round.

#### Do I pay for PGA Tour Scraper schedule rows if I only want leaderboards?

No. Set `includeSchedule` to false in the PGA Tour Scraper input and the actor returns only leaderboard rows. Schedule rows and leaderboard rows are separate billed events: $0.01 and $0.015 on the Free plan, and you pay only for rows saved to your dataset.

#### Why did my PGA Tour Scraper run return 0 results?

The tournament filter matched nothing, the id does not exist, the status filter excluded everything, only-new mode found nothing new, or both data modules were switched off. The PGA Tour Scraper then ends with a clear status message and charges nothing. Check the tournament name and season year, then try a wider filter.

#### How many rows can one PGA Tour Scraper run return?

One PGA Tour Scraper run can return up to 1,000,000 rows on paid Apify plans, and free users get a 10-row preview. The `maxItems` field caps schedule, leaderboard and stat rows together, and `maxTournaments` limits how many leaderboards are fetched. A stats run returned 22,160 rows in testing.

#### Do I need a PGA Tour API key to use the PGA Tour Scraper?

No. The PGA Tour Scraper needs no key and no login from you. It reads the same GraphQL backend that powers pgatour.com, and ESPN's public JSON for the LPGA, so the numbers match the official leaderboards. You only need an Apify account to run the actor and download the results.

#### Which seasons can the PGA Tour Scraper return?

The PGA Tour Scraper returns any season that the tour API serves, set in the `years` input as a list such as 2025, up to 30 seasons per run. In testing, the 2025 PGA Tour season returned 50 tournaments. Older seasons vary, so run the schedule module for a year first.

### 🔗 Want more sports and data scrapers? Other RecordsData actors

- [F1 Racing Results Scraper](https://apify.com/RecordsData/f1-racing-results-scraper) for official motorsport results
- [Tennis Match Stats Scraper](https://apify.com/RecordsData/tennis-match-stats-scraper) for ATP and WTA match data
- [Sofascore Match Stats Scraper](https://apify.com/RecordsData/sofascore-match-stats-scraper) for multi-sport live stats

### 🆘 Support

Open the Issues tab of this actor or write to contact.punkrecordsdata@gmail.com.

Last updated: 2026-10-11

# Actor input Schema

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

Tournaments returns season schedules and tournament leaderboards. Player stats returns ranked player statistics (driving distance, scoring average, strokes gained and hundreds more) for PGA Tour, Champions or Korn Ferry.

## `tour` (type: `string`):

Which tour to read: R = PGA Tour, S = PGA Tour Champions, H = Korn Ferry Tour, L = LPGA Tour (read from ESPN, tournaments mode only).

## `years` (type: `array`):

Season years to read, one four-digit year per entry (for example 2025, 2024). Tournaments mode: each year returns that season's tournament schedule and the leaderboards of its first tournaments. Player stats mode: each year returns the season's statistic rankings.

## `tournamentFilter` (type: `string`):

Optional case-insensitive text the tournament name must contain, for example Masters, Players or Open. Leave empty to include every tournament of the season.

## `tournamentIds` (type: `array`):

Optional exact tournament ids such as R2025016 (The Sentry 2025), taken from the schedule rows (LPGA: the numeric ESPN event id, for example 401734766). In tournaments mode these tournaments get a leaderboard directly; in player stats mode statistics are read for these tournaments only.

## `status` (type: `string`):

Keep only tournaments in this state, for schedule rows and leaderboards: completed (finished), in progress (being played now) or upcoming. Choose completed to skip live and future events.

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

Maximum number of rows (schedule rows, leaderboard rows and player stat rows) to return. Free users are limited to 10. Paid users can set up to 1,000,000.

## `includeSchedule` (type: `boolean`):

Return one row per tournament with id, name, month, dates, status, course, city, state, country, purse, champion (or defending champion) and winner points. Billed as the Tournament event.

## `includeLeaderboards` (type: `boolean`):

Return one row per player (or team) per tournament with position, player status (cut, withdrawn), country, total to par, total strokes, last round score, thru and per-round scores. Billed as the Leaderboard row event.

## `includeEarnings` (type: `boolean`):

Add FedExCup points (Korn Ferry: Points List points) and official money to the leaderboard rows of finished PGA Tour, Champions and Korn Ferry tournaments. Costs one extra request per finished tournament and no extra charge. LPGA rows always carry official money.

## `maxTournaments` (type: `integer`):

Maximum number of tournaments per run whose leaderboard is fetched (the first matching tournaments of each season, plus any ids you gave). Tournaments that have not started have no leaderboard and are skipped.

## `statCategory` (type: `string`):

Player stats mode: read every statistic of a category. At most 60 statistics are read per run. Combine with Stat IDs to add single statistics.

## `statIds` (type: `array`):

Player stats mode: statistic ids to read, for example 101 (Driving Distance), 120 (Scoring Average), 02675 (SG: Total), 02564 (SG: Putting). Leave empty with no category to read SG: Total. Each ranked player is billed as the Player stat event.

## `onlyNew` (type: `boolean`):

Deliver only rows that are new since the last run of the same search (same tour, seasons, filters and modules). Finished tournaments that were delivered before are skipped without a request and are not charged; a row whose values moved (a live leaderboard, a corrected result, a new statistic ranking) comes back marked changed. Each row gets a changeType column.

## `monitorName` (type: `string`):

A label for this monitor. Different names keep separate memories for the same search, for example "season-watch" and "majors-only". Leave empty to use the search itself as the memory key.

## `resetSeen` (type: `boolean`):

Clear the memory of this search before running, so every row counts as new again.

## Actor input object example

```json
{
  "mode": "tournaments",
  "tour": "R",
  "years": [
    "2025"
  ],
  "tournamentFilter": "",
  "tournamentIds": [],
  "status": "any",
  "maxItems": 10,
  "includeSchedule": true,
  "includeLeaderboards": true,
  "includeEarnings": true,
  "maxTournaments": 5,
  "statCategory": "none",
  "statIds": [
    "02675"
  ],
  "onlyNew": false,
  "monitorName": "",
  "resetSeen": false
}
```

# Actor output Schema

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

Key fields per row

## `fullData` (type: `string`):

Complete dataset with all fields

# 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 = {
    "years": [
        "2025"
    ],
    "tournamentFilter": "",
    "tournamentIds": [],
    "maxItems": 10,
    "statIds": [
        "02675"
    ],
    "monitorName": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("recordsdata/pgatour-golf-stats-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 = {
    "years": ["2025"],
    "tournamentFilter": "",
    "tournamentIds": [],
    "maxItems": 10,
    "statIds": ["02675"],
    "monitorName": "",
}

# Run the Actor and wait for it to finish
run = client.actor("recordsdata/pgatour-golf-stats-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 '{
  "years": [
    "2025"
  ],
  "tournamentFilter": "",
  "tournamentIds": [],
  "maxItems": 10,
  "statIds": [
    "02675"
  ],
  "monitorName": ""
}' |
apify call recordsdata/pgatour-golf-stats-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,recordsdata/pgatour-golf-stats-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/RfwetoO9yGjDqk4nv/builds/evdcXPS0uhIEgS6Bl/openapi.json
