LIV Golf APIlivgolf.com ↗
Access per-shot data for LIV Golf players: club used, distance travelled, distance to pin, wind conditions, and landing zone for every round.
What is the LIV Golf API?
The LIV Golf API exposes 1 endpoint — get_player_shots — that returns every shot a player took in a given round of a LIV Golf event. Each response includes up to a dozen fields per shot: club selection, distance travelled, distance to pin, wind conditions, stroke position, and landing zone, giving developers granular per-hole performance data for individual players across events and seasons.
curl -X GET 'https://api.parse.bot/scraper/66d06f70-6cdc-4f29-bbcc-39e9873386d4/get_player_shots?season=2026&event_slug=andalucia&player_slug=tyrrell-hatton&round_number=1' \ -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 livgolf-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.
"""Walkthrough: LIV Golf SDK — bounded, re-runnable; every call capped."""
from parse_apis.livgolf_com_api import LivGolf, ShotDataNotFound
client = LivGolf()
# Get shot-by-shot data for a player's round
for shot in client.player_rounds.get(event_slug="andalucia", player_slug="tyrrell-hatton", round_number="1", limit=5):
print(shot.hole_number, shot.stroke_number, shot.club_used, shot.distance_travelled, shot.zone_desc)
# Take one shot to inspect details
shot = client.player_rounds.get(event_slug="andalucia", player_slug="jon-rahm", round_number="2", limit=1).first()
if shot:
print(shot.player_name, shot.stroke_position, shot.wind_speed, shot.wind_direction)
# Handle missing data gracefully
try:
client.player_rounds.get(event_slug="andalucia", player_slug="tyrrell-hatton", round_number="1", limit=1).first()
except ShotDataNotFound as e:
print(f"Not found: {e.player_slug} at {e.event_slug}")
print("exercised: player_rounds.get")
Returns every shot a player took in a specific round of a LIV Golf event, ordered by hole sequence. Each shot includes club used, distance travelled, distance to pin, wind conditions, stroke position, and landing zone. Distances are in tenths of yards from the source (divide by 36 for approximate yards). One round typically yields 60-75 shots across 18 holes.
| Param | Type | Description |
|---|---|---|
| season | string | Season year (e.g. '2026', '2025'). |
| event_slugrequired | string | URL slug of the event (e.g. 'andalucia', 'hong-kong', 'jeddah'). |
| player_slugrequired | string | URL slug of the player, typically first-last name hyphenated (e.g. 'tyrrell-hatton', 'jon-rahm', 'dustin-johnson'). |
| round_number | string | Round number (1-4). |
{
"type": "object",
"fields": {
"shots": "array of shot objects with stroke details",
"season": "string — season year",
"event_slug": "string — the event slug used in the request",
"player_slug": "string — the player slug used in the request",
"total_shots": "integer — total number of shots in this round",
"round_number": "integer — round number"
},
"sample": {
"data": {
"shots": [
{
"hole_par": 4,
"club_used": "Driver",
"stroke_id": 70309732,
"zone_desc": "SECOND_CUT",
"hole_order": 1,
"hole_score": 3,
"is_captain": false,
"wind_speed": 1.8,
"hole_number": 18,
"in_the_hole": false,
"player_name": "Tyrrell Hatton",
"stroke_type": "NORMAL",
"country_code": "ENG",
"hole_yardage": 463,
"round_number": 1,
"stroke_number": 1,
"wind_direction": "W",
"distance_to_pin": 4155.8,
"stroke_position": "Tee",
"tournament_name": "LIV Golf Andalucia",
"distance_travelled": 11676.7
}
],
"season": "2026",
"event_slug": "andalucia",
"player_slug": "tyrrell-hatton",
"total_shots": 69,
"round_number": 1
},
"status": "success"
}
}About the LIV Golf API
What the API Returns
The get_player_shots endpoint returns an ordered array of shot objects for a single player in a single round of a LIV Golf event. Each shot object carries the club used, distance travelled (in tenths of yards — divide by 3 to get feet, or by 36 to get approximate meters), distance remaining to the pin, wind conditions at the time of the stroke, the stroke's positional context, and the landing zone. The response envelope also includes total_shots (an integer count of all strokes in that round), round_number, season, event_slug, and player_slug for easy request reconciliation.
Parameters
Required inputs are event_slug — the URL slug identifying the tournament (e.g. andalucia, hong-kong, jeddah) — and player_slug, which follows a first-last hyphenated convention (e.g. tyrrell-hatton, jon-rahm). The optional season parameter (e.g. 2025, 2026) scopes requests to a specific LIV Golf season, and round_number (1–4) filters results to a single round when you don't need the full event picture.
Data Scope and Freshness
Coverage spans LIV Golf events where shot-level tracking data is available. Distance values are returned as integers in tenths of yards as sourced, so client-side conversion is needed for display in yards, feet, or meters. Data is scoped to individual rounds — to build a full-event picture for a player, you call the endpoint once per round. There is no bulk endpoint that returns all players in a field simultaneously.
The LIV Golf API is a managed, monitored endpoint for livgolf.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when livgolf.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 livgolf.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?+
- Build a shot-dispersion chart for a specific player across multiple LIV Golf events using landing zone and distance-to-pin fields.
- Compare club selection patterns between two players at the same event by querying each player's
get_player_shotsresponse. - Analyse how wind conditions correlate with distance travelled on par-5 holes for a given season.
- Track round-by-round
total_shotstrends for a player over a full season to model scoring consistency. - Compute strokes-gained approximations by combining distance-to-pin before and after each shot across a round.
- Identify which landing zones a player favours off the tee at specific event slugs like
jeddahorhong-kong. - Power a fantasy golf analytics tool that surfaces per-round shot quality metrics for LIV Golf competitors.
| 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 LIV Golf have an official developer API?+
What exactly does `get_player_shots` return, and how are distances expressed?+
Can I retrieve shot data for all players in a field with a single call?+
get_player_shots is scoped to one player_slug per request. Retrieving a full field requires one call per player. You can fork this API on Parse and revise it to add a field-wide endpoint that batches or aggregates player data.Does the API return leaderboard standings, scoring summaries, or hole-by-hole scores?+
How do I identify the correct `event_slug` and `player_slug` values to use?+
andalucia, hong-kong, jeddah). Player slugs use the first-last hyphenated convention visible in LIV Golf URLs (e.g. tyrrell-hatton, dustin-johnson). Checking the player or event URL on livgolf.com is the most reliable way to confirm exact slugs before making a request.