STAT-API

PGA GraphQL Reference

Every professional golf tournament — the four majors, the PGA Tour stops, the FedExCup playoffs — broken down to the round, leaderboard, hole-by-hole and shot-by-shot ShotLink/TrackMan tracking, and the players, courses, season-long stats, and tournament odds behind them.

Every GraphQL type, relation, and argument — generated from the served schema, so it can never disagree with the API. Root fields take the same filters as REST; requests are metered by rows resolved, nested lists included.

Main

playersPgaPlayers
Every professional golfer — active tour members, conditional-status players, alumni who have competed at the highest level, and country-of-origin information.
Relations
  • player_shots[PgaPlayerShots!]!golf.player_shots rows whose player_id references this row.
  • leaderboards[PgaLeaderboards!]!golf.leaderboards rows whose player_id references this row.
  • player_rounds[PgaPlayerRounds!]!golf.player_rounds rows whose player_id references this row.
  • player_holes[PgaPlayerHoles!]!golf.player_holes rows whose player_id references this row.
  • player_season_stats[PgaPlayerSeasonStats!]!golf.player_season_stats rows whose player_id references this row.
  • player_news[PgaPlayerNews!]!golf.player_news rows whose player_id references this row.
  • tournament_odds_by_player_id[PgaTournamentOdds!]!golf.tournament_odds rows whose player_id references this row.
  • operator_player_lookups[PgaOperatorPlayerLookups!]!golf.operator_player_lookups rows whose player_id references this row.
  • tournament_odds_by_matchup_opponent_id[PgaTournamentOdds!]!golf.tournament_odds rows whose matchup_opponent_id references this row.
  • tournament_odds_by_round_matchup_opponent_id[PgaTournamentOdds!]!golf.tournament_odds rows whose round_matchup_opponent_id references this row.
  • tournament_odds_by_three_ball_opponent1_id[PgaTournamentOdds!]!golf.tournament_odds rows whose three_ball_opponent1_id references this row.
  • tournament_odds_by_three_ball_opponent2_id[PgaTournamentOdds!]!golf.tournament_odds rows whose three_ball_opponent2_id references this row.
Arguments (2)
  • firstIntPage size; clamped to the table's REST default/max limits.
  • afterBigIntKeyset cursor — returns rows with id > after, ordered by id ascending.
Columns (18) — full docs in the data dictionary
id: BigInt
league_id: String
first_name: String
last_name: String
full_name: String
league_player_id: Int
short_name: String
country: String
birth_date: String
birth_city: String
birth_state: String
birth_country: String
swings: String
college: String
photo_url: String
pga_debut_year: Int
created_at: String
updated_at: String
seasonsPgaSeasons
Each season on a professional golf tour — the year-long schedule of tournaments leading up to the FedExCup playoffs (PGA), the major championships, and the season-ending Tour Championship.
Relations
  • tourPgaToursThe golf.tours row referenced by tour_id; null when unlinked.
  • tournaments[PgaTournaments!]!golf.tournaments rows whose season_id references this row.
  • player_season_stats[PgaPlayerSeasonStats!]!golf.player_season_stats rows whose season_id references this row.
Arguments (2)
  • firstIntPage size; clamped to the table's REST default/max limits.
  • afterBigIntKeyset cursor — returns rows with id > after, ordered by id ascending.
Columns (8) — full docs in the data dictionary
league_id: String
start_date: String
end_date: String
start_year: Int
tour_id: BigInt
created_at: String
updated_at: String
id: BigInt
tournamentsPgaTournaments
Every professional golf tournament — the four majors (Masters, PGA Championship, U.S. Open, Open Championship), the PGA Tour stops, LIV events, the FedExCup playoffs, and Korn Ferry Tour events.
Required filters: one of season_id.
Relations
  • seasonPgaSeasonsThe golf.seasons row referenced by season_id; null when unlinked.
  • tourPgaToursThe golf.tours row referenced by tour_id; null when unlinked.
  • player_shots[PgaPlayerShots!]!golf.player_shots rows whose tournament_id references this row.
  • course_hole_stats[PgaCourseHoleStats!]!golf.course_hole_stats rows whose tournament_id references this row.
  • tournament_rounds[PgaTournamentRounds!]!golf.tournament_rounds rows whose tournament_id references this row.
  • leaderboards[PgaLeaderboards!]!golf.leaderboards rows whose tournament_id references this row.
  • player_rounds[PgaPlayerRounds!]!golf.player_rounds rows whose tournament_id references this row.
  • player_holes[PgaPlayerHoles!]!golf.player_holes rows whose tournament_id references this row.
  • player_news[PgaPlayerNews!]!golf.player_news rows whose tournament_id references this row.
  • tournament_odds[PgaTournamentOdds!]!golf.tournament_odds rows whose tournament_id references this row.
Arguments (4)
  • firstIntPage size; clamped to the table's REST default/max limits.
  • afterBigIntKeyset cursor — returns rows with id > after, ordered by id ascending.
  • season_idIntFilter to a single season. Defaults to the current season.
  • tour_idIntFilter by tour.
Columns (24) — full docs in the data dictionary
id: BigInt
league_id: String
name: String
tournament_id: Int
tour_id: BigInt
start_date: String
end_date: String
is_over: Boolean
is_in_progress: Boolean
venue: String
par: Int
yards: Int
purse: BigInt
start_date_time: String
canceled: Boolean
city: String
state: String
zip: String
country: String
time_zone: String
rounds: Int
created_at: String
updated_at: String
season_id: BigInt

Plays

player_holesPgaPlayerHoles
Hole-by-hole scoring for each player at each professional tournament — strokes and score relative to par per hole. (Shot-level tracking — drive distance, approach result, putts — is not carried here.)
Required filters: one of player_id | tournament_id.
Relations
  • tournamentPgaTournamentsThe golf.tournaments row referenced by tournament_id; null when unlinked.
  • playerPgaPlayersThe golf.players row referenced by player_id; null when unlinked.
  • player_roundPgaPlayerRoundsThe golf.player_rounds row referenced by player_round_id; null when unlinked.
Arguments (4)
  • firstIntPage size; clamped to the table's REST default/max limits.
  • afterBigIntKeyset cursor — returns rows with id > after, ordered by id ascending.
  • player_idIntFilter to a single player.
  • tournament_idIntFilter to a single tournament.
Columns (19) — full docs in the data dictionary
id: BigInt
tournament_id: BigInt
player_id: BigInt
player_round_id: BigInt
round_number: Int
hole_number: Int
par: Int
score: Int
to_par: Int
hole_in_one: Boolean
double_eagle: Boolean
eagle: Boolean
birdie: Boolean
is_par: Boolean
bogey: Boolean
double_bogey: Boolean
worse_than_double_bogey: Boolean
created_at: String
updated_at: String
player_roundsPgaPlayerRounds
Each player's scoring line for each round of every professional golf tournament — total strokes, score relative to par, eagles, birdies, bogeys, and double-bogeys. (Ball-striking detail — fairways, greens in regulation, putts — is not carried here.)
Required filters: one of player_id | tournament_id.
Relations
  • tournamentPgaTournamentsThe golf.tournaments row referenced by tournament_id; null when unlinked.
  • playerPgaPlayersThe golf.players row referenced by player_id; null when unlinked.
  • player_holes[PgaPlayerHoles!]!golf.player_holes rows whose player_round_id references this row.
Arguments (4)
  • firstIntPage size; clamped to the table's REST default/max limits.
  • afterBigIntKeyset cursor — returns rows with id > after, ordered by id ascending.
  • player_idIntFilter to a single player.
  • tournament_idIntFilter to a single tournament.
Columns (28) — full docs in the data dictionary
id: BigInt
tournament_id: BigInt
player_id: BigInt
player_round_id: Int
round_number: Int
day: String
tee_time: String
back_nine_start: Boolean
par: Int
score: Int
double_eagles: Int
eagles: Int
birdies: Int
pars: Int
bogeys: Int
double_bogeys: Int
worse_than_double_bogey: Int
triple_bogeys: Int
worse_than_triple_bogey: Int
holes_in_one: Int
created_at: String
updated_at: String
sg_total: Float
sg_off_tee: Float
sg_approach: Float
sg_around_green: Float
sg_putting: Float
sg_tee_to_green: Float
player_shotsPgaPlayerShots
Shot-by-shot tracking for each player at each professional tournament — every stroke with its type, start/end location, distance, ShotLink/TOURCAST course coordinates, and TrackMan radar metrics (club & ball speed, spin, launch angle, apex, carry). Available for regular PGA Tour events with ShotLink; majors such as the Masters do not publish shot tracking.
Required filters: one of player_id | tournament_id.
Relations
  • tournamentPgaTournamentsThe golf.tournaments row referenced by tournament_id; null when unlinked.
  • playerPgaPlayersThe golf.players row referenced by player_id; null when unlinked.
Arguments (4)
  • firstIntPage size; clamped to the table's REST default/max limits.
  • afterBigIntKeyset cursor — returns rows with id > after, ordered by id ascending.
  • player_idIntFilter to a single player.
  • tournament_idIntFilter to a single tournament.
Columns (32) — full docs in the data dictionary
id: BigInt
tournament_id: BigInt
player_id: BigInt
round_number: Int
hole_number: Int
shot_number: Int
par: Int
stroke_type: String
from_location: String
to_location: String
from_location_code: String
to_location_code: String
distance_yards: Float
distance_remaining_yards: Float
play_by_play: String
final_stroke: Boolean
from_x: Float
from_y: Float
from_z: Float
to_x: Float
to_y: Float
to_z: Float
club_speed: Float
ball_speed: Float
smash_factor: Float
launch_spin: Float
spin_axis: Float
launch_angle: Float
apex_height: Float
carry_distance: Float
created_at: String
updated_at: String
tournament_roundsPgaTournamentRounds
Each round of every professional golf tournament — round 1 (Thursday), round 2 (Friday cut day), and the weekend rounds (Saturday and Sunday) plus any playoff holes.
Required filters: one of tournament_id.
Relations
  • tournamentPgaTournamentsThe golf.tournaments row referenced by tournament_id; null when unlinked.
Arguments (3)
  • firstIntPage size; clamped to the table's REST default/max limits.
  • afterBigIntKeyset cursor — returns rows with id > after, ordered by id ascending.
  • tournament_idIntFilter to a single tournament.
Columns (7) — full docs in the data dictionary
id: BigInt
tournament_id: BigInt
round_id: Int
round_number: Int
day: String
created_at: String
updated_at: String

Stats

operator_player_lookupsPgaOperatorPlayerLookups
How each sportsbook and fantasy operator names every professional golfer — the mapping from each operator's player identifier to a unified player record.
Required filters: one of operator_id.
Relations
  • operatorReferenceOperatorsThe main.operators row referenced by operator_id; null when unlinked.
  • playerPgaPlayersThe golf.players row referenced by player_id; null when unlinked.
Arguments (4)
  • firstIntPage size; clamped to the table's REST default/max limits.
  • afterBigIntKeyset cursor — returns rows with id > after, ordered by id ascending.
  • operator_idIntFilter by operator.
  • player_idIntFilter to a single player.
Columns (7) — full docs in the data dictionary
id: BigInt
operator_id: BigInt
operator_player_id: String
player_id: BigInt
player_name: String
created_at: String
updated_at: String
player_season_statsPgaPlayerSeasonStats
Season totals for each professional golfer — events played, cuts made, top-10 finishes, wins, and prize money earned. Ball-striking and strokes-gained metrics are not carried here.
Required filters: one of season_id | player_id.
Relations
  • seasonPgaSeasonsThe golf.seasons row referenced by season_id; null when unlinked.
  • playerPgaPlayersThe golf.players row referenced by player_id; null when unlinked.
  • tourPgaToursThe golf.tours row referenced by tour_id; null when unlinked.
Arguments (5)
  • firstIntPage size; clamped to the table's REST default/max limits.
  • afterBigIntKeyset cursor — returns rows with id > after, ordered by id ascending.
  • season_idIntFilter to a single season. Defaults to the current season.
  • player_idIntFilter to a single player.
  • tour_idIntFilter by tour.
Columns (42) — full docs in the data dictionary
id: BigInt
player_id: BigInt
tour_id: BigInt
events: Int
cuts_made: Int
wins: Int
second_place: Int
third_place: Int
top_five: Int
top_ten: Int
top_twenty_five: Int
rounds: Int
total_strokes: Int
total_score: Int
double_eagles: Int
eagles: Int
birdies: Int
pars: Int
bogeys: Int
double_bogeys: Int
worse_than_double_bogey: Int
triple_bogeys: Int
worse_than_triple_bogey: Int
holes_in_one: Int
streaks_of_three_birdies_or_better: Int
bogey_free_rounds: Int
rounds_under_seventy: Int
bounce_back_count: Int
consecutive_birdie_or_better_count: Int
created_at: String
updated_at: String
driving_distance: Float
driving_accuracy_pct: Float
gir_pct: Float
putts_per_round: Float
scrambling_pct: Float
sg_total: Float
sg_off_tee: Float
sg_approach: Float
sg_around_green: Float
sg_putting: Float
season_id: BigInt
course_hole_statsPgaCourseHoleStats
Per-hole scoring statistics for each round of a tournament — par, yardage, the field's scoring average and its relation to par, and the distribution of eagles, birdies, pars, and bogeys, plus difficulty rank.
Required filters: one of tournament_id.
Relations
  • tournamentPgaTournamentsThe golf.tournaments row referenced by tournament_id; null when unlinked.
Arguments (3)
  • firstIntPage size; clamped to the table's REST default/max limits.
  • afterBigIntKeyset cursor — returns rows with id > after, ordered by id ascending.
  • tournament_idIntFilter to a single tournament.
Columns (17) — full docs in the data dictionary
id: BigInt
tournament_id: BigInt
course_code: String
round_number: Int
hole_number: Int
par: Int
yards: Int
scoring_average: Float
scoring_average_diff: Float
eagles: Int
birdies: Int
pars: Int
bogeys: Int
double_bogeys: Int
rank: Int
created_at: String
updated_at: String
leaderboardsPgaLeaderboards
The full leaderboard of every professional golf tournament — each player's position, score relative to par, total strokes, made cut/missed cut status, and prize money.
Required filters: one of tournament_id | player_id.
Relations
  • tournamentPgaTournamentsThe golf.tournaments row referenced by tournament_id; null when unlinked.
  • playerPgaPlayersThe golf.players row referenced by player_id; null when unlinked.
Arguments (4)
  • firstIntPage size; clamped to the table's REST default/max limits.
  • afterBigIntKeyset cursor — returns rows with id > after, ordered by id ascending.
  • tournament_idIntFilter to a single tournament.
  • player_idIntFilter to a single player.
Columns (25) — full docs in the data dictionary
id: BigInt
tournament_id: BigInt
player_tournament_id: Int
player_id: BigInt
rank: Int
total_score: Int
total_strokes: Int
total_through: Int
earnings: BigInt
fedex_pts: Int
made_cut: Int
made_cut_did_not_finish: Boolean
win: Int
is_alternate: Boolean
is_withdrawn: Boolean
tournament_status: String
tee_time: String
created_at: String
updated_at: String
sg_total: Float
sg_off_tee: Float
sg_approach: Float
sg_around_green: Float
sg_putting: Float
sg_tee_to_green: Float

Odds

tournament_oddsPgaTournamentOdds
Outright betting odds for professional golf tournaments — who wins the event, top-5/top-10/top-20 finish markets, head-to-head matchups, and other tournament-level wagers from sportsbooks.
Required filters: one of tournament_id.
Relations
  • tournamentPgaTournamentsThe golf.tournaments row referenced by tournament_id; null when unlinked.
  • playerPgaPlayersThe golf.players row referenced by player_id; null when unlinked.
  • matchup_opponentPgaPlayersThe golf.players row referenced by matchup_opponent_id; null when unlinked.
  • round_matchup_opponentPgaPlayersThe golf.players row referenced by round_matchup_opponent_id; null when unlinked.
  • three_ball_opponent1PgaPlayersThe golf.players row referenced by three_ball_opponent1_id; null when unlinked.
  • three_ball_opponent2PgaPlayersThe golf.players row referenced by three_ball_opponent2_id; null when unlinked.
Arguments (4)
  • firstIntPage size; clamped to the table's REST default/max limits.
  • afterBigIntKeyset cursor — returns rows with id > after, ordered by id ascending.
  • tournament_idIntFilter to a single tournament.
  • player_idIntFilter to a single player.
Columns (24) — full docs in the data dictionary
id: BigInt
tournament_id: BigInt
player_id: BigInt
sportsbook: String
is_available: Boolean
is_alternate: Boolean
outright_odds: Int
top_five_odds: Int
top_ten_odds: Int
top_twenty_odds: Int
make_cut_odds: Int
miss_cut_odds: Int
first_round_leader_odds: Int
matchup_opponent_id: BigInt
matchup_odds: Int
matchup_opponent_odds: Int
round_matchup_opponent_id: BigInt
round_matchup_odds: Int
round_matchup_opponent_odds: Int
three_ball_opponent1_id: BigInt
three_ball_opponent2_id: BigInt
three_ball_odds: Int
updated_at: String
created_at: String

Misc

toursPgaTours
Professional golf tours — the PGA Tour, LIV Golf, the DP World Tour (formerly European Tour), the Korn Ferry Tour, the LPGA, and other competitive circuits.
Relations
  • seasons[PgaSeasons!]!golf.seasons rows whose tour_id references this row.
  • tournaments[PgaTournaments!]!golf.tournaments rows whose tour_id references this row.
  • player_season_stats[PgaPlayerSeasonStats!]!golf.player_season_stats rows whose tour_id references this row.
Arguments (3)
  • firstIntPage size; clamped to the table's REST default/max limits.
  • afterBigIntKeyset cursor — returns rows with id > after, ordered by id ascending.
  • activeBooleanFilter by active status (defaults to true to show only currently-active rows; pass active=false to include inactive).
Columns (9) — full docs in the data dictionary
id: BigInt
name: String
code: String
tour_id: Int
description: String
active: Boolean
logo_url: String
created_at: String
updated_at: String
coursesPgaCourses
Golf courses that host professional events — Augusta National, Pebble Beach, St Andrews, TPC Sawgrass, and every other venue on the PGA, LIV, DP World, and Korn Ferry calendars.
Arguments (2)
  • firstIntPage size; clamped to the table's REST default/max limits.
  • afterBigIntKeyset cursor — returns rows with id > after, ordered by id ascending.
Columns (17) — full docs in the data dictionary
id: BigInt
name: String
league_course_id: Int
city: String
state: String
country: String
zip: String
longitude: Float
latitude: Float
elevation: Float
par: Int
yards: Int
timezone: String
address: String
image_url: String
created_at: String
updated_at: String
player_newsPgaPlayerNews
News about professional golfers — equipment changes, swing coach updates, sponsorships, tour-status changes, suspensions, and general beat-reporter updates.
Required filters: one of player_id | tournament_id.
Relations
  • playerPgaPlayersThe golf.players row referenced by player_id; null when unlinked.
  • tournamentPgaTournamentsThe golf.tournaments row referenced by tournament_id; null when unlinked.
Arguments (8)
  • firstIntPage size; clamped to the table's REST default/max limits.
  • afterBigIntKeyset cursor — returns rows with id > after, ordered by id ascending.
  • player_idIntFilter to a single player.
  • tournament_idIntFilter to a tournament.
  • news_timeStringFilter by publication time (ISO 8601). Use news_time__gte to poll for items since your last check.
  • news_time__gteStringgte comparison on news_time.
  • news_time__lteStringlte comparison on news_time.
  • news_time__betweenStringRange filter on news_time — pass "lo,hi".
Columns (19) — full docs in the data dictionary
id: BigInt
player_id: BigInt
tournament_id: BigInt
source: String
title: String
content: String
url: String
terms_of_use: String
author: String
categories: String
original_source: String
original_source_url: String
news_time: String
updated_time: String
priority: Int
created_at: String
updated_at: String
ai_processed: Boolean
situational_impact: JSON