Golf Tee Times
by @tag-assistant
Search 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...
clawhub install golf-tee-timesπ About This Skill
name: golf-tee-times description: "Search 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." metadata: openclaw: emoji: "β³" requires: bins: ["curl", "python3"]
Golf Tee Time Finder β³
Find and compare golf tee times using the GolfNow API (reverse-engineered). Works for any location.
When to Use
GolfNow API (Primary Method)
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).
API Endpoint
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
Facility-Specific Search (SearchType: 1) β WORKS β
Requires aFacilityId. 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"
}
Area Search (SearchType: 0) β DOES NOT WORK β
Returns 0 results without a FacilityId. The API requires facility-specific queries.Key Parameters
| 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 |Response Structure
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
Building Course URLs
https://www.golfnow.com/tee-times/facility/{seoFriendlyName}/search
Example: https://www.golfnow.com/tee-times/facility/5744-colony-west-golf-club-glades-course/searchHelper Script
Use skills/golf-tee-times/golfnow-search.py for batch queries. See script for usage.
Finding Facility IDs
Since area search doesn't work, you need FacilityIds. Methods:
1. Use the known course database (see below)
2. Web search: site:golfnow.com/tee-times/facility {city} {state} β URL contains the ID
3. Browser intercept: Load a course page, intercept the POST to /api/tee-times/tee-time-results, read the FacilityId from the payload
Telegram Output Format
Use this clean format for presenting tee times:
ποΈ *Tee Times Β· {Day} {Date} Β· {Players} Players*β―β―β―β―β―β―β―β―β―β―β―β―β―β―β―
π₯ *DEALS*
π₯ *Course Name*
City Β· X mi Β· β X.X Β· N reviews
βΈ Time Β· *$XX* Β· 18 holes Β· cart π₯
β―β―β―β―β―β―β―β―β―β―β―β―β―β―β―
*Course Name*
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 availabilityDiscount Tips
1. π₯ GolfNow Hot Deals β isHotDeal: true in API. Unsold inventory at deep discounts.
2. π³ Trade Offers β isTradeOffer: true. Bookable with GolfNow credits.
3. πΆ Walk don't ride β saves $20-50 on cart fees
4. π
Twilight rates β after 2-3 PM, prices drop significantly (look for rateName: "Twilight")
5. π FL resident rate β show ID for local discount at public courses
6. β° Last-minute deals β day-of prices drop; hot deals appear closer to tee time
7. π Call pro shop β phone-only rates sometimes cheaper than online
8. ποΈ Weekday > Weekend β Monday-Thursday is always cheaper
9. π§οΈ Rain forecast β prices drop when weather looks iffy
Seasonal Notes (your area)
Booking Flow## Booking Flow (GolfNow via Browser)
β οΈ CRITICAL: Always send a screenshot of the final checkout page to the user BEFORE clicking "Make Your Reservation". Wait for explicit approval.
Steps
1. Navigate tohttps://www.golfnow.com/tee-times/facility/{facilityId}/tee-time/{teeTimeId}
2. Select golfer count β click radio button, dispatch change event, verify green fees total updates
3. Click "Continue to Book" (.btnBook) β redirects to login if not authenticated
4. Login β GolfID iframe (my.golfid.io): use frame=[src*=golfid] to access email/password fields
- Creds: scripts/vault.sh get golfnow
5. Checkout page (URL: .../checkout/players/{count}):
- Apply rewards: Click #applyRewardsBtn β checkboxes by code ID (e.g. #MEMBERSAVE)
- Note: Rewards marked "Cannot Be Combined" won't stack on Hot Deals
- Apply GolfPass Points: Click #btn-apply-loyalty-points (these DO work on Hot Deals)
- Decline Tee Time Protection: Click input[name=rdlTeeTimeProtection][value=false]
- Decline charity roundup: Click "No Thanks" if desired
- Payment: Pre-filled from saved cards (default: AMEX 1004)
6. πΈ SCREENSHOT & SEND TO USER β Send checkout screenshot via Telegram before proceeding
7. Wait for approval
8. Accept terms: Check #agree-terms-top
9. Click reservation: #reservation-button-top
10. Confirmation: Remove Truist ad overlay ([class*=rokt], [class*=bold]), screenshot confirmation page