PGA Tour APIpgatour.com ↗
Access PGA Tour leaderboards, player scorecards, shot-by-shot data, FedExCup standings, and tournament schedules via a single REST API.
What is the PGA Tour API?
This API exposes 6 endpoints covering PGA Tour tournament data, returning leaderboards with per-player scoring, hole-by-hole scorecards, and stroke-level shot detail including GPS coordinates and video references. Use get_tournament_leaderboard to retrieve full standings for any tournament by its tournament_id, or get_player_shots to access every stroke a player hit across a specific round.
curl -X GET 'https://api.parse.bot/scraper/3db295ae-5c87-4ff2-ad38-4956e34b1cbc/get_tournament_leaderboard?tournament_id=R2024016' \ -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 pgatour-com-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.
"""PGA Tour API — schedule, leaderboard, scorecard, and shot details."""
from parse_apis.pga_tour_api import PGATour, Year, Round, TournamentNotFound
client = PGATour()
# Get the 2025 season schedule and browse completed tournaments.
schedule = client.schedules.get(year=Year._2025)
for month_group in schedule.completed[:2]:
print(month_group.month, month_group.year)
for t in month_group.tournaments[:2]:
print(f" {t.tournament_name} ({t.id}) — {t.purse}")
# Construct a tournament by ID and fetch its leaderboard.
masters = client.tournament(id="R2025014")
board = masters.leaderboard()
print(board.tournament_status, board.format_type)
if board.winner:
print(board.winner.first_name, board.winner.last_name, board.winner.total_score)
# Inspect the top player on the leaderboard.
top = board.players[0]
print(top.display_name, top.position, top.total)
# Get the top player's scorecard via the tournament sub-resource.
scorecard = masters.players.get_scorecard(player_id=top.id)
print(scorecard.tournament_name, scorecard.total_strokes)
for rs in scorecard.round_scores[:2]:
print(f" Round {rs.round_number}: {rs.total} ({rs.score_to_par})")
# Get shot details for round 1.
shots = masters.players.get_shots(player_id=top.id, round=Round.ROUND_1)
print(f"Shot detail {shots.id}, holes: {len(shots.holes)}")
hole = shots.holes[0]
print(f" Hole {hole.hole_number}: par {hole.par}, {hole.yardage} yds")
# Typed error handling: attempt to look up a non-existent tournament.
try:
client.tournament(id="R2025999").leaderboard()
except TournamentNotFound as exc:
print(f"Not found: {exc.tournament_id}")
# Fetch FedExCup overview.
overview = client.overviews.get()
print(overview.headline)
for node in overview.nodes[:2]:
print(f" {node.typename}")
print("exercised: schedules.get / tournament.leaderboard / players.get_scorecard / players.get_shots / overviews.get")
Retrieve the full leaderboard for a specific PGA Tour tournament. Returns player positions, scores, round details, winner info, courses, and tournament status. The players array is ordered by leaderboard position.
| Param | Type | Description |
|---|---|---|
| tournament_idrequired | string | Tournament ID in format R[Year][Number] (e.g., R2025014). Can be found in schedule data. |
{
"type": "object",
"fields": {
"id": "tournament identifier",
"winner": "object with winner details",
"courses": "array of course objects",
"players": "array of player leaderboard entries",
"formatType": "scoring format",
"tournamentId": "tournament identifier",
"tournamentStatus": "completion status"
},
"sample": {
"data": {
"id": "R2025014",
"winner": {
"id": "28237",
"purse": "$4,200,000",
"lastName": "McIlroy",
"firstName": "Rory",
"totalScore": "-11",
"totalStrokes": 277
},
"courses": [
{
"id": "014",
"courseName": "Augusta National Golf Club"
}
],
"players": [
{
"id": "28237",
"player": {
"country": "NIR",
"displayName": "Rory McIlroy"
},
"scoringData": {
"total": "-11",
"position": "1",
"totalStrokes": "277"
}
}
],
"formatType": "STROKE_PLAY",
"tournamentId": "R2025014",
"tournamentStatus": "COMPLETED"
},
"status": "success"
}
}About the PGA Tour API
Tournament Data
The get_tournament_leaderboard endpoint accepts a tournament_id in R[Year][Number] format (e.g., R2025001) and returns a leaderboard object containing a players array with positions, round-by-round scores, and tournament status. The get_tournament_details endpoint accepts a comma-separated list of tournament IDs and returns metadata per tournament: tournamentName, courses, weather, displayDate, and current status. Both endpoints work for past and in-progress tournaments.
Player Scorecards and Shot Data
get_player_scorecard takes a numeric player_id (retrievable from leaderboard response data) and a tournament_id, returning a scorecard object with a roundScores array that breaks down each hole for every round the player completed. For deeper analysis, get_player_shots adds a round parameter (1–4) and returns a shots object with a holes array containing stroke-by-stroke entries — each with distance, location codes, geographic coordinates, and video references where available.
Schedule and Standings
get_schedule accepts an optional year parameter (e.g., 2025) and returns a schedule object split into completed and upcoming arrays, each organized by month with tournament names, IDs, and start dates. get_fedexcup_standings requires no parameters and returns the current FedExCup overview including headline text, editorial nodes, and season context — useful for tracking the points race narrative across the season.
The PGA Tour API is a managed, monitored endpoint for pgatour.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when pgatour.com 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 pgatour.com 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?+
- Display a live tournament leaderboard with player positions and round scores during PGA Tour events.
- Build a hole-by-hole scorecard viewer for any player in any completed or in-progress round.
- Map shot trajectories and locations on a course layout using coordinates from
get_player_shots. - Aggregate historical tournament schedules by season year to analyze field composition and event sequencing.
- Link shot video references from the shots endpoint into a highlights or replay interface.
- Track tournament status across multiple events simultaneously using comma-separated IDs in
get_tournament_details. - Monitor FedExCup standings narrative and season context for editorial or fantasy golf applications.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does PGA Tour have an official developer API?+
What does get_player_shots return, and how granular is the data?+
shots object with a holes array covering every stroke in a specified round. Each shot entry includes distance, location codes (e.g., fairway, rough, green), geographic coordinates, and video references. You need a valid player_id, tournament_id, and round number (1–4) to call it.Does the API cover player career statistics or world rankings?+
How do I find a player's numeric ID to use with get_player_scorecard or get_player_shots?+
players array returned by get_tournament_leaderboard. Fetch the leaderboard for any tournament the player appeared in and extract the numeric ID from that response.