✓ Verified 🌐 Web Scrapers ✓ Enhanced Data

Golf Tee Times

Search for golf tee times and deals near any location.

Rating
4.8 (13 reviews)
Downloads
9,016 downloads
Version
1.0.0

Overview

Search for golf tee times and deals near any location.

Complete Documentation

View Source →

Golf Tee Time Finder ⛳

Find and compare golf tee times using the GolfNow API (reverse-engineered). Works for any location.

When to Use

  • User asks to find tee times, book golf, or play a round
  • Looking for cheap/discounted golf or hot deals
  • Comparing courses in an area
  • Checking availability for a specific date
  • Finding credit-bookable (trade offer) tee times

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

text
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 a FacilityId. Returns all tee times for that course on a given date.

json
{
  "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

ParamValuesNotes
Players"1"-"4"String, not int
Holes"1"=9h, "2"=18h, "3"=anyString
TimeMin/TimeMax10-42Maps to time ranges. 10=5AM, 42=9PM+
Date"Feb 16 2026"Human-readable format
FacilityType0=any, 1=course, 2=simulator
BestDealsOnlytrue/falseHot deals filter (but returns 0 for area search)
SearchType1Must be 1 (facility). 0/2/3 don't work

Response Structure

text
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

text
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

Helper 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:

  • Use the known course database (see below)
  • Web search: site:golfnow.com/tee-times/facility {city} {state} — URL contains the ID
  • 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:

text
🏌️ *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:

  • Use for time slot lines
  • Bold the course name as a markdown link
  • Show deals section first (🔥 hot deals, 💳 credit/trade offers)
  • Group times by price tier within each course
  • Include distance, rating, review count
  • Add ← AM slots or similar callouts for notable availability
  • Footer: _All prices per player · cart included · via GolfNow_
  • Do NOT use backtick code blocks for time listings (looks bad on mobile)

Discount Tips

  • 🔥 GolfNow Hot DealsisHotDeal: true in API. Unsold inventory at deep discounts.
  • 💳 Trade OffersisTradeOffer: true. Bookable with GolfNow credits.
  • 🚶 Walk don't ride — saves $20-50 on cart fees
  • 🌅 Twilight rates — after 2-3 PM, prices drop significantly (look for rateName: "Twilight")
  • 🏠 FL resident rate — show ID for local discount at public courses
  • Last-minute deals — day-of prices drop; hot deals appear closer to tee time
  • 📞 Call pro shop — phone-only rates sometimes cheaper than online
  • 🗓️ Weekday > Weekend — Monday-Thursday is always cheaper
  • 🌧️ Rain forecast — prices drop when weather looks iffy

Seasonal Notes (your area)

  • Peak season (Dec-Apr): Highest prices, book 3-7 days ahead. Morning sells out fast.
  • Summer (May-Sep): 40-60% cheaper, but hot/humid. Early AM or twilight.
  • Hurricane season (Jun-Nov): Rain discounts common
  • Best value month: September (cheapest + least crowded)

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

  • Navigate to https://www.golfnow.com/tee-times/facility/{facilityId}/tee-time/{teeTimeId}
  • Select golfer count — click radio button, dispatch change event, verify green fees total updates
  • Click "Continue to Book" (.btnBook) — redirects to login if not authenticated
  • Login — GolfID iframe (my.golfid.io): use frame=[src*=golfid] to access email/password fields
  • Creds: scripts/vault.sh get golfnow
  • 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)
  • 📸 SCREENSHOT & SEND TO USER — Send checkout screenshot via Telegram before proceeding
  • Wait for approval
  • Accept terms: Check #agree-terms-top
  • Click reservation: #reservation-button-top
  • Confirmation: Remove Truist ad overlay ([class=rokt], [class=bold]), screenshot confirmation page

the user's Booking Preferences

  • Always apply points/rewards to minimize cost
  • Decline Tee Time Protection (save $3-4)
  • Default payment: AMEX ending 1004
  • Send confirmation screenshot after booking

Installation

Terminal bash

openclaw install golf-tee-times
    
Copied!

💻Code Examples

### API Endpoint

-api-endpoint.txt
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

}

.txt
### 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

https://www.golfnow.com/tee-times/facility/{seoFriendlyName}/search

httpswwwgolfnowcomtee-timesfacilityseofriendlynamesearch.txt
Example: `https://www.golfnow.com/tee-times/facility/5744-colony-west-golf-club-glades-course/search`

## Helper 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:
example.json
{
  "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"
}
example.txt
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
example.txt
🏌️ *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_

Tags

#search_and-research

Quick Info

Category Web Scrapers
Model Claude 3.5
Complexity One-Click
Author tag-assistant
Last Updated 3/10/2026
🚀
Optimized for
Claude 3.5
🧠

Ready to Install?

Get started with this skill in seconds

openclaw install golf-tee-times