Install
openclaw skills install golf-tee-timesSearch for golf tee times and deals near any location. Find cheapest rounds, compare prices across platforms, and get discount tips. Use when asked about golf, tee times, courses, or booking a round.
openclaw skills install golf-tee-timesFind and compare golf tee times using the GolfNow API (reverse-engineered). Works for any location.
The GolfNow website uses a POST API to fetch tee times. This is the only reliable method — web_fetch returns empty shells (JS-rendered SPA).
POST https://www.golfnow.com/api/tee-times/tee-time-results
Content-Type: application/json
Accept: application/json
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36
Origin: https://www.golfnow.com
Requires a FacilityId. Returns all tee times for that course on a given date.
{
"Radius": 50,
"Latitude": 26.1224,
"Longitude": -80.1373,
"PageSize": 50,
"PageNumber": 0,
"SearchType": 1,
"SortBy": "Date",
"SortDirection": 0,
"Date": "Feb 16 2026",
"BestDealsOnly": false,
"PriceMin": "0",
"PriceMax": "10000",
"Players": "2",
"Holes": "3",
"FacilityType": 0,
"RateType": "all",
"TimeMin": "10",
"TimeMax": "42",
"FacilityId": 5744,
"SortByRollup": "Date.MinDate",
"View": "Grouping",
"ExcludeFeaturedFacilities": true,
"TeeTimeCount": 50,
"PromotedCampaignsOnly": "false",
"CurrentClientDate": "2026-02-16T05:00:00.000Z"
}
Returns 0 results without a FacilityId. The API requires facility-specific queries.
| Param | Values | Notes |
|---|---|---|
Players | "1"-"4" | String, not int |
Holes | "1"=9h, "2"=18h, "3"=any | String |
TimeMin/TimeMax | 10-42 | Maps to time ranges. 10=5AM, 42=9PM+ |
Date | "Feb 16 2026" | Human-readable format |
FacilityType | 0=any, 1=course, 2=simulator | |
BestDealsOnly | true/false | Hot deals filter (but returns 0 for area search) |
SearchType | 1 | Must be 1 (facility). 0/2/3 don't work |
ttResults.teeTimes[] → array of tee time groups
├── formattedTime: "7:18"
├── formattedTimeMeridian: "AM"
├── time: "2026-02-16T07:18:00" (ISO timestamp)
├── displayRate: 35.0 (price per player)
├── multipleHolesRate: 18 (hole count)
├── maxPriceTransactionFee: 2.99
├── facility.name, facility.address.city, facility.averageRating, facility.reviewCount
├── facility.seoFriendlyName (for building URLs)
├── facility.latitude, facility.longitude
└── teeTimeRates[] → rate options for this time slot
├── rateName: "Prepaid - Online Rate" / "Hot Deal" / "Twilight" / etc.
├── isHotDeal: true/false 🔥
├── isTradeOffer: true/false 💳 (credit-bookable)
├── isCartIncluded: true/false
├── singlePlayerPrice.greensFees.value: 35.0
└── rateSetTypeId: 1=prepaid, other=pay at course
https://www.golfnow.com/tee-times/facility/{seoFriendlyName}/search
Example: https://www.golfnow.com/tee-times/facility/5744-colony-west-golf-club-glades-course/search
Use skills/golf-tee-times/golfnow-search.py for batch queries. See script for usage.
Since area search doesn't work, you need FacilityIds. Methods:
site:golfnow.com/tee-times/facility {city} {state} — URL contains the ID/api/tee-times/tee-time-results, read the FacilityId from the payloadUse this clean format for presenting tee times:
🏌️ *Tee Times · {Day} {Date} · {Players} Players*
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
🔥 *DEALS*
🔥 *[Course Name](url)*
City · X mi · ⭐ X.X · N reviews
▸ Time · *$XX* · 18 holes · cart 🔥
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
*[Course Name](url)*
City · X mi · ⭐ X.X · N reviews
▸ Time range · $XX
▸ Time range · $XX twilight
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
_All prices per player · cart included · via GolfNow_
Key formatting rules:
▸ for time slot lines← AM slots or similar callouts for notable availabilityisHotDeal: true in API. Unsold inventory at deep discounts.isTradeOffer: true. Bookable with GolfNow credits.rateName: "Twilight")https://www.golfnow.com/tee-times/facility/{facilityId}/tee-time/{teeTimeId}change event, verify green fees total updates.btnBook) — redirects to login if not authenticatedmy.golfid.io): use frame=[src*=golfid] to access email/password fields
scripts/vault.sh get golfnow.../checkout/players/{count}):
#applyRewardsBtn → checkboxes by code ID (e.g. #MEMBERSAVE)
#btn-apply-loyalty-points (these DO work on Hot Deals)input[name=rdlTeeTimeProtection][value=false]#agree-terms-top#reservation-button-top[class*=rokt], [class*=bold]), screenshot confirmation page