NAV
shell javascript python

PGA API

Welcome to the BALLDONTLIE PGA API. This reference combines the newest format-aware tournament endpoints with established endpoints for players, courses, statistics, scorecards, futures, and player props.

An API key is required. Create one at app.balldontlie.io, then read the authentication section.

The complete PGA OpenAPI specification includes the recommended endpoints documented here and older v1 contracts maintained for existing integrations.

Take a look at our other APIs, or join us on Discord.

Account Tiers

Higher tiers include endpoints available on lower tiers.

Endpoint Free ALL-STAR GOAT
Players Yes Yes Yes
Tournaments Yes Yes Yes
Courses Yes Yes Yes
Rounds Yes Yes Yes
Tournament Results No Yes Yes
Matches No Yes Yes
Tournament Course Stats No Yes Yes
Course Holes No Yes Yes
Tournament Competitors No No Yes
Tee Times No No Yes
Match Holes No No Yes
Player Round Results No No Yes
Player Round Stats No No Yes
Player Season Stats No No Yes
Player Scorecards No No Yes
Futures No No Yes
Current Player Props No No Yes
Opening Player Props No No Yes

Paid sport subscriptions apply to the selected sport. Visit app.balldontlie.io for current plan and request-limit details.

Authentication

Send your API key in every request:

curl "https://api.balldontlie.io/pga/v2/tournaments" \
  -H "Authorization: YOUR_API_KEY"
const response = await fetch(
  "https://api.balldontlie.io/pga/v2/tournaments",
  { headers: { Authorization: "YOUR_API_KEY" } }
);
console.log(await response.json());
import requests

response = requests.get(
    "https://api.balldontlie.io/pga/v2/tournaments",
    headers={"Authorization": "YOUR_API_KEY"},
)
response.raise_for_status()
print(response.json())

Pass your key in the Authorization header:

Authorization: YOUR_API_KEY

Pagination

Paginated endpoints return a meta object. Use per_page to request between 1 and 100 records; the default is 25. When next_cursor is present, pass it as cursor in the next request.

{
  "meta": {
    "next_cursor": 40,
    "per_page": 25
  }
}

The v2 rounds and match-holes endpoints are not paginated.

Errors

Status Meaning
400 One or more query parameters are invalid.
401 The API key is missing, invalid, or does not have access to the endpoint.
429 The request limit has been exceeded.
500 An unexpected error occurred.

Format Coverage

Request include_format=true from tournaments to receive format_type.

Format Primary v2 results Tee-time participants Match data
STROKE_PLAY Players Players Not applicable
TEAM_STROKE Teams Teams Not applicable
MATCH_PLAY Players Players Matches and holes
TEAM_CUP Cup teams Pairings or players Matches and holes

round_format describes the format used in a specific round and can vary within a team-cup tournament. UNKNOWN_SPECIAL_FORMAT identifies a format that is not yet modeled; richer downstream data is not guaranteed.

The retained v1 player scorecards and player round stats have established stroke-play coverage and can return empty arrays for non-stroke formats. Player round results are player-level projections and do not preserve team or match relationships. Team-stroke hole-level scorecards are not currently available. Futures and player props are market-dependent rather than guaranteed by tournament format.

Players

Get Players

curl --get "https://api.balldontlie.io/pga/v1/players" \
  -H "Authorization: YOUR_API_KEY" \
  --data-urlencode "player_ids[]=185" \
  --data-urlencode "per_page=1"
const url = new URL("https://api.balldontlie.io/pga/v1/players");
url.searchParams.append("player_ids[]", "185");
url.searchParams.set("per_page", "1");
const response = await fetch(url, { headers: { Authorization: "YOUR_API_KEY" } });
console.log(await response.json());
import requests

response = requests.get(
    "https://api.balldontlie.io/pga/v1/players",
    headers={"Authorization": "YOUR_API_KEY"},
    params=[("player_ids[]", 185), ("per_page", 1)],
)
response.raise_for_status()
print(response.json())

Real production response captured from the request above:

{
  "data": [
    {
      "id": 185,
      "first_name": "Scottie",
      "last_name": "Scheffler",
      "display_name": "Scottie Scheffler",
      "country": "United States",
      "country_code": "USA",
      "height": "6'3\"",
      "weight": "200",
      "birth_date": "Jun 21, 1996",
      "birthplace_city": "Ridgewood",
      "birthplace_state": "New Jersey",
      "birthplace_country": "United States",
      "turned_pro": "2018",
      "school": "University of Texas",
      "residence_city": "Dallas",
      "residence_state": "Texas",
      "residence_country": "United States",
      "owgr": 1,
      "active": true
    }
  ],
  "meta": {
    "next_cursor": 185,
    "per_page": 1
  }
}

Returns PGA players. This endpoint is available on the Free tier.

HTTP Request

GET https://api.balldontlie.io/pga/v1/players

Query Parameters

Parameter Type Required Description
player_ids[] integer[] No Filter by player IDs.
search string No Search by player name.
first_name string No Filter by first name.
last_name string No Filter by last name.
country string No Filter by country.
active boolean No Filter by active status.
cursor integer No Pagination cursor.
per_page integer No Results per page, up to 100.

Tournaments

Get Tournaments

curl --get "https://api.balldontlie.io/pga/v2/tournaments" \
  -H "Authorization: YOUR_API_KEY" \
  --data-urlencode "tournament_ids[]=40" \
  --data-urlencode "include_format=true" \
  --data-urlencode "per_page=1"
const url = new URL("https://api.balldontlie.io/pga/v2/tournaments");
url.searchParams.append("tournament_ids[]", "40");
url.searchParams.set("include_format", "true");
url.searchParams.set("per_page", "1");
const response = await fetch(url, { headers: { Authorization: "YOUR_API_KEY" } });
console.log(await response.json());
import requests

response = requests.get(
    "https://api.balldontlie.io/pga/v2/tournaments",
    headers={"Authorization": "YOUR_API_KEY"},
    params=[("tournament_ids[]", 40), ("include_format", "true"), ("per_page", 1)],
)
response.raise_for_status()
print(response.json())

Real production response captured from the request above:

{
  "data": [
    {
      "id": 40,
      "season": 2026,
      "name": "Wyndham Championship",
      "start_date": "2026-08-06",
      "end_date": "2026-08-09",
      "date_range": "Aug 6 - 9",
      "city": "Greensboro",
      "state": "North Carolina",
      "country": "United States of America",
      "course_name": "Sedgefield Country Club",
      "purse": "$8,500,000",
      "status": "COMPLETED",
      "status_state": "final",
      "champion": {
        "id": 10,
        "first_name": "Michael",
        "last_name": "Brennan",
        "display_name": "Michael Brennan",
        "country": "United States",
        "country_code": "USA",
        "height": "6'1\"",
        "weight": null,
        "birth_date": "Feb 9, 2002",
        "birthplace_city": "Leesburg",
        "birthplace_state": "Virginia",
        "birthplace_country": "United States",
        "turned_pro": "2024",
        "school": "Wake Forest University",
        "residence_city": "Jacksonville",
        "residence_state": "Florida",
        "residence_country": "United States",
        "owgr": 35,
        "active": true
      },
      "courses": [
        {
          "course": {
            "id": 18,
            "name": "Sedgefield Country Club",
            "city": "Greensboro",
            "state": "North Carolina",
            "country": "USA",
            "par": 70,
            "yardage": "7,131",
            "established": "1926",
            "architect": "Donald Ross",
            "fairway_grass": "Bermudagrass",
            "rough_grass": "Bermudagrass",
            "green_grass": "Bermudagrass"
          },
          "rounds": [
            1,
            2,
            3,
            4
          ]
        }
      ],
      "rounds": [
        { "round_number": 1, "status": "OFFICIAL", "status_state": "final" },
        { "round_number": 2, "status": "OFFICIAL", "status_state": "final" },
        { "round_number": 3, "status": "OFFICIAL", "status_state": "final" },
        { "round_number": 4, "status": "OFFICIAL", "status_state": "final" }
      ],
      "format_type": "STROKE_PLAY"
    }
  ],
  "meta": {
    "next_cursor": 40,
    "per_page": 1
  }
}

Returns tournaments with normalized date fields. format_type is present only when include_format=true; omit the parameter to preserve the original v2 tournament shape. This endpoint is available on the Free tier.

HTTP Request

GET https://api.balldontlie.io/pga/v2/tournaments

Query Parameters

Parameter Type Required Description
tournament_ids[] integer[] No Filter by tournament IDs.
season integer No Filter by season year.
status string No Filter by status.
include_format boolean No Include format_type. Defaults to false.
cursor integer No Pagination cursor.
per_page integer No Results per page, from 1 to 100.

Courses

Get Courses

curl --get "https://api.balldontlie.io/pga/v1/courses" \
  -H "Authorization: YOUR_API_KEY" \
  --data-urlencode "course_ids[]=18" \
  --data-urlencode "per_page=1"
const url = new URL("https://api.balldontlie.io/pga/v1/courses");
url.searchParams.append("course_ids[]", "18");
url.searchParams.set("per_page", "1");
const response = await fetch(url, { headers: { Authorization: "YOUR_API_KEY" } });
console.log(await response.json());
import requests

response = requests.get(
    "https://api.balldontlie.io/pga/v1/courses",
    headers={"Authorization": "YOUR_API_KEY"},
    params=[("course_ids[]", 18), ("per_page", 1)],
)
response.raise_for_status()
print(response.json())

Real production response captured from the request above:

{
  "data": [
    {
      "id": 18,
      "name": "Sedgefield Country Club",
      "city": "Greensboro",
      "state": "North Carolina",
      "country": "USA",
      "par": 70,
      "yardage": "7,131",
      "established": "1926",
      "architect": "Donald Ross",
      "fairway_grass": "Bermudagrass",
      "rough_grass": "Bermudagrass",
      "green_grass": "Bermudagrass"
    }
  ],
  "meta": {
    "next_cursor": 18,
    "per_page": 1
  }
}

Returns PGA courses. This endpoint is available on the Free tier.

HTTP Request

GET https://api.balldontlie.io/pga/v1/courses

Query Parameters

Parameter Type Required Description
course_ids[] integer[] No Filter by course IDs.
search string No Search by course name.
cursor integer No Pagination cursor.
per_page integer No Results per page, up to 100.

Tournament Competitors

Get Tournament Competitors

curl --get "https://api.balldontlie.io/pga/v2/tournament_competitors" \
  -H "Authorization: YOUR_API_KEY" \
  --data-urlencode "tournament_id=85" \
  --data-urlencode "competitor_types[]=PAIRING" \
  --data-urlencode "per_page=1"
const url = new URL("https://api.balldontlie.io/pga/v2/tournament_competitors");
url.searchParams.set("tournament_id", "85");
url.searchParams.append("competitor_types[]", "PAIRING");
url.searchParams.set("per_page", "1");
const response = await fetch(url, { headers: { Authorization: "YOUR_API_KEY" } });
console.log(await response.json());
import requests

response = requests.get(
    "https://api.balldontlie.io/pga/v2/tournament_competitors",
    headers={"Authorization": "YOUR_API_KEY"},
    params=[("tournament_id", 85), ("competitor_types[]", "PAIRING"), ("per_page", 1)],
)
response.raise_for_status()
print(response.json())

Real production response captured from the request above:

{
  "data": [
    {
      "id": 1836,
      "type": "PAIRING",
      "player": null,
      "roster": [],
      "country": null,
      "members": [
        {
          "role": "member",
          "player": {
            "id": 185,
            "country": "United States",
            "last_name": "Scheffler",
            "first_name": "Scottie",
            "country_code": "USA",
            "display_name": "Scottie Scheffler"
          },
          "display_order": 1
        },
        {
          "role": "member",
          "player": {
            "id": 75,
            "country": "United States",
            "last_name": "Henley",
            "first_name": "Russell",
            "country_code": "USA",
            "display_name": "Russell Henley"
          },
          "display_order": 2
        }
      ],
      "team_name": "United States",
      "short_name": "S. Scheffler / R. Henley",
      "team_color": "#ED0000",
      "country_code": null,
      "display_name": "Scottie Scheffler / Russell Henley",
      "tournament_id": 85,
      "parent_competitor_id": 340910
    }
  ],
  "meta": {
    "next_cursor": 1836,
    "per_page": 1
  }
}

Returns players, teams, cup teams, and pairings for one tournament. A competitor ID is distinct from a player ID for non-player competitors. Requires GOAT tier.

HTTP Request

GET https://api.balldontlie.io/pga/v2/tournament_competitors

Query Parameters

Parameter Type Required Description
tournament_id integer Yes Tournament ID.
competitor_types[] string[] No Filter by PLAYER, TEAM, CUP_TEAM, or PAIRING.
cursor integer No Pagination cursor.
per_page integer No Results per page, from 1 to 100.

Tournament Results

Get Tournament Results

curl --get "https://api.balldontlie.io/pga/v2/tournament_results" \
  -H "Authorization: YOUR_API_KEY" \
  --data-urlencode "tournament_id=94" \
  --data-urlencode "per_page=1"
const url = new URL("https://api.balldontlie.io/pga/v2/tournament_results");
url.searchParams.set("tournament_id", "94");
url.searchParams.set("per_page", "1");
const response = await fetch(url, { headers: { Authorization: "YOUR_API_KEY" } });
console.log(await response.json());
import requests

response = requests.get(
    "https://api.balldontlie.io/pga/v2/tournament_results",
    headers={"Authorization": "YOUR_API_KEY"},
    params={"tournament_id": 94, "per_page": 1},
)
response.raise_for_status()
print(response.json())

Real production response captured from the request above:

{
  "data": [
    {
      "id": 236228,
      "thru": null,
      "course": null,
      "result": null,
      "rounds": [
        {
          "id": 732997,
          "score": 57,
          "points": null,
          "status": null,
          "tee_time": null,
          "round_format": "TEAM_STROKE",
          "round_number": 1,
          "score_display": "57",
          "starting_hole": null,
          "par_relative_score": null
        },
        {
          "id": 732998,
          "score": 68,
          "points": null,
          "status": null,
          "tee_time": null,
          "round_format": "TEAM_STROKE",
          "round_number": 2,
          "score_display": "68",
          "starting_hole": null,
          "par_relative_score": null
        },
        {
          "id": 732999,
          "score": 63,
          "points": null,
          "status": null,
          "tee_time": null,
          "round_format": "TEAM_STROKE",
          "round_number": 3,
          "score_display": "63",
          "starting_hole": null,
          "par_relative_score": null
        }
      ],
      "status": "1",
      "scoring": {
        "points": null,
        "to_par": -28,
        "strokes": 188,
        "score_display": "-28"
      },
      "earnings": null,
      "made_cut": null,
      "position": "1",
      "tee_time": null,
      "competitor": {
        "id": 62906,
        "type": "TEAM",
        "player": null,
        "display_name": "Coughlin / Novak",
        "parent_competitor_id": null
      },
      "tournament": {
        "id": 94,
        "name": "Grant Thornton Invitational",
        "format_type": "TEAM_STROKE"
      },
      "group_number": null,
      "current_round": null,
      "position_numeric": 1
    }
  ],
  "meta": {
    "next_cursor": 236228,
    "per_page": 1
  }
}

Returns the primary result population for a tournament: players for stroke and match play, teams for team stroke, and cup teams for team cup. competitor_ids[] accepts competitor IDs, not player IDs. Requires ALL-STAR tier.

HTTP Request

GET https://api.balldontlie.io/pga/v2/tournament_results

Query Parameters

Parameter Type Required Description
tournament_id integer Yes Tournament ID.
competitor_ids[] integer[] No Filter by competitor IDs.
cursor integer No Pagination cursor.
per_page integer No Results per page, from 1 to 100.

Rounds

Get Rounds

curl --get "https://api.balldontlie.io/pga/v2/rounds" \
  -H "Authorization: YOUR_API_KEY" \
  --data-urlencode "tournament_id=94"
const url = new URL("https://api.balldontlie.io/pga/v2/rounds");
url.searchParams.set("tournament_id", "94");
const response = await fetch(url, { headers: { Authorization: "YOUR_API_KEY" } });
console.log(await response.json());
import requests

response = requests.get(
    "https://api.balldontlie.io/pga/v2/rounds",
    headers={"Authorization": "YOUR_API_KEY"},
    params={"tournament_id": 94},
)
response.raise_for_status()
print(response.json())

Real production response captured from the request above:

{
  "data": [
    {
      "id": 58,
      "tournament_id": 94,
      "round_number": 1,
      "status": "OFFICIAL",
      "status_state": "final",
      "round_format": "TEAM_STROKE",
      "course": null
    },
    {
      "id": 59,
      "tournament_id": 94,
      "round_number": 2,
      "status": "OFFICIAL",
      "status_state": "final",
      "round_format": "TEAM_STROKE",
      "course": null
    },
    {
      "id": 60,
      "tournament_id": 94,
      "round_number": 3,
      "status": "OFFICIAL",
      "status_state": "final",
      "round_format": "TEAM_STROKE",
      "course": null
    }
  ]
}

Returns every known round and its round-specific format. This endpoint is available on the Free tier and is not paginated.

HTTP Request

GET https://api.balldontlie.io/pga/v2/rounds

Query Parameters

Parameter Type Required Description
tournament_id integer Yes Tournament ID.

Tee Times

Get Tee Times

curl --get "https://api.balldontlie.io/pga/v2/tee_times" \
  -H "Authorization: YOUR_API_KEY" \
  --data-urlencode "tournament_id=85" \
  --data-urlencode "round_number=1" \
  --data-urlencode "per_page=1"
const url = new URL("https://api.balldontlie.io/pga/v2/tee_times");
url.searchParams.set("tournament_id", "85");
url.searchParams.set("round_number", "1");
url.searchParams.set("per_page", "1");
const response = await fetch(url, { headers: { Authorization: "YOUR_API_KEY" } });
console.log(await response.json());
import requests

response = requests.get(
    "https://api.balldontlie.io/pga/v2/tee_times",
    headers={"Authorization": "YOUR_API_KEY"},
    params={"tournament_id": 85, "round_number": 1, "per_page": 1},
)
response.raise_for_status()
print(response.json())

Real production response captured from the request above:

{
  "data": [
    {
      "id": 4112600,
      "state": null,
      "course": null,
      "status": "Final",
      "match_id": 313,
      "tee_time": "2025-09-26T11:10:00.000Z",
      "back_nine": false,
      "start_tee": 1,
      "group_number": null,
      "participants": [
        {
          "id": 11388499,
          "player": null,
          "competitor": {
            "id": 67701,
            "type": "PAIRING",
            "player": null,
            "display_name": "Bryson DeChambeau / Justin Thomas",
            "parent_competitor_id": 340910
          },
          "display_order": 1
        },
        {
          "id": 11388500,
          "player": null,
          "competitor": {
            "id": 80997,
            "type": "PAIRING",
            "player": null,
            "display_name": "Jon Rahm / Tyrrell Hatton",
            "parent_competitor_id": 340911
          },
          "display_order": 2
        }
      ],
      "round_format": "ALTERNATE_SHOT",
      "round_number": 1,
      "tournament_id": 85
    }
  ],
  "meta": {
    "next_cursor": 4112600,
    "per_page": 1
  }
}

Returns tee groups with complete participant arrays. match_id connects a tee group to a match when available. Requires GOAT tier.

HTTP Request

GET https://api.balldontlie.io/pga/v2/tee_times

Query Parameters

Parameter Type Required Description
tournament_id integer Yes Tournament ID.
round_number integer No Filter by round number.
cursor integer No Pagination cursor.
per_page integer No Results per page, from 1 to 100.

Matches

Get Matches

curl --get "https://api.balldontlie.io/pga/v2/matches" \
  -H "Authorization: YOUR_API_KEY" \
  --data-urlencode "tournament_id=85" \
  --data-urlencode "round_number=1" \
  --data-urlencode "per_page=1"
const url = new URL("https://api.balldontlie.io/pga/v2/matches");
url.searchParams.set("tournament_id", "85");
url.searchParams.set("round_number", "1");
url.searchParams.set("per_page", "1");
const response = await fetch(url, { headers: { Authorization: "YOUR_API_KEY" } });
console.log(await response.json());
import requests

response = requests.get(
    "https://api.balldontlie.io/pga/v2/matches",
    headers={"Authorization": "YOUR_API_KEY"},
    params={"tournament_id": 85, "round_number": 1, "per_page": 1},
)
response.raise_for_status()
print(response.json())

Real production response captured from the request above:

{
  "data": [
    {
      "id": 313,
      "thru": null,
      "sides": [
        {
          "id": 626,
          "seed": null,
          "team": {
            "id": 340910,
            "type": "CUP_TEAM",
            "player": null,
            "display_name": "USA",
            "parent_competitor_id": null
          },
          "score": "4 DN",
          "record": null,
          "result": "UNKNOWN",
          "status": "UNKNOWN",
          "competitor": {
            "id": 67701,
            "type": "PAIRING",
            "player": null,
            "display_name": "Bryson DeChambeau / Justin Thomas",
            "parent_competitor_id": 340910
          },
          "side_index": 1,
          "bracket_seed": null,
          "score_numeric": null,
          "points_awarded": null
        },
        {
          "id": 627,
          "seed": null,
          "team": {
            "id": 340911,
            "type": "CUP_TEAM",
            "player": null,
            "display_name": "Europe",
            "parent_competitor_id": null
          },
          "score": "4 UP",
          "record": null,
          "result": "WINS",
          "status": "WINS",
          "competitor": {
            "id": 80997,
            "type": "PAIRING",
            "player": null,
            "display_name": "Jon Rahm / Tyrrell Hatton",
            "parent_competitor_id": 340911
          },
          "side_index": 2,
          "bracket_seed": null,
          "score_numeric": null,
          "points_awarded": null
        }
      ],
      "title": "Match 1",
      "status": "Final",
      "location": "Round Complete",
      "tee_time": "1969-12-31T23:59:59.000Z",
      "tournament": {
        "id": 85,
        "name": "Ryder Cup",
        "format_type": "TEAM_CUP"
      },
      "match_score": "4 & 3",
      "bracket_name": null,
      "holes_played": null,
      "round_format": "ALTERNATE_SHOT",
      "round_number": 1,
      "starting_tee": "1",
      "display_score": "4 & 3",
      "round_display": "Friday Foursomes",
      "bracket_number": null,
      "location_description": null
    }
  ],
  "meta": {
    "next_cursor": 313,
    "per_page": 1
  }
}

Returns match-play and team-cup matches. Stroke and team-stroke tournaments return an empty data array because matches do not apply. Requires ALL-STAR tier.

HTTP Request

GET https://api.balldontlie.io/pga/v2/matches

Query Parameters

Parameter Type Required Description
tournament_id integer Yes Tournament ID.
round_number integer No Filter by round number.
cursor integer No Pagination cursor.
per_page integer No Results per page, from 1 to 100.

Match Holes

Get Match Holes

curl --get "https://api.balldontlie.io/pga/v2/match_holes" \
  -H "Authorization: YOUR_API_KEY" \
  --data-urlencode "match_id=313"
const url = new URL("https://api.balldontlie.io/pga/v2/match_holes");
url.searchParams.set("match_id", "313");
const response = await fetch(url, { headers: { Authorization: "YOUR_API_KEY" } });
console.log(await response.json());
import requests

response = requests.get(
    "https://api.balldontlie.io/pga/v2/match_holes",
    headers={"Authorization": "YOUR_API_KEY"},
    params={"match_id": 313},
)
response.raise_for_status()
print(response.json())

Real production response excerpt containing the first of 18 returned holes:

{
  "data": [
    {
      "id": 5608,
      "par": 4,
      "scores": [
        {
          "id": 13015,
          "par": 4,
          "scope": "team",
          "score": 3,
          "player": null,
          "result": null,
          "status": "BIRDIE",
          "side_id": 626,
          "competitor": {
            "id": 67701,
            "type": "PAIRING",
            "player": null,
            "display_name": "Bryson DeChambeau / Justin Thomas",
            "parent_competitor_id": 340910
          },
          "side_index": 1,
          "score_display": "3",
          "course_hole_number": 1
        },
        {
          "id": 13016,
          "par": 4,
          "scope": "team",
          "score": 4,
          "player": null,
          "result": null,
          "status": "PAR",
          "side_id": 627,
          "competitor": {
            "id": 80997,
            "type": "PAIRING",
            "player": null,
            "display_name": "Jon Rahm / Tyrrell Hatton",
            "parent_competitor_id": 340911
          },
          "side_index": 2,
          "score_display": "4",
          "course_hole_number": 1
        }
      ],
      "status": "PLAYED",
      "match_id": 313,
      "hole_number": 1,
      "display_value": "1UP",
      "course_hole_number": 1
    }
  ]
}

Returns hole-by-hole side and player scoring for one match. This endpoint is not paginated and requires GOAT tier.

HTTP Request

GET https://api.balldontlie.io/pga/v2/match_holes

Query Parameters

Parameter Type Required Description
match_id integer Yes Match ID returned by the matches endpoint.

Tournament Course Stats

Get Tournament Course Stats

curl --get "https://api.balldontlie.io/pga/v1/tournament_course_stats" \
  -H "Authorization: YOUR_API_KEY" \
  --data-urlencode "tournament_ids[]=40" \
  --data-urlencode "per_page=1"
const url = new URL("https://api.balldontlie.io/pga/v1/tournament_course_stats");
url.searchParams.append("tournament_ids[]", "40");
url.searchParams.set("per_page", "1");
const response = await fetch(url, { headers: { Authorization: "YOUR_API_KEY" } });
console.log(await response.json());
import requests

response = requests.get(
    "https://api.balldontlie.io/pga/v1/tournament_course_stats",
    headers={"Authorization": "YOUR_API_KEY"},
    params=[("tournament_ids[]", 40), ("per_page", 1)],
)
response.raise_for_status()
print(response.json())

Real production response captured from the request above:

{
  "data": [
    {
      "tournament": {
        "id": 40,
        "season": 2026,
        "name": "Wyndham Championship",
        "start_date": "2026-08-06T00:00:00.000Z",
        "end_date": "Aug 6 - 9",
        "city": "Greensboro",
        "state": "North Carolina",
        "country": "United States of America",
        "course_name": "Sedgefield Country Club",
        "purse": "$8,500,000",
        "status": "COMPLETED",
        "status_state": "final",
        "champion": {
          "id": 10,
          "first_name": "Michael",
          "last_name": "Brennan",
          "display_name": "Michael Brennan",
          "country": "United States",
          "country_code": "USA",
          "height": "6'1\"",
          "weight": null,
          "birth_date": "Feb 9, 2002",
          "birthplace_city": "Leesburg",
          "birthplace_state": "Virginia",
          "birthplace_country": "United States",
          "turned_pro": "2024",
          "school": "Wake Forest University",
          "residence_city": "Jacksonville",
          "residence_state": "Florida",
          "residence_country": "United States",
          "owgr": 35,
          "active": true
        },
        "courses": [],
        "rounds": []
      },
      "course": {
        "id": 18,
        "name": "Sedgefield Country Club",
        "city": "Greensboro",
        "state": "North Carolina",
        "country": "USA",
        "par": 70,
        "yardage": "7,131",
        "established": "1926",
        "architect": "Donald Ross",
        "fairway_grass": "Bermudagrass",
        "rough_grass": "Bermudagrass",
        "green_grass": "Bermudagrass"
      },
      "hole_number": 1,
      "round_number": null,
      "scoring_average": 4.026,
      "scoring_diff": 0.026,
      "difficulty_rank": 7,
      "eagles": 0,
      "birdies": 69,
      "pars": 312,
      "bogeys": 66,
      "double_bogeys": 3
    }
  ],
  "meta": {
    "next_cursor": 29953,
    "per_page": 1
  }
}

Returns hole-level course statistics for tournaments. Requires ALL-STAR tier.

HTTP Request

GET https://api.balldontlie.io/pga/v1/tournament_course_stats

Query Parameters

Parameter Type Required Description
tournament_ids[] integer[] No Filter by tournament IDs.
course_ids[] integer[] No Filter by course IDs.
hole_number integer No Filter by hole number.
round_number integer No Filter by round number.
cursor integer No Pagination cursor.
per_page integer No Results per page, up to 100.

Course Holes

Get Course Holes

curl --get "https://api.balldontlie.io/pga/v1/course_holes" \
  -H "Authorization: YOUR_API_KEY" \
  --data-urlencode "course_ids[]=18" \
  --data-urlencode "hole_number=1" \
  --data-urlencode "per_page=1"
const url = new URL("https://api.balldontlie.io/pga/v1/course_holes");
url.searchParams.append("course_ids[]", "18");
url.searchParams.set("hole_number", "1");
url.searchParams.set("per_page", "1");
const response = await fetch(url, { headers: { Authorization: "YOUR_API_KEY" } });
console.log(await response.json());
import requests

response = requests.get(
    "https://api.balldontlie.io/pga/v1/course_holes",
    headers={"Authorization": "YOUR_API_KEY"},
    params=[("course_ids[]", 18), ("hole_number", 1), ("per_page", 1)],
)
response.raise_for_status()
print(response.json())

Real production response captured from the request above:

{
  "data": [
    {
      "course": {
        "id": 18,
        "name": "Sedgefield Country Club",
        "city": "Greensboro",
        "state": "North Carolina",
        "country": "USA",
        "par": 70,
        "yardage": "7,131",
        "established": "1926",
        "architect": "Donald Ross",
        "fairway_grass": "Bermudagrass",
        "rough_grass": "Bermudagrass",
        "green_grass": "Bermudagrass"
      },
      "hole_number": 1,
      "par": 4,
      "yardage": 418
    }
  ],
  "meta": {
    "next_cursor": 307,
    "per_page": 1
  }
}

Returns course-hole par and yardage. Requires ALL-STAR tier.

HTTP Request

GET https://api.balldontlie.io/pga/v1/course_holes

Query Parameters

Parameter Type Required Description
course_ids[] integer[] No Filter by course IDs.
hole_number integer No Filter by hole number.
cursor integer No Pagination cursor.
per_page integer No Results per page, up to 100.

Player Round Results

Get Player Round Results

curl --get "https://api.balldontlie.io/pga/v1/player_round_results" \
  -H "Authorization: YOUR_API_KEY" \
  --data-urlencode "tournament_ids[]=40" \
  --data-urlencode "per_page=1"
const url = new URL("https://api.balldontlie.io/pga/v1/player_round_results");
url.searchParams.append("tournament_ids[]", "40");
url.searchParams.set("per_page", "1");
const response = await fetch(url, { headers: { Authorization: "YOUR_API_KEY" } });
console.log(await response.json());
import requests

response = requests.get(
    "https://api.balldontlie.io/pga/v1/player_round_results",
    headers={"Authorization": "YOUR_API_KEY"},
    params=[("tournament_ids[]", 40), ("per_page", 1)],
)
response.raise_for_status()
print(response.json())

Real production response captured from the request above:

{
  "data": [
    {
      "tournament": {
        "id": 40,
        "season": 2026,
        "name": "Wyndham Championship",
        "start_date": "2026-08-06T00:00:00.000Z",
        "end_date": "Aug 6 - 9",
        "city": "Greensboro",
        "state": "North Carolina",
        "country": "United States of America",
        "course_name": "Sedgefield Country Club",
        "purse": "$8,500,000",
        "status": "COMPLETED",
        "status_state": "final",
        "champion": {
          "id": 10,
          "first_name": "Michael",
          "last_name": "Brennan",
          "display_name": "Michael Brennan",
          "country": "United States",
          "country_code": "USA",
          "height": "6'1\"",
          "weight": null,
          "birth_date": "Feb 9, 2002",
          "birthplace_city": "Leesburg",
          "birthplace_state": "Virginia",
          "birthplace_country": "United States",
          "turned_pro": "2024",
          "school": "Wake Forest University",
          "residence_city": "Jacksonville",
          "residence_state": "Florida",
          "residence_country": "United States",
          "owgr": 35,
          "active": true
        },
        "courses": [],
        "rounds": []
      },
      "player": {
        "id": 154,
        "first_name": "Thorbjørn",
        "last_name": "Olesen",
        "display_name": "Thorbjørn Olesen",
        "country": "Denmark",
        "country_code": "DEN",
        "height": "5'9\"",
        "weight": "152",
        "birth_date": "Dec 21, 1989",
        "birthplace_city": "Fureso",
        "birthplace_state": null,
        "birthplace_country": "Denmark",
        "turned_pro": "2008",
        "school": null,
        "residence_city": "Fureso",
        "residence_state": null,
        "residence_country": "Denmark",
        "owgr": 157,
        "active": true
      },
      "round_number": 1,
      "score": 69,
      "par_relative_score": -1
    }
  ],
  "meta": {
    "next_cursor": 64365970,
    "per_page": 1
  }
}

Returns player-level round scores. Team and match relationships are not represented by this v1 resource; use v2 tournament results for format-aware aggregates. Requires GOAT tier.

HTTP Request

GET https://api.balldontlie.io/pga/v1/player_round_results

Query Parameters

Parameter Type Required Description
tournament_ids[] integer[] No Filter by tournament IDs.
player_ids[] integer[] No Filter by player IDs.
round_number integer No Filter by round number.
season integer No Filter by season.
cursor integer No Pagination cursor.
per_page integer No Results per page, up to 100.

Player Round Stats

Get Player Round Stats

curl --get "https://api.balldontlie.io/pga/v1/player_round_stats" \
  -H "Authorization: YOUR_API_KEY" \
  --data-urlencode "tournament_ids[]=40" \
  --data-urlencode "per_page=1"
const url = new URL("https://api.balldontlie.io/pga/v1/player_round_stats");
url.searchParams.append("tournament_ids[]", "40");
url.searchParams.set("per_page", "1");
const response = await fetch(url, { headers: { Authorization: "YOUR_API_KEY" } });
console.log(await response.json());
import requests

response = requests.get(
    "https://api.balldontlie.io/pga/v1/player_round_stats",
    headers={"Authorization": "YOUR_API_KEY"},
    params=[("tournament_ids[]", 40), ("per_page", 1)],
)
response.raise_for_status()
print(response.json())

Real production response captured from the request above:

{
  "data": [
    {
      "tournament": {
        "id": 40,
        "season": 2026,
        "name": "Wyndham Championship",
        "start_date": "2026-08-06T00:00:00.000Z",
        "end_date": "Aug 6 - 9",
        "city": "Greensboro",
        "state": "North Carolina",
        "country": "United States of America",
        "course_name": "Sedgefield Country Club",
        "purse": "$8,500,000",
        "status": "COMPLETED",
        "status_state": "final",
        "champion": {
          "id": 10,
          "first_name": "Michael",
          "last_name": "Brennan",
          "display_name": "Michael Brennan",
          "country": "United States",
          "country_code": "USA",
          "height": "6'1\"",
          "weight": null,
          "birth_date": "Feb 9, 2002",
          "birthplace_city": "Leesburg",
          "birthplace_state": "Virginia",
          "birthplace_country": "United States",
          "turned_pro": "2024",
          "school": "Wake Forest University",
          "residence_city": "Jacksonville",
          "residence_state": "Florida",
          "residence_country": "United States",
          "owgr": 35,
          "active": true
        },
        "courses": [],
        "rounds": []
      },
      "player": {
        "id": 196,
        "first_name": "Austin",
        "last_name": "Smotherman",
        "display_name": "Austin Smotherman",
        "country": "United States",
        "country_code": "USA",
        "height": "5'11\"",
        "weight": "165",
        "birth_date": "May 19, 1994",
        "birthplace_city": "Loomis",
        "birthplace_state": "California",
        "birthplace_country": "United States",
        "turned_pro": "2016",
        "school": "Southern Methodist University",
        "residence_city": "Dallas",
        "residence_state": "Texas",
        "residence_country": "United States",
        "owgr": 111,
        "active": true
      },
      "round_number": -1,
      "sg_off_tee": 1.916,
      "sg_off_tee_rank": 26,
      "sg_approach": 1.063,
      "sg_approach_rank": 39,
      "sg_around_green": -0.22,
      "sg_around_green_rank": 47,
      "sg_putting": -4.028,
      "sg_putting_rank": 75,
      "sg_total": -1.269,
      "sg_total_rank": 67,
      "driving_accuracy": 71.43,
      "driving_accuracy_rank": 15,
      "driving_distance": 317.1,
      "driving_distance_rank": 40,
      "longest_drive": 353,
      "longest_drive_rank": 38,
      "greens_in_regulation": 73.61,
      "greens_in_regulation_rank": 43,
      "sand_saves": 100,
      "sand_saves_rank": 1,
      "scrambling": 47.37,
      "scrambling_rank": 64,
      "putts_per_gir": 1.81,
      "putts_per_gir_rank": 60,
      "eagles": null,
      "birdies": 16,
      "pars": 46,
      "bogeys": 8,
      "double_bogeys": 1
    }
  ],
  "meta": {
    "next_cursor": 78852810,
    "per_page": 1
  }
}

Returns strokes-gained and traditional player statistics. Coverage is established for stroke-play events; non-stroke events can return an empty data array. Requires GOAT tier.

HTTP Request

GET https://api.balldontlie.io/pga/v1/player_round_stats

Query Parameters

Parameter Type Required Description
tournament_ids[] integer[] No Filter by tournament IDs.
player_ids[] integer[] No Filter by player IDs.
round_number integer No Filter by round number.
season integer No Filter by season.
cursor integer No Pagination cursor.
per_page integer No Results per page, up to 100.

Player Season Stats

Get Player Season Stats

curl --get "https://api.balldontlie.io/pga/v1/player_season_stats" \
  -H "Authorization: YOUR_API_KEY" \
  --data-urlencode "season=2026" \
  --data-urlencode "per_page=1"
const url = new URL("https://api.balldontlie.io/pga/v1/player_season_stats");
url.searchParams.set("season", "2026");
url.searchParams.set("per_page", "1");
const response = await fetch(url, { headers: { Authorization: "YOUR_API_KEY" } });
console.log(await response.json());
import requests

response = requests.get(
    "https://api.balldontlie.io/pga/v1/player_season_stats",
    headers={"Authorization": "YOUR_API_KEY"},
    params={"season": 2026, "per_page": 1},
)
response.raise_for_status()
print(response.json())

Real production response captured from the request above:

{
  "data": [
    {
      "player": {
        "id": 185,
        "first_name": "Scottie",
        "last_name": "Scheffler",
        "display_name": "Scottie Scheffler",
        "country": "United States",
        "country_code": "USA",
        "height": "6'3\"",
        "weight": "200",
        "birth_date": "Jun 21, 1996",
        "birthplace_city": "Ridgewood",
        "birthplace_state": "New Jersey",
        "birthplace_country": "United States",
        "turned_pro": "2018",
        "school": "University of Texas",
        "residence_city": "Dallas",
        "residence_state": "Texas",
        "residence_country": "United States",
        "owgr": 1,
        "active": true
      },
      "stat_id": 489,
      "stat_name": "Official World Golf Ranking",
      "stat_category": "POINTS_RANKINGS",
      "season": 2026,
      "rank": 1,
      "stat_value": [
        { "statName": "Avg Points", "statValue": "16.2176" },
        { "statName": "Total Points", "statValue": "681.1403" },
        { "statName": "Points lost", "statValue": "-394.8195" },
        { "statName": "Points gained", "statValue": "391.0040" }
      ]
    }
  ],
  "meta": {
    "next_cursor": 1960101,
    "per_page": 1
  }
}

Returns player statistics for a required season. Requires GOAT tier.

HTTP Request

GET https://api.balldontlie.io/pga/v1/player_season_stats

Query Parameters

Parameter Type Required Description
season integer Yes Season year.
player_ids[] integer[] No Filter by player IDs.
stat_ids[] integer[] No Filter by statistic IDs.
cursor integer No Pagination cursor.
per_page integer No Results per page, up to 100.

Player Scorecards

Get Player Scorecards

curl --get "https://api.balldontlie.io/pga/v1/player_scorecards" \
  -H "Authorization: YOUR_API_KEY" \
  --data-urlencode "tournament_ids[]=40" \
  --data-urlencode "per_page=1"
const url = new URL("https://api.balldontlie.io/pga/v1/player_scorecards");
url.searchParams.append("tournament_ids[]", "40");
url.searchParams.set("per_page", "1");
const response = await fetch(url, { headers: { Authorization: "YOUR_API_KEY" } });
console.log(await response.json());
import requests

response = requests.get(
    "https://api.balldontlie.io/pga/v1/player_scorecards",
    headers={"Authorization": "YOUR_API_KEY"},
    params=[("tournament_ids[]", 40), ("per_page", 1)],
)
response.raise_for_status()
print(response.json())

Real production response captured from the request above:

{
  "data": [
    {
      "tournament": {
        "id": 40,
        "season": 2026,
        "name": "Wyndham Championship",
        "start_date": "2026-08-06T00:00:00.000Z",
        "end_date": "Aug 6 - 9",
        "city": "Greensboro",
        "state": "North Carolina",
        "country": "United States of America",
        "course_name": "Sedgefield Country Club",
        "purse": "$8,500,000",
        "status": "COMPLETED",
        "status_state": "final",
        "champion": {
          "id": 10,
          "first_name": "Michael",
          "last_name": "Brennan",
          "display_name": "Michael Brennan",
          "country": "United States",
          "country_code": "USA",
          "height": "6'1\"",
          "weight": null,
          "birth_date": "Feb 9, 2002",
          "birthplace_city": "Leesburg",
          "birthplace_state": "Virginia",
          "birthplace_country": "United States",
          "turned_pro": "2024",
          "school": "Wake Forest University",
          "residence_city": "Jacksonville",
          "residence_state": "Florida",
          "residence_country": "United States",
          "owgr": 35,
          "active": true
        },
        "courses": [
          {
            "course": {
              "id": 18,
              "name": "Sedgefield Country Club",
              "city": "Greensboro",
              "state": "North Carolina",
              "country": "USA",
              "par": 70,
              "yardage": "7,131",
              "established": "1926",
              "architect": "Donald Ross",
              "fairway_grass": "Bermudagrass",
              "rough_grass": "Bermudagrass",
              "green_grass": "Bermudagrass"
            },
            "rounds": [
              1,
              2,
              3,
              4
            ]
          }
        ],
        "rounds": []
      },
      "player": {
        "id": 188,
        "first_name": "Matti",
        "last_name": "Schmid",
        "display_name": "Matti Schmid",
        "country": "Germany",
        "country_code": "GER",
        "height": "6'0\"",
        "weight": "160",
        "birth_date": "Nov 18, 1997",
        "birthplace_city": "Regensburg",
        "birthplace_state": null,
        "birthplace_country": "Germany",
        "turned_pro": "2021",
        "school": "University of Louisville",
        "residence_city": "Maxhütte-Haidhof",
        "residence_state": null,
        "residence_country": "Germany",
        "owgr": 83,
        "active": true
      },
      "course": {
        "id": 18,
        "name": "Sedgefield Country Club",
        "city": "Greensboro",
        "state": "North Carolina",
        "country": "USA",
        "par": 70,
        "yardage": "7,131",
        "established": "1926",
        "architect": "Donald Ross",
        "fairway_grass": "Bermudagrass",
        "rough_grass": "Bermudagrass",
        "green_grass": "Bermudagrass"
      },
      "round_number": 1,
      "hole_number": 1,
      "par": 4,
      "score": 5
    }
  ],
  "meta": {
    "next_cursor": 1057640717,
    "per_page": 1
  }
}

Returns player-by-hole scores. Coverage is established for stroke play; use v2 match holes for match-play and team-cup hole scoring. Team-stroke hole-level scorecards are not currently available. Requires GOAT tier.

HTTP Request

GET https://api.balldontlie.io/pga/v1/player_scorecards

Query Parameters

Parameter Type Required Description
tournament_ids[] integer[] No Filter by tournament IDs.
player_ids[] integer[] No Filter by player IDs.
round_number integer No Filter by round number.
hole_number integer No Filter by hole number.
cursor integer No Pagination cursor.
per_page integer No Results per page, up to 100.

Futures

Get Futures

curl --get "https://api.balldontlie.io/pga/v1/futures" \
  -H "Authorization: YOUR_API_KEY" \
  --data-urlencode "tournament_ids[]=41" \
  --data-urlencode "per_page=1"
const url = new URL("https://api.balldontlie.io/pga/v1/futures");
url.searchParams.append("tournament_ids[]", "41");
url.searchParams.set("per_page", "1");
const response = await fetch(url, { headers: { Authorization: "YOUR_API_KEY" } });
console.log(await response.json());
import requests

response = requests.get(
    "https://api.balldontlie.io/pga/v1/futures",
    headers={"Authorization": "YOUR_API_KEY"},
    params=[("tournament_ids[]", 41), ("per_page", 1)],
)
response.raise_for_status()
print(response.json())

Real production response captured from the request above:

{
  "data": [
    {
      "id": 379984579,
      "market_type": "tournament_winner",
      "market_name": "FedEx St. Jude Championship 2026",
      "player": {
        "id": 185,
        "first_name": "Scottie",
        "last_name": "Scheffler",
        "display_name": "Scottie Scheffler",
        "country": "United States",
        "country_code": "USA",
        "height": "6'3\"",
        "weight": "200",
        "birth_date": "Jun 21, 1996",
        "birthplace_city": "Ridgewood",
        "birthplace_state": "New Jersey",
        "birthplace_country": "United States",
        "turned_pro": "2018",
        "school": "University of Texas",
        "residence_city": "Dallas",
        "residence_state": "Texas",
        "residence_country": "United States",
        "owgr": 1,
        "active": true
      },
      "tournament": {
        "id": 41,
        "season": 2026,
        "name": "FedEx St. Jude Championship",
        "start_date": "2026-08-13T00:00:00.000Z",
        "end_date": "Aug 13 - 16",
        "city": "Memphis",
        "state": "Tennessee",
        "country": "United States of America",
        "course_name": "TPC Southwind",
        "purse": "$20,000,000",
        "status": "IN_PROGRESS",
        "status_state": "in_progress",
        "champion": null,
        "courses": [],
        "rounds": []
      },
      "vendor": "draftkings",
      "american_odds": 610,
      "updated_at": "2026-08-13T18:00:02.567Z"
    }
  ],
  "meta": {
    "next_cursor": 379984579,
    "per_page": 1
  }
}

Returns currently available PGA futures markets. Market availability varies by tournament and format. Requires GOAT tier.

HTTP Request

GET https://api.balldontlie.io/pga/v1/futures

Query Parameters

Parameter Type Required Description
player_ids[] integer[] No Filter by player IDs.
tournament_ids[] integer[] No Filter by tournament IDs.
vendors[] string[] No Filter by vendor.
market_types[] string[] No Filter by market type.
cursor integer No Pagination cursor.
per_page integer No Results per page, up to 100.

Player Props

Get Current Player Props

curl --get "https://api.balldontlie.io/pga/v1/odds/player_props" \
  -H "Authorization: YOUR_API_KEY" \
  --data-urlencode "tournament_id=41" \
  --data-urlencode "player_id=102" \
  --data-urlencode "prop_type=2_ball_hole_18_winner_round_1_moneyline_group_102_213_winner" \
  --data-urlencode "vendors[]=draftkings"
const url = new URL("https://api.balldontlie.io/pga/v1/odds/player_props");
url.searchParams.set("tournament_id", "41");
url.searchParams.set("player_id", "102");
url.searchParams.set("prop_type", "2_ball_hole_18_winner_round_1_moneyline_group_102_213_winner");
url.searchParams.append("vendors[]", "draftkings");
const response = await fetch(url, { headers: { Authorization: "YOUR_API_KEY" } });
console.log(await response.json());
import requests

response = requests.get(
    "https://api.balldontlie.io/pga/v1/odds/player_props",
    headers={"Authorization": "YOUR_API_KEY"},
    params=[
        ("tournament_id", 41),
        ("player_id", 102),
        ("prop_type", "2_ball_hole_18_winner_round_1_moneyline_group_102_213_winner"),
        ("vendors[]", "draftkings"),
    ],
)
response.raise_for_status()
print(response.json())

Real production response captured from the request above:

{
  "data": [
    {
      "id": 8927340676,
      "game_id": 41,
      "player_id": 102,
      "vendor": "draftkings",
      "prop_type": "2_ball_hole_18_winner_round_1_moneyline_group_102_213_winner",
      "line_value": "0.5",
      "market": {
        "type": "milestone",
        "odds": 240
      },
      "updated_at": "2026-08-13T22:05:08.432Z"
    }
  ],
  "meta": {
    "per_page": 1
  }
}

Returns current player-prop markets for a tournament. Market availability varies by tournament and format. Requires GOAT tier.

HTTP Request

GET https://api.balldontlie.io/pga/v1/odds/player_props

Query Parameters

Parameter Type Required Description
tournament_id integer Yes Tournament ID.
player_id integer No Filter by player ID.
prop_type string No Filter by prop type.
vendors[] string[] No Filter by vendor.

Get Opening Player Props

curl --get "https://api.balldontlie.io/pga/v1/odds/player_props/opening" \
  -H "Authorization: YOUR_API_KEY" \
  --data-urlencode "tournament_id=41" \
  --data-urlencode "player_id=100" \
  --data-urlencode "prop_type=2_ball_hole_1_winner_round_1_moneyline_group_100_211_winner" \
  --data-urlencode "vendors[]=draftkings"
const url = new URL("https://api.balldontlie.io/pga/v1/odds/player_props/opening");
url.searchParams.set("tournament_id", "41");
url.searchParams.set("player_id", "100");
url.searchParams.set("prop_type", "2_ball_hole_1_winner_round_1_moneyline_group_100_211_winner");
url.searchParams.append("vendors[]", "draftkings");
const response = await fetch(url, { headers: { Authorization: "YOUR_API_KEY" } });
console.log(await response.json());
import requests

response = requests.get(
    "https://api.balldontlie.io/pga/v1/odds/player_props/opening",
    headers={"Authorization": "YOUR_API_KEY"},
    params=[
        ("tournament_id", 41),
        ("player_id", 100),
        ("prop_type", "2_ball_hole_1_winner_round_1_moneyline_group_100_211_winner"),
        ("vendors[]", "draftkings"),
    ],
)
response.raise_for_status()
print(response.json())

Real production response captured from the request above:

{
  "data": [
    {
      "id": 2256331661,
      "game_id": 41,
      "player_id": 100,
      "vendor": "draftkings",
      "prop_type": "2_ball_hole_1_winner_round_1_moneyline_group_100_211_winner",
      "line_value": "0.5",
      "market": {
        "type": "milestone",
        "odds": -115
      },
      "opened_at": "2026-08-11T20:15:17.066Z"
    }
  ],
  "meta": {
    "per_page": 1
  }
}

Returns the opening snapshot for available player-prop markets. Requires GOAT tier.

HTTP Request

GET https://api.balldontlie.io/pga/v1/odds/player_props/opening

Query Parameters

Parameter Type Required Description
tournament_id integer Yes Tournament ID.
player_id integer No Filter by player ID.
prop_type string No Filter by prop type.
vendors[] string[] No Filter by vendor.