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