PGA

15 tables

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.

Machine-readable spec: /api/openapi/public.json (OpenAPI 3.1)

Main· 3 tables

playersgolf.players
Every professional golfer — active tour members, conditional-status players, alumni who have competed at the highest level, and country-of-origin information.
Fields16
FieldTypeReferencesDescription
idkeybigintPrimary Key
league_idstringnullableOfficial tour player identifier
e.g. — (all-null in sample)
league_player_idintegerOfficial PGA Tour player id
e.g. — (all-null in sample)
birth_citystringnullable
e.g. — (all-null in sample)
birth_countrystringnullable
e.g. — (all-null in sample)
birth_datedatenullable
e.g. — (all-null in sample)
birth_statestringnullable
e.g. — (all-null in sample)
collegestringnullable
e.g. — (all-null in sample)
countrystringnullable
e.g. — (all-null in sample)
first_namestring
e.g. — (all-null in sample)
full_namestring
e.g. — (all-null in sample)
last_namestring
e.g. — (all-null in sample)
pga_debut_yearintegernullable
e.g. — (all-null in sample)
photo_urlstringnullable
e.g. — (all-null in sample)
short_namestringnullable
e.g. — (all-null in sample)
swingsstringnullableRight, Left
e.g. — (all-null in sample)
GET/api/v1/pga/players
Parameters
limitqueryintegeroptionaldefault 50
Page size. Defaults to 50; max 200.
from_idquerybigintoptional
Return rows with id strictly greater than this value; page using the previous response's `next_from_id`. Omit on the first page.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/pga/players?limit=3'
Responses
200players rows matching the declared filter set, wrapped in { players, limit, next_from_id }. next_from_id is the last row's id on a full page — pass it back via ?from_id= to walk the full result; null marks the terminal page.application/jsonshow example ▸
400No declared filter set was satisfied — response body matches MissingRequiredFiltersError; pick one combo from the accepted-sets hint and resend.application/json
GET/api/v1/pga/players/{id}
Parameters
idpathbigintrequired
Primary key (id) of the player row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/pga/players/{pk_value}'
Responses
200Single player row.application/jsonshow example ▸
404Row not found.
seasonsgolf.seasons
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.
Fields6
FieldTypeReferencesDescription
start_yearkeyinteger
tour_idkeybigint
e.g. — (all-null in sample)
league_idstringnullableOfficial tour season identifier
e.g. — (all-null in sample)
descriptionstringnullable
e.g. — (all-null in sample)
end_datetimestamptznullable
e.g. — (all-null in sample)
start_datetimestamptz
e.g. — (all-null in sample)
GET/api/v1/pga/seasons
Parameters
limitqueryintegeroptionaldefault 50
Page size. Defaults to 50; max 200.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/pga/seasons?limit=3'
Responses
200seasons rows matching the declared filter set, wrapped in { seasons, limit, next_from_id }.application/jsonshow example ▸
400No declared filter set was satisfied — response body matches MissingRequiredFiltersError; pick one combo from the accepted-sets hint and resend.application/json
tournamentsgolf.tournaments
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.
Fields23
FieldTypeReferencesDescription
idkeybigintPrimary Key
league_idstringnullableOfficial tour tournament identifier
e.g. — (all-null in sample)
season_tour_idbigintnullable
tour_idbigintnullable
e.g. — (all-null in sample)
tournament_idinteger
e.g. — (all-null in sample)
canceledboolean
e.g. — (all-null in sample)
citystringnullable
e.g. — (all-null in sample)
countrystringnullable
e.g. — (all-null in sample)
end_datetimestamptznullable
e.g. — (all-null in sample)
is_in_progressboolean
e.g. — (all-null in sample)
is_overboolean
e.g. — (all-null in sample)
namestring
e.g. — (all-null in sample)
parintegernullable
e.g. — (all-null in sample)
pursebigintnullableTotal prize money in cents
e.g. — (all-null in sample)
roundsintegernullable
e.g. — (all-null in sample)
season_start_yearintegernullable
start_datetimestamptz
e.g. — (all-null in sample)
start_date_timetimestamptznullable
e.g. — (all-null in sample)
statestringnullable
e.g. — (all-null in sample)
time_zonestringnullable
e.g. — (all-null in sample)
venuestringnullable
e.g. — (all-null in sample)
yardsintegernullable
e.g. — (all-null in sample)
zipstringnullable
e.g. — (all-null in sample)
GET/api/v1/pga/tournaments
Requires one of: season_start_year + season_tour_id — requests satisfying none of these return 400.
Parameters
season_start_yearqueryintegeroptional
Filter to a single season year. Defaults to the current season.
season_tour_idquerybigintoptional
Filter to a single tour within a season.
tour_idquerybigintoptional
Filter by tour.
limitqueryintegeroptionaldefault 50
Page size. Defaults to 50; max 200.
from_idquerybigintoptional
Return rows with id strictly greater than this value; page using the previous response's `next_from_id`. Omit on the first page.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/pga/tournaments?season_start_year=1&season_tour_id=1'
Responses
200tournaments rows matching the declared filter set, wrapped in { tournaments, limit, next_from_id }. next_from_id is the last row's id on a full page — pass it back via ?from_id= to walk the full result; null marks the terminal page.application/jsonshow example ▸
400No declared filter set was satisfied — response body matches MissingRequiredFiltersError; pick one combo from the accepted-sets hint and resend.application/json
GET/api/v1/pga/tournaments/{id}
Parameters
idpathbigintrequired
Primary key (id) of the tournament row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/pga/tournaments/{pk_value}'
Responses
200Single tournament row.application/jsonshow example ▸
404Row not found.

Plays· 4 tables

player_holesgolf.player_holes
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.)
Fields17
FieldTypeReferencesDescription
idkeybigintPrimary Key
player_idbigint
e.g. — (all-null in sample)
player_round_idbigint
e.g. — (all-null in sample)
tournament_idbigint
e.g. — (all-null in sample)
birdiebooleannullable
e.g. — (all-null in sample)
bogeybooleannullable
e.g. — (all-null in sample)
double_bogeybooleannullable
e.g. — (all-null in sample)
double_eaglebooleannullable
e.g. — (all-null in sample)
eaglebooleannullable
e.g. — (all-null in sample)
hole_in_onebooleannullable
e.g. — (all-null in sample)
hole_numberinteger
e.g. — (all-null in sample)
is_parbooleannullable
e.g. — (all-null in sample)
parintegernullable
e.g. — (all-null in sample)
round_numberinteger
e.g. — (all-null in sample)
scoreintegernullable
e.g. — (all-null in sample)
to_parintegernullableScore relative to par for this hole
e.g. — (all-null in sample)
worse_than_double_bogeybooleannullable
e.g. — (all-null in sample)
GET/api/v1/pga/player_holes
Requires one of: player_id or tournament_id — requests satisfying none of these return 400.
Parameters
player_idquerybigintoptional
Filter to a single player.
tournament_idquerybigintoptional
Filter to a single tournament.
limitqueryintegeroptionaldefault 50
Page size. Defaults to 50; max 200.
from_idquerybigintoptional
Return rows with id strictly greater than this value; page using the previous response's `next_from_id`. Omit on the first page.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/pga/player_holes?player_id=1'
Responses
200player_holes rows matching the declared filter set, wrapped in { player_holes, limit, next_from_id }. next_from_id is the last row's id on a full page — pass it back via ?from_id= to walk the full result; null marks the terminal page.application/jsonshow example ▸
400No declared filter set was satisfied — response body matches MissingRequiredFiltersError; pick one combo from the accepted-sets hint and resend.application/json
GET/api/v1/pga/player_holes/{id}
Parameters
idpathbigintrequired
Primary key (id) of the player_hole row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/pga/player_holes/{pk_value}'
Responses
200Single player_hole row.application/jsonshow example ▸
404Row not found.
player_roundsgolf.player_rounds
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.)
Fields26
FieldTypeReferencesDescription
idkeybigintPrimary Key
player_idbigint
e.g. — (all-null in sample)
player_round_idinteger
e.g. — (all-null in sample)
tournament_idbigint
e.g. — (all-null in sample)
back_nine_startbooleannullable
e.g. — (all-null in sample)
birdiesintegernullable
e.g. — (all-null in sample)
bogeysintegernullable
e.g. — (all-null in sample)
daydatenullable
e.g. — (all-null in sample)
double_bogeysintegernullable
e.g. — (all-null in sample)
double_eaglesintegernullable
e.g. — (all-null in sample)
eaglesintegernullable
e.g. — (all-null in sample)
holes_in_oneintegernullable
e.g. — (all-null in sample)
parintegernullable
e.g. — (all-null in sample)
parsintegernullable
e.g. — (all-null in sample)
round_numberinteger
e.g. — (all-null in sample)
scoreintegernullableTotal strokes for round
e.g. — (all-null in sample)
sg_approachdecimalnullable
sg_around_greendecimalnullable
sg_off_teedecimalnullable
sg_puttingdecimalnullable
sg_tee_to_greendecimalnullable
sg_totaldecimalnullable
tee_timetimestamptznullable
e.g. — (all-null in sample)
triple_bogeysintegernullable
e.g. — (all-null in sample)
worse_than_double_bogeyintegernullable
e.g. — (all-null in sample)
worse_than_triple_bogeyintegernullable
e.g. — (all-null in sample)
GET/api/v1/pga/player_rounds
Requires one of: player_id or tournament_id — requests satisfying none of these return 400.
Parameters
player_idquerybigintoptional
Filter to a single player.
tournament_idquerybigintoptional
Filter to a single tournament.
limitqueryintegeroptionaldefault 50
Page size. Defaults to 50; max 200.
from_idquerybigintoptional
Return rows with id strictly greater than this value; page using the previous response's `next_from_id`. Omit on the first page.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/pga/player_rounds?player_id=1'
Responses
200player_rounds rows matching the declared filter set, wrapped in { player_rounds, limit, next_from_id }. next_from_id is the last row's id on a full page — pass it back via ?from_id= to walk the full result; null marks the terminal page.application/jsonshow example ▸
400No declared filter set was satisfied — response body matches MissingRequiredFiltersError; pick one combo from the accepted-sets hint and resend.application/json
GET/api/v1/pga/player_rounds/{id}
Parameters
idpathbigintrequired
Primary key (id) of the player_round row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/pga/player_rounds/{pk_value}'
Responses
200Single player_round row.application/jsonshow example ▸
404Row not found.
player_shotsgolf.player_shots
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.
Fields30
FieldTypeReferencesDescription
idkeybigintPrimary Key
player_idbigint
tournament_idbigint
apex_heightfloatnullable
ball_speedfloatnullable
carry_distancefloatnullable
club_speedfloatnullable
distance_remaining_yardsfloatnullableDistance to the hole after the shot, in yards
distance_yardsfloatnullableShot distance in yards (null when the source reports feet near the green)
final_strokebooleannullable
from_locationstringnullable
from_location_codestringnullable
from_xfloatnullable
from_yfloatnullable
from_zfloatnullable
hole_numberinteger
launch_anglefloatnullableVertical launch angle (degrees)
launch_spinfloatnullable
parintegernullable
play_by_playstringnullable
round_numberinteger
shot_numberintegerStroke sequence within the hole (1 = first stroke)
smash_factorfloatnullable
spin_axisfloatnullable
stroke_typestringnullableSTROKE, PENALTY, DROP, PROVISIONAL
to_locationstringnullable
to_location_codestringnullable
to_xfloatnullable
to_yfloatnullable
to_zfloatnullable
GET/api/v1/pga/player_shots
Requires one of: player_id or tournament_id — requests satisfying none of these return 400.
Parameters
player_idquerybigintoptional
Filter to a single player.
tournament_idquerybigintoptional
Filter to a single tournament.
limitqueryintegeroptionaldefault 50
Page size. Defaults to 50; max 200.
from_idquerybigintoptional
Return rows with id strictly greater than this value; page using the previous response's `next_from_id`. Omit on the first page.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/pga/player_shots?player_id=1'
Responses
200player_shots rows matching the declared filter set, wrapped in { player_shots, limit, next_from_id }. next_from_id is the last row's id on a full page — pass it back via ?from_id= to walk the full result; null marks the terminal page.application/jsonshow example ▸
400No declared filter set was satisfied — response body matches MissingRequiredFiltersError; pick one combo from the accepted-sets hint and resend.application/json
GET/api/v1/pga/player_shots/{id}
Parameters
idpathbigintrequired
Primary key (id) of the player_shot row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/pga/player_shots/{pk_value}'
Responses
200Single player_shot row.application/jsonshow example ▸
404Row not found.
tournament_roundsgolf.tournament_rounds
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.
Fields5
FieldTypeReferencesDescription
idkeybigintPrimary Key
round_idinteger
e.g. — (all-null in sample)
tournament_idbigint
e.g. — (all-null in sample)
daydate
e.g. — (all-null in sample)
round_numberinteger
e.g. — (all-null in sample)
GET/api/v1/pga/tournament_rounds
Requires one of: tournament_id — requests satisfying none of these return 400.
Parameters
tournament_idquerybigintoptional
Filter to a single tournament.
limitqueryintegeroptionaldefault 50
Page size. Defaults to 50; max 200.
from_idquerybigintoptional
Return rows with id strictly greater than this value; page using the previous response's `next_from_id`. Omit on the first page.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/pga/tournament_rounds?tournament_id=1'
Responses
200tournament_rounds rows matching the declared filter set, wrapped in { tournament_rounds, limit, next_from_id }. next_from_id is the last row's id on a full page — pass it back via ?from_id= to walk the full result; null marks the terminal page.application/jsonshow example ▸
400No declared filter set was satisfied — response body matches MissingRequiredFiltersError; pick one combo from the accepted-sets hint and resend.application/json
GET/api/v1/pga/tournament_rounds/{id}
Parameters
idpathbigintrequired
Primary key (id) of the tournament_round row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/pga/tournament_rounds/{pk_value}'
Responses
200Single tournament_round row.application/jsonshow example ▸
404Row not found.

Stats· 4 tables

operator_player_lookupsgolf.operator_player_lookups
How each sportsbook and fantasy operator names every professional golfer — the mapping from each operator's player identifier to a unified player record.
Fields5
FieldTypeReferencesDescription
idkeybigintPrimary Key
operator_idbigintOperator id: 1 DraftKings, 2 FanDuel, 3 Yahoo, 13 sportsdata.io.
e.g. — (all-null in sample)
operator_player_idstringExternal player ID from operator
e.g. — (all-null in sample)
player_idbigintInternal golf.players.id reference
e.g. — (all-null in sample)
player_namestringnullablePlayer name for reconciliation
e.g. — (all-null in sample)
GET/api/v1/pga/operator_player_lookups
Requires one of: operator_id — requests satisfying none of these return 400.
Parameters
operator_idquerybigintoptional
Filter by operator.
player_idquerybigintoptional
Filter to a single player.
limitqueryintegeroptionaldefault 50
Page size. Defaults to 50; max 200.
from_idquerybigintoptional
Return rows with id strictly greater than this value; page using the previous response's `next_from_id`. Omit on the first page.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/pga/operator_player_lookups?operator_id=1'
Responses
200operator_player_lookups rows matching the declared filter set, wrapped in { operator_player_lookups, limit, next_from_id }. next_from_id is the last row's id on a full page — pass it back via ?from_id= to walk the full result; null marks the terminal page.application/jsonshow example ▸
400No declared filter set was satisfied — response body matches MissingRequiredFiltersError; pick one combo from the accepted-sets hint and resend.application/json
GET/api/v1/pga/operator_player_lookups/{id}
Parameters
idpathbigintrequired
Primary key (id) of the operator_player_lookup row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/pga/operator_player_lookups/{pk_value}'
Responses
200Single operator_player_lookup row.application/jsonshow example ▸
404Row not found.
player_season_statsgolf.player_season_stats
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.
Fields41
FieldTypeReferencesDescription
idkeybigintPrimary Key
player_idbigint
e.g. — (all-null in sample)
season_tour_idbigintnullable
tour_idbigintnullable
e.g. — (all-null in sample)
birdiesintegernullable
e.g. — (all-null in sample)
bogey_free_roundsintegernullable
e.g. — (all-null in sample)
bogeysintegernullable
e.g. — (all-null in sample)
bounce_back_countintegernullable
e.g. — (all-null in sample)
consecutive_birdie_or_better_countintegernullable
e.g. — (all-null in sample)
cuts_madeintegernullable
e.g. — (all-null in sample)
double_bogeysintegernullable
e.g. — (all-null in sample)
double_eaglesintegernullable
e.g. — (all-null in sample)
driving_accuracy_pctdecimalnullable
driving_distancedecimalnullableAverage driving distance in yards
eaglesintegernullable
e.g. — (all-null in sample)
eventsintegernullable
e.g. — (all-null in sample)
gir_pctdecimalnullableGreens in regulation percentage
holes_in_oneintegernullable
e.g. — (all-null in sample)
parsintegernullable
e.g. — (all-null in sample)
putts_per_rounddecimalnullable
roundsintegernullable
e.g. — (all-null in sample)
rounds_under_seventyintegernullable
e.g. — (all-null in sample)
scrambling_pctdecimalnullable
season_start_yearintegernullable
second_placeintegernullable
e.g. — (all-null in sample)
sg_approachdecimalnullable
sg_around_greendecimalnullable
sg_off_teedecimalnullable
sg_puttingdecimalnullable
sg_totaldecimalnullable
streaks_of_three_birdies_or_betterintegernullable
e.g. — (all-null in sample)
third_placeintegernullable
e.g. — (all-null in sample)
top_fiveintegernullable
e.g. — (all-null in sample)
top_tenintegernullable
e.g. — (all-null in sample)
top_twenty_fiveintegernullable
e.g. — (all-null in sample)
total_scoreintegernullableTotal score relative to par
e.g. — (all-null in sample)
total_strokesintegernullable
e.g. — (all-null in sample)
triple_bogeysintegernullable
e.g. — (all-null in sample)
winsintegernullable
e.g. — (all-null in sample)
worse_than_double_bogeyintegernullable
e.g. — (all-null in sample)
worse_than_triple_bogeyintegernullable
e.g. — (all-null in sample)
GET/api/v1/pga/player_season_stats
Requires one of: season_start_year + season_tour_id or player_id — requests satisfying none of these return 400.
Parameters
season_start_yearqueryintegeroptional
Filter to a single season year. Defaults to the current season.
season_tour_idquerybigintoptional
Filter to a single tour within a season.
player_idquerybigintoptional
Filter to a single player.
tour_idquerybigintoptional
Filter by tour.
limitqueryintegeroptionaldefault 50
Page size. Defaults to 50; max 200.
from_idquerybigintoptional
Return rows with id strictly greater than this value; page using the previous response's `next_from_id`. Omit on the first page.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/pga/player_season_stats?season_start_year=1&season_tour_id=1'
Responses
200player_season_stats rows matching the declared filter set, wrapped in { player_season_stats, limit, next_from_id }. next_from_id is the last row's id on a full page — pass it back via ?from_id= to walk the full result; null marks the terminal page.application/jsonshow example ▸
400No declared filter set was satisfied — response body matches MissingRequiredFiltersError; pick one combo from the accepted-sets hint and resend.application/json
GET/api/v1/pga/player_season_stats/{id}
Parameters
idpathbigintrequired
Primary key (id) of the player_season_stat row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/pga/player_season_stats/{pk_value}'
Responses
200Single player_season_stat row.application/jsonshow example ▸
404Row not found.
course_hole_statsgolf.course_hole_stats
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.
Fields15
FieldTypeReferencesDescription
idkeybigintPrimary Key
tournament_idbigint
birdiesintegernullable
bogeysintegernullable
course_codestringPGA Tour course code (e.g., 014 = Augusta National)
double_bogeysintegernullable
eaglesintegernullable
hole_numberinteger
parintegernullable
parsintegernullable
rankintegernullableDifficulty rank among holes (1 = hardest)
round_numberinteger
scoring_averagedecimalnullable
scoring_average_diffdecimalnullableScoring average relative to par
yardsintegernullable
GET/api/v1/pga/course_hole_stats
Requires one of: tournament_id — requests satisfying none of these return 400.
Parameters
tournament_idquerybigintoptional
Filter to a single tournament.
limitqueryintegeroptionaldefault 50
Page size. Defaults to 50; max 200.
from_idquerybigintoptional
Return rows with id strictly greater than this value; page using the previous response's `next_from_id`. Omit on the first page.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/pga/course_hole_stats?tournament_id=1'
Responses
200course_hole_stats rows matching the declared filter set, wrapped in { course_hole_stats, limit, next_from_id }. next_from_id is the last row's id on a full page — pass it back via ?from_id= to walk the full result; null marks the terminal page.application/jsonshow example ▸
400No declared filter set was satisfied — response body matches MissingRequiredFiltersError; pick one combo from the accepted-sets hint and resend.application/json
GET/api/v1/pga/course_hole_stats/{id}
Parameters
idpathbigintrequired
Primary key (id) of the course_hole_stat row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/pga/course_hole_stats/{pk_value}'
Responses
200Single course_hole_stat row.application/jsonshow example ▸
404Row not found.
leaderboardsgolf.leaderboards
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.
Fields23
FieldTypeReferencesDescription
idkeybigintPrimary Key
player_idbigint
e.g. — (all-null in sample)
player_tournament_idinteger
e.g. — (all-null in sample)
tournament_idbigint
e.g. — (all-null in sample)
earningsbigintnullablePrize money earned in cents
e.g. — (all-null in sample)
fedex_ptsintegernullable
e.g. — (all-null in sample)
is_alternatebooleannullable
e.g. — (all-null in sample)
is_withdrawnbooleannullable
e.g. — (all-null in sample)
made_cutintegernullable1 if made cut, 0 if missed
e.g. — (all-null in sample)
made_cut_did_not_finishbooleannullable
e.g. — (all-null in sample)
rankintegernullable
e.g. — (all-null in sample)
sg_approachdecimalnullable
sg_around_greendecimalnullable
sg_off_teedecimalnullable
sg_puttingdecimalnullable
sg_tee_to_greendecimalnullable
sg_totaldecimalnullable
tee_timetimestamptznullable
e.g. — (all-null in sample)
total_scoreintegernullableScore relative to par
e.g. — (all-null in sample)
total_strokesintegernullable
e.g. — (all-null in sample)
total_throughintegernullableCurrent hole of player for current round
e.g. — (all-null in sample)
tournament_statusstringnullableout, active, etc.
e.g. — (all-null in sample)
winintegernullable1 if won tournament
e.g. — (all-null in sample)
GET/api/v1/pga/leaderboards
Requires one of: tournament_id or player_id — requests satisfying none of these return 400.
Parameters
tournament_idquerybigintoptional
Filter to a single tournament.
player_idquerybigintoptional
Filter to a single player.
limitqueryintegeroptionaldefault 50
Page size. Defaults to 50; max 200.
from_idquerybigintoptional
Return rows with id strictly greater than this value; page using the previous response's `next_from_id`. Omit on the first page.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/pga/leaderboards?tournament_id=1'
Responses
200leaderboards rows matching the declared filter set, wrapped in { leaderboards, limit, next_from_id }. next_from_id is the last row's id on a full page — pass it back via ?from_id= to walk the full result; null marks the terminal page.application/jsonshow example ▸
400No declared filter set was satisfied — response body matches MissingRequiredFiltersError; pick one combo from the accepted-sets hint and resend.application/json
GET/api/v1/pga/leaderboards/{id}
Parameters
idpathbigintrequired
Primary key (id) of the leaderboard row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/pga/leaderboards/{pk_value}'
Responses
200Single leaderboard row.application/jsonshow example ▸
404Row not found.

Odds· 1 table

tournament_oddsgolf.tournament_odds
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.
Fields22
FieldTypeReferencesDescription
idkeybigintPrimary Key
matchup_opponent_idbigintnullable
e.g. — (all-null in sample)
player_idbigint
e.g. — (all-null in sample)
round_matchup_opponent_idbigintnullable
e.g. — (all-null in sample)
three_ball_opponent1_idbigintnullable
e.g. — (all-null in sample)
three_ball_opponent2_idbigintnullable
e.g. — (all-null in sample)
tournament_idbigint
e.g. — (all-null in sample)
first_round_leader_oddsintegernullable
e.g. — (all-null in sample)
is_alternatebooleannullable
e.g. — (all-null in sample)
is_availablebooleannullable
e.g. — (all-null in sample)
make_cut_oddsintegernullable
e.g. — (all-null in sample)
matchup_oddsintegernullable
e.g. — (all-null in sample)
matchup_opponent_oddsintegernullable
e.g. — (all-null in sample)
miss_cut_oddsintegernullable
e.g. — (all-null in sample)
outright_oddsintegernullableOdds to win tournament (American format)
e.g. — (all-null in sample)
round_matchup_oddsintegernullable
e.g. — (all-null in sample)
round_matchup_opponent_oddsintegernullable
e.g. — (all-null in sample)
sportsbookstringnullableDraftKings, FanDuel, BetMGM, etc.
e.g. — (all-null in sample)
three_ball_oddsintegernullable
e.g. — (all-null in sample)
top_five_oddsintegernullable
e.g. — (all-null in sample)
top_ten_oddsintegernullable
e.g. — (all-null in sample)
top_twenty_oddsintegernullable
e.g. — (all-null in sample)
GET/api/v1/pga/tournament_odds
Requires one of: tournament_id — requests satisfying none of these return 400.
Parameters
tournament_idquerybigintoptional
Filter to a single tournament.
player_idquerybigintoptional
Filter to a single player.
limitqueryintegeroptionaldefault 50
Page size. Defaults to 50; max 200.
from_idquerybigintoptional
Return rows with id strictly greater than this value; page using the previous response's `next_from_id`. Omit on the first page.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/pga/tournament_odds?tournament_id=1'
Responses
200tournament_odds rows matching the declared filter set, wrapped in { tournament_odds, limit, next_from_id }. next_from_id is the last row's id on a full page — pass it back via ?from_id= to walk the full result; null marks the terminal page.application/jsonshow example ▸
400No declared filter set was satisfied — response body matches MissingRequiredFiltersError; pick one combo from the accepted-sets hint and resend.application/json
GET/api/v1/pga/tournament_odds/{id}
Parameters
idpathbigintrequired
Primary key (id) of the tournament_odd row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/pga/tournament_odds/{pk_value}'
Responses
200Single tournament_odd row.application/jsonshow example ▸
404Row not found.

Misc· 3 tables

toursgolf.tours
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.
Fields7
FieldTypeReferencesDescription
idkeybigintPrimary Key
tour_idinteger
e.g. — (all-null in sample)
activeboolean
e.g. — (all-null in sample)
codestringTour code (pga, european, liv, lpga, champions, korn_ferry)
e.g. — (all-null in sample)
descriptionstringnullable
e.g. — (all-null in sample)
logo_urlstringnullable
e.g. — (all-null in sample)
namestring
e.g. — (all-null in sample)
GET/api/v1/pga/tours
Parameters
activequerybooleanoptional
Filter by active status (defaults to true to show only currently-active rows; pass active=false to include inactive).
limitqueryintegeroptionaldefault 50
Page size. Defaults to 50; max 200.
from_idquerybigintoptional
Return rows with id strictly greater than this value; page using the previous response's `next_from_id`. Omit on the first page.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/pga/tours?limit=3'
Responses
200tours rows matching the declared filter set, wrapped in { tours, limit, next_from_id }. next_from_id is the last row's id on a full page — pass it back via ?from_id= to walk the full result; null marks the terminal page.application/jsonshow example ▸
400No declared filter set was satisfied — response body matches MissingRequiredFiltersError; pick one combo from the accepted-sets hint and resend.application/json
GET/api/v1/pga/tours/{id}
Parameters
idpathbigintrequired
Primary key (id) of the tour row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/pga/tours/{pk_value}'
Responses
200Single tour row.application/jsonshow example ▸
404Row not found.
coursesgolf.courses
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.
Fields15
FieldTypeReferencesDescription
idkeybigintPrimary Key
league_course_idintegernullableOfficial PGA Tour course id
e.g. — (all-null in sample)
addressstringnullable
e.g. — (all-null in sample)
citystringnullable
e.g. — (all-null in sample)
countrystringnullable
e.g. — (all-null in sample)
elevationfloatnullableElevation in feet above sea level
e.g. — (all-null in sample)
image_urlstringnullableURL to aerial/overview image of course
e.g. — (all-null in sample)
latitudefloatnullable
e.g. — (all-null in sample)
longitudefloatnullable
e.g. — (all-null in sample)
namestring
e.g. — (all-null in sample)
parinteger
e.g. — (all-null in sample)
statestringnullable
e.g. — (all-null in sample)
timezonestringnullableIANA timezone (e.g., America/New_York)
e.g. — (all-null in sample)
yardsinteger
e.g. — (all-null in sample)
zipstringnullable
e.g. — (all-null in sample)
GET/api/v1/pga/courses
Parameters
limitqueryintegeroptionaldefault 50
Page size. Defaults to 50; max 200.
from_idquerybigintoptional
Return rows with id strictly greater than this value; page using the previous response's `next_from_id`. Omit on the first page.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/pga/courses?limit=3'
Responses
200courses rows matching the declared filter set, wrapped in { courses, limit, next_from_id }. next_from_id is the last row's id on a full page — pass it back via ?from_id= to walk the full result; null marks the terminal page.application/jsonshow example ▸
400No declared filter set was satisfied — response body matches MissingRequiredFiltersError; pick one combo from the accepted-sets hint and resend.application/json
GET/api/v1/pga/courses/{id}
Parameters
idpathbigintrequired
Primary key (id) of the course row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/pga/courses/{pk_value}'
Responses
200Single course row.application/jsonshow example ▸
404Row not found.
player_newsgolf.player_news
News about professional golfers — equipment changes, swing coach updates, sponsorships, tour-status changes, suspensions, and general beat-reporter updates.
Fields18
FieldTypeReferencesDescription
idkeybigintPrimary Key
player_idbigintnullable
e.g. — (all-null in sample)
tournament_idbigintnullable
e.g. — (all-null in sample)
ai_processedboolean
e.g. — (all-null in sample)
authorstringnullable
e.g. — (all-null in sample)
categoriesstringnullable
e.g. — (all-null in sample)
contentstringnullable
e.g. — (all-null in sample)
news_timetimestamptz
e.g. — (all-null in sample)
original_sourcestringnullable
e.g. — (all-null in sample)
original_source_urlstringnullable
e.g. — (all-null in sample)
priorityinteger
e.g. — (all-null in sample)
situational_impactjsonbnullable
e.g. — (all-null in sample)
sourcestringnullable
e.g. — (all-null in sample)
source_keystringnullable
terms_of_usestringnullable
e.g. — (all-null in sample)
titlestring
e.g. — (all-null in sample)
updated_timetimestamptznullable
e.g. — (all-null in sample)
urlstringnullable
e.g. — (all-null in sample)
GET/api/v1/pga/player_news
Requires one of: player_id or tournament_id — requests satisfying none of these return 400.
Parameters
player_idquerybigintoptional
Filter to a single player.
tournament_idquerybigintoptional
Filter to a tournament.
news_timequerytimestamptzoptional
Filter by publication time (ISO 8601). Use news_time__gte to poll for items since your last check. Range syntax: news_time__gte=, news_time__lte=, news_time__between=.
limitqueryintegeroptionaldefault 50
Page size. Defaults to 50; max 200.
from_idquerybigintoptional
Return rows with id strictly greater than this value; page using the previous response's `next_from_id`. Omit on the first page.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/pga/player_news?player_id=1'
Responses
200player_news rows matching the declared filter set, wrapped in { player_news, limit, next_from_id }. next_from_id is the last row's id on a full page — pass it back via ?from_id= to walk the full result; null marks the terminal page.application/jsonshow example ▸
400No declared filter set was satisfied — response body matches MissingRequiredFiltersError; pick one combo from the accepted-sets hint and resend.application/json
GET/api/v1/pga/player_news/{id}
Parameters
idpathbigintrequired
Primary key (id) of the player_new row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/pga/player_news/{pk_value}'
Responses
200Single player_new row.application/jsonshow example ▸
404Row not found.