PGA
15 tablesEvery 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
players
golf.playersEvery professional golfer — active tour members, conditional-status players, alumni who have competed at the highest level, and country-of-origin information.
▸Fields16
| Field | Type | References | Description |
|---|---|---|---|
| idkey | bigint | — | Primary Key |
| league_id | stringnullable | — | Official tour player identifier e.g. — (all-null in sample) |
| league_player_id | integer | Official PGA Tour player id e.g. — (all-null in sample) | |
| birth_city | stringnullable | — | — e.g. — (all-null in sample) |
| birth_country | stringnullable | — | — e.g. — (all-null in sample) |
| birth_date | datenullable | — | — e.g. — (all-null in sample) |
| birth_state | stringnullable | — | — e.g. — (all-null in sample) |
| college | stringnullable | — | — e.g. — (all-null in sample) |
| country | stringnullable | — | — e.g. — (all-null in sample) |
| first_name | string | — | — e.g. — (all-null in sample) |
| full_name | string | — | — e.g. — (all-null in sample) |
| last_name | string | — | — e.g. — (all-null in sample) |
| pga_debut_year | integernullable | — | — e.g. — (all-null in sample) |
| photo_url | stringnullable | — | — e.g. — (all-null in sample) |
| short_name | stringnullable | — | — e.g. — (all-null in sample) |
| swings | stringnullable | — | Right, Left e.g. — (all-null in sample) |
GET/api/v1/pga/playersList players for PGA
Parameters
limitqueryintegeroptionaldefault 50Page size. Defaults to 50; max 200.
from_idquerybigintoptionalReturn 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/jsonGET/api/v1/pga/players/{id}Get a single player by id
Parameters
idpathbigintrequiredPrimary 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.
seasons
golf.seasonsEach 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
| Field | Type | References | Description |
|---|---|---|---|
| start_yearkey | integer | — | — |
| tour_idkey | bigint | — | — e.g. — (all-null in sample) |
| league_id | stringnullable | — | Official tour season identifier e.g. — (all-null in sample) |
| description | stringnullable | — | — e.g. — (all-null in sample) |
| end_date | timestamptznullable | — | — e.g. — (all-null in sample) |
| start_date | timestamptz | — | — e.g. — (all-null in sample) |
GET/api/v1/pga/seasonsList seasons for PGA
Parameters
limitqueryintegeroptionaldefault 50Page 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/jsontournaments
golf.tournamentsEvery 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
| Field | Type | References | Description |
|---|---|---|---|
| idkey | bigint | — | Primary Key |
| league_id | stringnullable | — | Official tour tournament identifier e.g. — (all-null in sample) |
| season_tour_id | bigintnullable | — | |
| tour_id | bigintnullable | — e.g. — (all-null in sample) | |
| tournament_id | integer | — e.g. — (all-null in sample) | |
| canceled | boolean | — | — e.g. — (all-null in sample) |
| city | stringnullable | — | — e.g. — (all-null in sample) |
| country | stringnullable | — | — e.g. — (all-null in sample) |
| end_date | timestamptznullable | — | — e.g. — (all-null in sample) |
| is_in_progress | boolean | — | — e.g. — (all-null in sample) |
| is_over | boolean | — | — e.g. — (all-null in sample) |
| name | string | — | — e.g. — (all-null in sample) |
| par | integernullable | — | — e.g. — (all-null in sample) |
| purse | bigintnullable | — | Total prize money in cents e.g. — (all-null in sample) |
| rounds | integernullable | — | — e.g. — (all-null in sample) |
| season_start_year | integernullable | — | — |
| start_date | timestamptz | — | — e.g. — (all-null in sample) |
| start_date_time | timestamptznullable | — | — e.g. — (all-null in sample) |
| state | stringnullable | — | — e.g. — (all-null in sample) |
| time_zone | stringnullable | — | — e.g. — (all-null in sample) |
| venue | stringnullable | — | — e.g. — (all-null in sample) |
| yards | integernullable | — | — e.g. — (all-null in sample) |
| zip | stringnullable | — | — e.g. — (all-null in sample) |
GET/api/v1/pga/tournamentsList tournaments for PGA
Requires one of:
season_start_year + season_tour_id — requests satisfying none of these return 400.Parameters
season_start_yearqueryintegeroptionalFilter to a single season year. Defaults to the current season.
season_tour_idquerybigintoptionalFilter to a single tour within a season.
tour_idquerybigintoptionalFilter by tour.
limitqueryintegeroptionaldefault 50Page size. Defaults to 50; max 200.
from_idquerybigintoptionalReturn 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/jsonGET/api/v1/pga/tournaments/{id}Get a single tournament by id
Parameters
idpathbigintrequiredPrimary 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_holes
golf.player_holesHole-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
| Field | Type | References | Description |
|---|---|---|---|
| idkey | bigint | — | Primary Key |
| player_id | bigint | — e.g. — (all-null in sample) | |
| player_round_id | bigint | — | — e.g. — (all-null in sample) |
| tournament_id | bigint | — e.g. — (all-null in sample) | |
| birdie | booleannullable | — | — e.g. — (all-null in sample) |
| bogey | booleannullable | — | — e.g. — (all-null in sample) |
| double_bogey | booleannullable | — | — e.g. — (all-null in sample) |
| double_eagle | booleannullable | — | — e.g. — (all-null in sample) |
| eagle | booleannullable | — | — e.g. — (all-null in sample) |
| hole_in_one | booleannullable | — | — e.g. — (all-null in sample) |
| hole_number | integer | — | — e.g. — (all-null in sample) |
| is_par | booleannullable | — | — e.g. — (all-null in sample) |
| par | integernullable | — | — e.g. — (all-null in sample) |
| round_number | integer | — | — e.g. — (all-null in sample) |
| score | integernullable | — | — e.g. — (all-null in sample) |
| to_par | integernullable | — | Score relative to par for this hole e.g. — (all-null in sample) |
| worse_than_double_bogey | booleannullable | — | — e.g. — (all-null in sample) |
GET/api/v1/pga/player_holesList player_holes for PGA
Requires one of:
player_id or tournament_id — requests satisfying none of these return 400.Parameters
player_idquerybigintoptionalFilter to a single player.
tournament_idquerybigintoptionalFilter to a single tournament.
limitqueryintegeroptionaldefault 50Page size. Defaults to 50; max 200.
from_idquerybigintoptionalReturn 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/jsonGET/api/v1/pga/player_holes/{id}Get a single player_hole by id
Parameters
idpathbigintrequiredPrimary 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_rounds
golf.player_roundsEach 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
| Field | Type | References | Description |
|---|---|---|---|
| idkey | bigint | — | Primary Key |
| player_id | bigint | — e.g. — (all-null in sample) | |
| player_round_id | integer | — | — e.g. — (all-null in sample) |
| tournament_id | bigint | — e.g. — (all-null in sample) | |
| back_nine_start | booleannullable | — | — e.g. — (all-null in sample) |
| birdies | integernullable | — | — e.g. — (all-null in sample) |
| bogeys | integernullable | — | — e.g. — (all-null in sample) |
| day | datenullable | — | — e.g. — (all-null in sample) |
| double_bogeys | integernullable | — | — e.g. — (all-null in sample) |
| double_eagles | integernullable | — | — e.g. — (all-null in sample) |
| eagles | integernullable | — | — e.g. — (all-null in sample) |
| holes_in_one | integernullable | — | — e.g. — (all-null in sample) |
| par | integernullable | — | — e.g. — (all-null in sample) |
| pars | integernullable | — | — e.g. — (all-null in sample) |
| round_number | integer | — | — e.g. — (all-null in sample) |
| score | integernullable | — | Total strokes for round e.g. — (all-null in sample) |
| sg_approach | decimalnullable | — | — |
| sg_around_green | decimalnullable | — | — |
| sg_off_tee | decimalnullable | — | — |
| sg_putting | decimalnullable | — | — |
| sg_tee_to_green | decimalnullable | — | — |
| sg_total | decimalnullable | — | — |
| tee_time | timestamptznullable | — | — e.g. — (all-null in sample) |
| triple_bogeys | integernullable | — | — e.g. — (all-null in sample) |
| worse_than_double_bogey | integernullable | — | — e.g. — (all-null in sample) |
| worse_than_triple_bogey | integernullable | — | — e.g. — (all-null in sample) |
GET/api/v1/pga/player_roundsList player_rounds for PGA
Requires one of:
player_id or tournament_id — requests satisfying none of these return 400.Parameters
player_idquerybigintoptionalFilter to a single player.
tournament_idquerybigintoptionalFilter to a single tournament.
limitqueryintegeroptionaldefault 50Page size. Defaults to 50; max 200.
from_idquerybigintoptionalReturn 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/jsonGET/api/v1/pga/player_rounds/{id}Get a single player_round by id
Parameters
idpathbigintrequiredPrimary 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_shots
golf.player_shotsShot-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
| Field | Type | References | Description |
|---|---|---|---|
| idkey | bigint | — | Primary Key |
| player_id | bigint | — | |
| tournament_id | bigint | — | |
| apex_height | floatnullable | — | — |
| ball_speed | floatnullable | — | — |
| carry_distance | floatnullable | — | — |
| club_speed | floatnullable | — | — |
| distance_remaining_yards | floatnullable | — | Distance to the hole after the shot, in yards |
| distance_yards | floatnullable | — | Shot distance in yards (null when the source reports feet near the green) |
| final_stroke | booleannullable | — | — |
| from_location | stringnullable | — | — |
| from_location_code | stringnullable | — | — |
| from_x | floatnullable | — | — |
| from_y | floatnullable | — | — |
| from_z | floatnullable | — | — |
| hole_number | integer | — | — |
| launch_angle | floatnullable | — | Vertical launch angle (degrees) |
| launch_spin | floatnullable | — | — |
| par | integernullable | — | — |
| play_by_play | stringnullable | — | — |
| round_number | integer | — | — |
| shot_number | integer | — | Stroke sequence within the hole (1 = first stroke) |
| smash_factor | floatnullable | — | — |
| spin_axis | floatnullable | — | — |
| stroke_type | stringnullable | — | STROKE, PENALTY, DROP, PROVISIONAL |
| to_location | stringnullable | — | — |
| to_location_code | stringnullable | — | — |
| to_x | floatnullable | — | — |
| to_y | floatnullable | — | — |
| to_z | floatnullable | — | — |
GET/api/v1/pga/player_shotsList player_shots for PGA
Requires one of:
player_id or tournament_id — requests satisfying none of these return 400.Parameters
player_idquerybigintoptionalFilter to a single player.
tournament_idquerybigintoptionalFilter to a single tournament.
limitqueryintegeroptionaldefault 50Page size. Defaults to 50; max 200.
from_idquerybigintoptionalReturn 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/jsonGET/api/v1/pga/player_shots/{id}Get a single player_shot by id
Parameters
idpathbigintrequiredPrimary 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_rounds
golf.tournament_roundsEach 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
| Field | Type | References | Description |
|---|---|---|---|
| idkey | bigint | — | Primary Key |
| round_id | integer | — | — e.g. — (all-null in sample) |
| tournament_id | bigint | — e.g. — (all-null in sample) | |
| day | date | — | — e.g. — (all-null in sample) |
| round_number | integer | — | — e.g. — (all-null in sample) |
GET/api/v1/pga/tournament_roundsList tournament_rounds for PGA
Requires one of:
tournament_id — requests satisfying none of these return 400.Parameters
tournament_idquerybigintoptionalFilter to a single tournament.
limitqueryintegeroptionaldefault 50Page size. Defaults to 50; max 200.
from_idquerybigintoptionalReturn 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/jsonGET/api/v1/pga/tournament_rounds/{id}Get a single tournament_round by id
Parameters
idpathbigintrequiredPrimary 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_lookups
golf.operator_player_lookupsHow each sportsbook and fantasy operator names every professional golfer — the mapping from each operator's player identifier to a unified player record.
▸Fields5
| Field | Type | References | Description |
|---|---|---|---|
| idkey | bigint | — | Primary Key |
| operator_id | bigint | Operator id: 1 DraftKings, 2 FanDuel, 3 Yahoo, 13 sportsdata.io. e.g. — (all-null in sample) | |
| operator_player_id | string | External player ID from operator e.g. — (all-null in sample) | |
| player_id | bigint | Internal golf.players.id reference e.g. — (all-null in sample) | |
| player_name | stringnullable | — | Player name for reconciliation e.g. — (all-null in sample) |
GET/api/v1/pga/operator_player_lookupsList operator_player_lookups for PGA
Requires one of:
operator_id — requests satisfying none of these return 400.Parameters
operator_idquerybigintoptionalFilter by operator.
player_idquerybigintoptionalFilter to a single player.
limitqueryintegeroptionaldefault 50Page size. Defaults to 50; max 200.
from_idquerybigintoptionalReturn 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/jsonGET/api/v1/pga/operator_player_lookups/{id}Get a single operator_player_lookup by id
Parameters
idpathbigintrequiredPrimary 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_stats
golf.player_season_statsSeason 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
| Field | Type | References | Description |
|---|---|---|---|
| idkey | bigint | — | Primary Key |
| player_id | bigint | — e.g. — (all-null in sample) | |
| season_tour_id | bigintnullable | — | |
| tour_id | bigintnullable | — e.g. — (all-null in sample) | |
| birdies | integernullable | — | — e.g. — (all-null in sample) |
| bogey_free_rounds | integernullable | — | — e.g. — (all-null in sample) |
| bogeys | integernullable | — | — e.g. — (all-null in sample) |
| bounce_back_count | integernullable | — | — e.g. — (all-null in sample) |
| consecutive_birdie_or_better_count | integernullable | — | — e.g. — (all-null in sample) |
| cuts_made | integernullable | — | — e.g. — (all-null in sample) |
| double_bogeys | integernullable | — | — e.g. — (all-null in sample) |
| double_eagles | integernullable | — | — e.g. — (all-null in sample) |
| driving_accuracy_pct | decimalnullable | — | — |
| driving_distance | decimalnullable | — | Average driving distance in yards |
| eagles | integernullable | — | — e.g. — (all-null in sample) |
| events | integernullable | — | — e.g. — (all-null in sample) |
| gir_pct | decimalnullable | — | Greens in regulation percentage |
| holes_in_one | integernullable | — | — e.g. — (all-null in sample) |
| pars | integernullable | — | — e.g. — (all-null in sample) |
| putts_per_round | decimalnullable | — | — |
| rounds | integernullable | — | — e.g. — (all-null in sample) |
| rounds_under_seventy | integernullable | — | — e.g. — (all-null in sample) |
| scrambling_pct | decimalnullable | — | — |
| season_start_year | integernullable | — | — |
| second_place | integernullable | — | — e.g. — (all-null in sample) |
| sg_approach | decimalnullable | — | — |
| sg_around_green | decimalnullable | — | — |
| sg_off_tee | decimalnullable | — | — |
| sg_putting | decimalnullable | — | — |
| sg_total | decimalnullable | — | — |
| streaks_of_three_birdies_or_better | integernullable | — | — e.g. — (all-null in sample) |
| third_place | integernullable | — | — e.g. — (all-null in sample) |
| top_five | integernullable | — | — e.g. — (all-null in sample) |
| top_ten | integernullable | — | — e.g. — (all-null in sample) |
| top_twenty_five | integernullable | — | — e.g. — (all-null in sample) |
| total_score | integernullable | — | Total score relative to par e.g. — (all-null in sample) |
| total_strokes | integernullable | — | — e.g. — (all-null in sample) |
| triple_bogeys | integernullable | — | — e.g. — (all-null in sample) |
| wins | integernullable | — | — e.g. — (all-null in sample) |
| worse_than_double_bogey | integernullable | — | — e.g. — (all-null in sample) |
| worse_than_triple_bogey | integernullable | — | — e.g. — (all-null in sample) |
GET/api/v1/pga/player_season_statsList player_season_stats for PGA
Requires one of:
season_start_year + season_tour_id or player_id — requests satisfying none of these return 400.Parameters
season_start_yearqueryintegeroptionalFilter to a single season year. Defaults to the current season.
season_tour_idquerybigintoptionalFilter to a single tour within a season.
player_idquerybigintoptionalFilter to a single player.
tour_idquerybigintoptionalFilter by tour.
limitqueryintegeroptionaldefault 50Page size. Defaults to 50; max 200.
from_idquerybigintoptionalReturn 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/jsonGET/api/v1/pga/player_season_stats/{id}Get a single player_season_stat by id
Parameters
idpathbigintrequiredPrimary 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_stats
golf.course_hole_statsPer-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
| Field | Type | References | Description |
|---|---|---|---|
| idkey | bigint | — | Primary Key |
| tournament_id | bigint | — | |
| birdies | integernullable | — | — |
| bogeys | integernullable | — | — |
| course_code | string | — | PGA Tour course code (e.g., 014 = Augusta National) |
| double_bogeys | integernullable | — | — |
| eagles | integernullable | — | — |
| hole_number | integer | — | — |
| par | integernullable | — | — |
| pars | integernullable | — | — |
| rank | integernullable | — | Difficulty rank among holes (1 = hardest) |
| round_number | integer | — | — |
| scoring_average | decimalnullable | — | — |
| scoring_average_diff | decimalnullable | — | Scoring average relative to par |
| yards | integernullable | — | — |
GET/api/v1/pga/course_hole_statsList course_hole_stats for PGA
Requires one of:
tournament_id — requests satisfying none of these return 400.Parameters
tournament_idquerybigintoptionalFilter to a single tournament.
limitqueryintegeroptionaldefault 50Page size. Defaults to 50; max 200.
from_idquerybigintoptionalReturn 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/jsonGET/api/v1/pga/course_hole_stats/{id}Get a single course_hole_stat by id
Parameters
idpathbigintrequiredPrimary 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.
leaderboards
golf.leaderboardsThe 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
| Field | Type | References | Description |
|---|---|---|---|
| idkey | bigint | — | Primary Key |
| player_id | bigint | — e.g. — (all-null in sample) | |
| player_tournament_id | integer | — e.g. — (all-null in sample) | |
| tournament_id | bigint | — e.g. — (all-null in sample) | |
| earnings | bigintnullable | — | Prize money earned in cents e.g. — (all-null in sample) |
| fedex_pts | integernullable | — | — e.g. — (all-null in sample) |
| is_alternate | booleannullable | — | — e.g. — (all-null in sample) |
| is_withdrawn | booleannullable | — | — e.g. — (all-null in sample) |
| made_cut | integernullable | — | 1 if made cut, 0 if missed e.g. — (all-null in sample) |
| made_cut_did_not_finish | booleannullable | — | — e.g. — (all-null in sample) |
| rank | integernullable | — | — e.g. — (all-null in sample) |
| sg_approach | decimalnullable | — | — |
| sg_around_green | decimalnullable | — | — |
| sg_off_tee | decimalnullable | — | — |
| sg_putting | decimalnullable | — | — |
| sg_tee_to_green | decimalnullable | — | — |
| sg_total | decimalnullable | — | — |
| tee_time | timestamptznullable | — | — e.g. — (all-null in sample) |
| total_score | integernullable | — | Score relative to par e.g. — (all-null in sample) |
| total_strokes | integernullable | — | — e.g. — (all-null in sample) |
| total_through | integernullable | — | Current hole of player for current round e.g. — (all-null in sample) |
| tournament_status | stringnullable | — | out, active, etc. e.g. — (all-null in sample) |
| win | integernullable | — | 1 if won tournament e.g. — (all-null in sample) |
GET/api/v1/pga/leaderboardsList leaderboards for PGA
Requires one of:
tournament_id or player_id — requests satisfying none of these return 400.Parameters
tournament_idquerybigintoptionalFilter to a single tournament.
player_idquerybigintoptionalFilter to a single player.
limitqueryintegeroptionaldefault 50Page size. Defaults to 50; max 200.
from_idquerybigintoptionalReturn 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/jsonGET/api/v1/pga/leaderboards/{id}Get a single leaderboard by id
Parameters
idpathbigintrequiredPrimary 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_odds
golf.tournament_oddsOutright 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
| Field | Type | References | Description |
|---|---|---|---|
| idkey | bigint | — | Primary Key |
| matchup_opponent_id | bigintnullable | — | — e.g. — (all-null in sample) |
| player_id | bigint | — e.g. — (all-null in sample) | |
| round_matchup_opponent_id | bigintnullable | — | — e.g. — (all-null in sample) |
| three_ball_opponent1_id | bigintnullable | — | — e.g. — (all-null in sample) |
| three_ball_opponent2_id | bigintnullable | — | — e.g. — (all-null in sample) |
| tournament_id | bigint | — e.g. — (all-null in sample) | |
| first_round_leader_odds | integernullable | — | — e.g. — (all-null in sample) |
| is_alternate | booleannullable | — | — e.g. — (all-null in sample) |
| is_available | booleannullable | — | — e.g. — (all-null in sample) |
| make_cut_odds | integernullable | — | — e.g. — (all-null in sample) |
| matchup_odds | integernullable | — | — e.g. — (all-null in sample) |
| matchup_opponent_odds | integernullable | — | — e.g. — (all-null in sample) |
| miss_cut_odds | integernullable | — | — e.g. — (all-null in sample) |
| outright_odds | integernullable | — | Odds to win tournament (American format) e.g. — (all-null in sample) |
| round_matchup_odds | integernullable | — | — e.g. — (all-null in sample) |
| round_matchup_opponent_odds | integernullable | — | — e.g. — (all-null in sample) |
| sportsbook | stringnullable | — | DraftKings, FanDuel, BetMGM, etc. e.g. — (all-null in sample) |
| three_ball_odds | integernullable | — | — e.g. — (all-null in sample) |
| top_five_odds | integernullable | — | — e.g. — (all-null in sample) |
| top_ten_odds | integernullable | — | — e.g. — (all-null in sample) |
| top_twenty_odds | integernullable | — | — e.g. — (all-null in sample) |
GET/api/v1/pga/tournament_oddsList tournament_odds for PGA
Requires one of:
tournament_id — requests satisfying none of these return 400.Parameters
tournament_idquerybigintoptionalFilter to a single tournament.
player_idquerybigintoptionalFilter to a single player.
limitqueryintegeroptionaldefault 50Page size. Defaults to 50; max 200.
from_idquerybigintoptionalReturn 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/jsonGET/api/v1/pga/tournament_odds/{id}Get a single tournament_odd by id
Parameters
idpathbigintrequiredPrimary 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
tours
golf.toursProfessional 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
| Field | Type | References | Description |
|---|---|---|---|
| idkey | bigint | — | Primary Key |
| tour_id | integer | — e.g. — (all-null in sample) | |
| active | boolean | — | — e.g. — (all-null in sample) |
| code | string | — | Tour code (pga, european, liv, lpga, champions, korn_ferry) e.g. — (all-null in sample) |
| description | stringnullable | — | — e.g. — (all-null in sample) |
| logo_url | stringnullable | — | — e.g. — (all-null in sample) |
| name | string | — | — e.g. — (all-null in sample) |
GET/api/v1/pga/toursList tours for PGA
Parameters
activequerybooleanoptionalFilter by active status (defaults to true to show only currently-active rows; pass active=false to include inactive).
limitqueryintegeroptionaldefault 50Page size. Defaults to 50; max 200.
from_idquerybigintoptionalReturn 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/jsonGET/api/v1/pga/tours/{id}Get a single tour by id
Parameters
idpathbigintrequiredPrimary 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.
courses
golf.coursesGolf 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
| Field | Type | References | Description |
|---|---|---|---|
| idkey | bigint | — | Primary Key |
| league_course_id | integernullable | Official PGA Tour course id e.g. — (all-null in sample) | |
| address | stringnullable | — | — e.g. — (all-null in sample) |
| city | stringnullable | — | — e.g. — (all-null in sample) |
| country | stringnullable | — | — e.g. — (all-null in sample) |
| elevation | floatnullable | — | Elevation in feet above sea level e.g. — (all-null in sample) |
| image_url | stringnullable | — | URL to aerial/overview image of course e.g. — (all-null in sample) |
| latitude | floatnullable | — | — e.g. — (all-null in sample) |
| longitude | floatnullable | — | — e.g. — (all-null in sample) |
| name | string | — | — e.g. — (all-null in sample) |
| par | integer | — | — e.g. — (all-null in sample) |
| state | stringnullable | — | — e.g. — (all-null in sample) |
| timezone | stringnullable | — | IANA timezone (e.g., America/New_York) e.g. — (all-null in sample) |
| yards | integer | — | — e.g. — (all-null in sample) |
| zip | stringnullable | — | — e.g. — (all-null in sample) |
GET/api/v1/pga/coursesList courses for PGA
Parameters
limitqueryintegeroptionaldefault 50Page size. Defaults to 50; max 200.
from_idquerybigintoptionalReturn 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/jsonGET/api/v1/pga/courses/{id}Get a single course by id
Parameters
idpathbigintrequiredPrimary 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_news
golf.player_newsNews about professional golfers — equipment changes, swing coach updates, sponsorships, tour-status changes, suspensions, and general beat-reporter updates.
▸Fields18
| Field | Type | References | Description |
|---|---|---|---|
| idkey | bigint | — | Primary Key |
| player_id | bigintnullable | — e.g. — (all-null in sample) | |
| tournament_id | bigintnullable | — e.g. — (all-null in sample) | |
| ai_processed | boolean | — | — e.g. — (all-null in sample) |
| author | stringnullable | — | — e.g. — (all-null in sample) |
| categories | stringnullable | — | — e.g. — (all-null in sample) |
| content | stringnullable | — | — e.g. — (all-null in sample) |
| news_time | timestamptz | — | — e.g. — (all-null in sample) |
| original_source | stringnullable | — | — e.g. — (all-null in sample) |
| original_source_url | stringnullable | — | — e.g. — (all-null in sample) |
| priority | integer | — | — e.g. — (all-null in sample) |
| situational_impact | jsonbnullable | — | — e.g. — (all-null in sample) |
| source | stringnullable | — | — e.g. — (all-null in sample) |
| source_key | stringnullable | — | — |
| terms_of_use | stringnullable | — | — e.g. — (all-null in sample) |
| title | string | — | — e.g. — (all-null in sample) |
| updated_time | timestamptznullable | — | — e.g. — (all-null in sample) |
| url | stringnullable | — | — e.g. — (all-null in sample) |
GET/api/v1/pga/player_newsList player_news for PGA
Requires one of:
player_id or tournament_id — requests satisfying none of these return 400.Parameters
player_idquerybigintoptionalFilter to a single player.
tournament_idquerybigintoptionalFilter to a tournament.
news_timequerytimestamptzoptionalFilter 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 50Page size. Defaults to 50; max 200.
from_idquerybigintoptionalReturn 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/jsonGET/api/v1/pga/player_news/{id}Get a single player_new by id
Parameters
idpathbigintrequiredPrimary 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.