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. |