An R client for the PGA Tour API. Access leaderboards, player stats, scorecards, shot tracking data, tee times, FedExCup standings, betting odds, broadcast schedules, news, and video highlights — all returned as tidy tibbles.
Quick Start
library(pgatouR)
# Current leaderboard
pga_leaderboard("R2026475")
# Strokes Gained: Total rankings
pga_stats("02675")
# Full player directory (2,400+ players)
pga_players()
# Hole-by-hole scorecard
pga_scorecard("R2026475", "39971")
# Shot-level tracking with coordinates
pga_shot_details("R2026475", "39971", round = 1)
# Full season schedule with dates, purse, champions
pga_schedule(2025)Functions
Live Tournament Data
| Function | Description |
|---|---|
pga_leaderboard(tournament_id) |
Full leaderboard with scores, positions, and round-by-round results |
pga_current_leaders(tournament_id) |
Quick top-15 snapshot for in-progress tournaments |
pga_tee_times(tournament_id) |
Tee time groupings with start tees and player assignments |
pga_scorecard(tournament_id, player_id) |
Hole-by-hole scorecard with par, score, yardage, and status |
pga_shot_details(tournament_id, player_id, round) |
Shot-by-shot tracking data with coordinates, distances, and play-by-play |
pga_odds(tournament_id) |
Betting odds to win for the tournament field |
pga_coverage(tournament_id) |
Broadcast and streaming schedule with networks and time windows |
Statistics & Standings
| Function | Description |
|---|---|
pga_stats(stat_id, year, tour) |
Any of 300+ stats with full player rankings (data from 2004-2026) |
pga_fedex_cup(year, tour) |
FedExCup standings with projected and official rankings |
pga_scorecard_comparison(tournament_id, player_ids, category) |
Head-to-head stat comparison between players |
Players & Tournaments
| Function | Description |
|---|---|
pga_players(tour) |
Full player directory with name, country, age, and active status |
pga_tournaments(ids) |
Tournament metadata including location, courses, weather, and format |
pga_schedule(year, tour) |
Full season schedule with dates, purse, course, champion, and FedExCup points |
Player Profiles
| Function | Description |
|---|---|
pga_player_profile(player_id) |
Overview with career highlights, wins, earnings, world rank, bio basics |
pga_player_career(player_id) |
Career achievements: starts, cuts, wins, finish distribution, earnings |
pga_player_results(player_id) |
Tournament-by-tournament results with round scores, FedExCup points, earnings |
pga_player_stats(player_id) |
Full stat profile (131 stats with ranks) in a single call |
pga_player_bio(player_id) |
Biographical text, amateur highlights |
pga_player_tournament_status(player_id) |
Live tournament status (position, score, thru) if currently playing |
Content
| Function | Description |
|---|---|
pga_news(tour, limit, offset) |
News articles with filtering by franchise, player, and pagination |
pga_news_franchises(tour) |
Available news categories for filtering |
pga_videos(player_ids, tournament_id) |
Player video highlights with filtering options |
pga_tourcast_videos(tournament_id, player_id, round) |
Shot-by-shot video clips for a player’s round |
Tournament IDs
Tournament IDs follow the format {tour_code}{year}{tournament_number}, e.g., "R2026475" for the 2026 Valspar Championship on the PGA Tour.
You can find tournament IDs from the PGA Tour website URL or by checking the leaderboard/schedule pages. The pga_tournaments() function can retrieve metadata for known IDs.
Detailed Examples
Player Profiles
library(pgatouR)
# Full profile overview
profile <- pga_player_profile("52955") # Ludvig Aberg
profile$first_name # "Ludvig"
profile$highlights # tibble: PGA TOUR Wins, FedExCup rank, World Rank
profile$overview # tibble: career/season/bio/stats summary
# 131 stats in one call (way faster than pulling individually)
stats <- pga_player_stats("52955")
stats[stats$stat_id == "02675", ] # SG: Total — rank 13, value 1.245
# Tournament results this season
results <- pga_player_results("52955")
results[, c("tournament", "pos", "total", "to_par", "winnings")]
# Career achievements
pga_player_career("52955")
# Bio and amateur highlights
bio <- pga_player_bio("52955")
bio$text # paragraphs of biographical text
# Is a player in the current tournament?
pga_player_tournament_status("39971") # Sungjae Im — position, score, thruStrokes Gained Analysis
library(pgatouR)
# Get all six strokes gained categories
sg_total <- pga_stats("02675") # SG: Total
sg_ott <- pga_stats("02567") # SG: Off-the-Tee
sg_app <- pga_stats("02568") # SG: Approach
sg_arg <- pga_stats("02569") # SG: Around-the-Green
sg_putt <- pga_stats("02564") # SG: Putting
# Check what stat you just pulled
attr(sg_total, "stat_title")
#> "SG: Total"
attr(sg_total, "tour_avg")
#> "0.000"Finding Stats
# Browse the stat_ids dataset
stat_ids[stat_ids$category == "Putting", ]
# Search by name
stat_ids[grep("Driving", stat_ids$stat_name), ]
# All strokes gained stats
stat_ids[stat_ids$category == "Strokes Gained", ]Historical Data
# Driving distance over the years
dd_2024 <- pga_stats("101", year = 2024)
dd_2020 <- pga_stats("101", year = 2020)
dd_2015 <- pga_stats("101", year = 2015)
# FedExCup standings from past seasons
pga_fedex_cup(2025)
pga_fedex_cup(2024)
# Full season schedule with dates, purse, course, champion
schedule_2025 <- pga_schedule(2025)
schedule_2026 <- pga_schedule(2026) # 48 events, future events includedLive Tournament Tracking
# Full tournament picture
tournament <- pga_tournaments("R2026475")
leaderboard <- pga_leaderboard("R2026475")
tee_times <- pga_tee_times("R2026475")
coverage <- pga_coverage("R2026475")
odds <- pga_odds("R2026475")
# Deep dive on a player
player_id <- "39971" # Sungjae Im
scorecard <- pga_scorecard("R2026475", player_id)
shots <- pga_shot_details("R2026475", player_id, round = 1)
videos <- pga_tourcast_videos("R2026475", player_id, round = 1)Player Research
# Get all PGA Tour players
players <- pga_players("R")
# Filter to active players
active <- players[players$is_active, ]
# Korn Ferry Tour players
kft_players <- pga_players("H")News & Video Content
# Latest news
news <- pga_news(limit = 10)
# News by category
categories <- pga_news_franchises()
power_rankings <- pga_news(franchises = "power-rankings", limit = 5)
# Player highlights
videos <- pga_videos(player_ids = "46046", tournament_id = "475")Stat Categories
The stat_ids dataset covers 340 stats across these categories:
- Strokes Gained — Total, Tee-to-Green, Off-the-Tee, Approach, Around-the-Green, Putting
- Off The Tee — Driving distance, accuracy, ball speed, club head speed, launch angle, spin rate
- Approach the Green — GIR, proximity to hole (by distance bucket, from fairway/rough), going for it
- Around the Green — Scrambling, sand saves, proximity (by distance and lie)
- Putting — Putting average, putts per round, make rates by distance (3’ through 25’+), GIR putting
- Scoring — Scoring average, birdies, eagles, bogey avoidance, par 3/4/5 scoring, by round, front/back 9
- Streaks — Consecutive cuts, fairways, GIR, birdies, rounds in the 60s
- Money/Finishes — Official money, career earnings, top 10s, victories
- Points/Rankings — FedExCup, world ranking, power/accuracy/putting ratings
API Details
This package wraps the PGA Tour’s GraphQL and REST APIs:
-
GraphQL endpoint:
https://orchestrator.pgatour.com/graphql -
REST endpoint:
https://data-api.pgatour.com - Authentication: Uses a public API key embedded in the PGA Tour frontend (no user authentication required)
- Rate limiting: Built-in throttling at 10 requests/second
Several endpoints return gzip+base64 compressed payloads. The package handles decompression transparently.
