PDGA APIpdga.com ↗
Access PDGA player profiles, ratings history, tournament results, live scores, world rankings, and course directory via a single REST API.
What is the PDGA API?
This API exposes 8 endpoints covering the Professional Disc Golf Association's full public data surface, from player directory searches to round-by-round ratings history. Use get_player_ratings_detail to pull every rated round a player has thrown, or get_live_event_scores to retrieve hole-by-hole scoring data for in-progress tournaments. Response fields include PDGA number, current rating, career wins, division results, course hole counts, and MPO/FPO world rankings.
curl -X GET 'https://api.parse.bot/scraper/0a9e3819-bb2b-49b4-a349-bdda834d5ebe/search_players?page=0&last_name=McBeth' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace pdga-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
from parse_apis.pdga_professional_disc_golf_association_api import PDGA, PlayerSummary, Player, RatingRound, EventSummary, Event, Course, Ranking, RankedPlayer
pdga = PDGA()
# Search for players by last name
for player_summary in pdga.playersummaries.search(last_name="McBeth"):
print(player_summary.name, player_summary.pdga_num, player_summary.rating, player_summary.classification)
# Get detailed profile for the first player
profile = player_summary.details()
print(profile.name, profile.current_rating, profile.career_wins, profile.career_earnings)
# List their rated rounds
for rnd in profile.ratings.list():
print(rnd.tournament, rnd.date, rnd.score, rnd.rating)
break
# Search events and drill into details
for event_summary in pdga.eventsummaries.search(event_name="Championship"):
print(event_summary.name, event_summary.tier, event_summary.location, event_summary.dates)
# Get full event details with results
event = event_summary.details()
print(event.name, event.dates, event.location)
for division_result in event.results:
print(division_result.division)
for ep in division_result.players:
print(ep.place, ep.player, ep.pdga_num)
break
# Get event by ID directly and check live scores
event = pdga.events.get(event_id="104527")
live = event.live_scores()
print(live.data)
# World rankings
for ranking in pdga.rankings.list():
print(ranking.title, ranking.full_rankings_url)
for rp in ranking.players:
print(rp.rank, rp.player, rp.player_url)
# Search courses
for course in pdga.courses.search(title="Championship"):
print(course.name, course.established, course.location, course.holes)
Search the PDGA player directory by name or PDGA number. Returns paginated results with basic player info (name, rating, classification, location, membership status). At least one of first_name, last_name, or pdga_num should be provided. pdga_num searches independently and should not be combined with name filters.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination (0-based). |
| pdga_num | string | PDGA membership number to search for. Use alone without name filters. |
| last_name | string | Player's last name to search for. |
| first_name | string | Player's first name to search for. |
{
"type": "object",
"fields": {
"page": "integer indicating the current page number",
"players": "array of player objects with name, pdga_num, rating, classification, city, state_prov, country, status, profile_url"
},
"sample": {
"data": {
"page": 0,
"players": [
{
"city": "Huntington Beach",
"name": "Paul McBeth",
"rating": "1046",
"status": "Current",
"country": "United States",
"pdga_num": "27523",
"state_prov": "California",
"profile_url": "https://www.pdga.com/player/27523",
"classification": "Pro"
}
]
},
"status": "success"
}
}About the PDGA API
Player Data
The search_players endpoint accepts first_name, last_name, and pdga_num as filters and returns paginated arrays of player objects — each with name, rating, classification, city, state_prov, country, and status. For a deeper look at any individual, get_player_profile accepts a pdga_number and returns career-level fields: career_wins, career_events, career_earnings, member_since, and a season_stats array broken out by division. The get_player_ratings_detail endpoint goes further, returning every rated round on record with tournament, tier, date, division, round, score, rating, evaluated, and included flags that mirror the official PDGA ratings calculation inputs.
Events and Live Scoring
search_events lets you query the PDGA tour schedule by event_name and returns event-level metadata: event_id, tier, class, tournament_director, location, and dates. Pass an event_id to get_event_details to retrieve official results organized by division, where each division contains a players array with place, name, PDGA number, and rating. For tournaments with live scoring active, get_live_event_scores returns the full data object from the PDGA live scoring system, including Divisions, Layouts (with hole-by-hole details), RoundsList, and scoring format metadata.
Rankings and Courses
get_world_rankings requires no parameters and returns the current top-5 players for both the MPO and FPO divisions, each entry carrying rank, name, and profile_url. The search_courses endpoint queries the PDGA course directory by title and returns paginated course objects with name, established, location, holes, and url. Both endpoints are useful for building reference tools or location-based disc golf apps without needing to maintain your own course or rankings database.
The PDGA API is a managed, monitored endpoint for pdga.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when pdga.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official pdga.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Track a player's official PDGA rating trend over time using round-by-round data from
get_player_ratings_detail - Build a tournament bracket viewer by combining
search_eventsresults withget_event_detailsdivision standings - Display live leaderboard updates during an active event using
get_live_event_scoreshole-by-hour data - Show MPO and FPO world rankings on a disc golf news site using
get_world_rankings - Build a course finder app by searching the PDGA directory with
search_coursesand surfacing hole count and establishment year - Aggregate career statistics for multiple players by batch-calling
get_player_profilewith individual PDGA numbers - Validate a user's PDGA membership status and classification during app onboarding via
search_players
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does the PDGA have an official developer API?+
What does `get_player_ratings_detail` return, and how is it different from `get_player_profile`?+
get_player_profile returns aggregate career and season stats — total wins, earnings, and division-level tournament counts. get_player_ratings_detail returns the underlying round-level data: one object per rated round with tournament, tier, date, division, round, score, rating, and evaluated/included boolean flags that indicate which rounds counted toward the player's official rating calculation.Does `get_world_rankings` return the full rankings list or just a summary?+
full_rankings_url pointing to the complete PDGA rankings page. The response does not include players ranked below 5th. You can fork this API on Parse and revise it to add an endpoint that retrieves the full rankings list.Is amateur division data or junior division data available through these endpoints?+
classification field on player objects will reflect amateur or pro status. However, there is no dedicated endpoint for filtering players or events exclusively by amateur or junior division. You can fork this API on Parse and revise it to add division-specific filtering across player and event searches.How does pagination work across the search endpoints?+
search_players, search_events, and search_courses endpoints all use 0-based integer pagination via the page parameter. Each response includes the current page value. There is no total-count or total-pages field returned, so you need to increment the page number until the results array is empty to determine when you've reached the end of the result set.