{
  "schemaVersion": "1.0",
  "item": {
    "slug": "golf-tee-times",
    "name": "Golf Tee Times",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/tag-assistant/golf-tee-times",
    "canonicalUrl": "https://clawhub.ai/tag-assistant/golf-tee-times",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/golf-tee-times",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=golf-tee-times",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "golfnow-search.py"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/golf-tee-times"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/golf-tee-times",
    "agentPageUrl": "https://openagent3.xyz/skills/golf-tee-times/agent",
    "manifestUrl": "https://openagent3.xyz/skills/golf-tee-times/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/golf-tee-times/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Golf Tee Time Finder ⛳",
        "body": "Find and compare golf tee times using the GolfNow API (reverse-engineered). Works for any location."
      },
      {
        "title": "When to Use",
        "body": "User asks to find tee times, book golf, or play a round\nLooking for cheap/discounted golf or hot deals\nComparing courses in an area\nChecking availability for a specific date\nFinding credit-bookable (trade offer) tee times"
      },
      {
        "title": "GolfNow API (Primary Method)",
        "body": "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)."
      },
      {
        "title": "API Endpoint",
        "body": "POST https://www.golfnow.com/api/tee-times/tee-time-results\nContent-Type: application/json\nAccept: application/json\nUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36\nOrigin: https://www.golfnow.com"
      },
      {
        "title": "Facility-Specific Search (SearchType: 1) — WORKS ✅",
        "body": "Requires a FacilityId. Returns all tee times for that course on a given date.\n\n{\n  \"Radius\": 50,\n  \"Latitude\": 26.1224,\n  \"Longitude\": -80.1373,\n  \"PageSize\": 50,\n  \"PageNumber\": 0,\n  \"SearchType\": 1,\n  \"SortBy\": \"Date\",\n  \"SortDirection\": 0,\n  \"Date\": \"Feb 16 2026\",\n  \"BestDealsOnly\": false,\n  \"PriceMin\": \"0\",\n  \"PriceMax\": \"10000\",\n  \"Players\": \"2\",\n  \"Holes\": \"3\",\n  \"FacilityType\": 0,\n  \"RateType\": \"all\",\n  \"TimeMin\": \"10\",\n  \"TimeMax\": \"42\",\n  \"FacilityId\": 5744,\n  \"SortByRollup\": \"Date.MinDate\",\n  \"View\": \"Grouping\",\n  \"ExcludeFeaturedFacilities\": true,\n  \"TeeTimeCount\": 50,\n  \"PromotedCampaignsOnly\": \"false\",\n  \"CurrentClientDate\": \"2026-02-16T05:00:00.000Z\"\n}"
      },
      {
        "title": "Area Search (SearchType: 0) — DOES NOT WORK ❌",
        "body": "Returns 0 results without a FacilityId. The API requires facility-specific queries."
      },
      {
        "title": "Key Parameters",
        "body": "ParamValuesNotesPlayers\"1\"-\"4\"String, not intHoles\"1\"=9h, \"2\"=18h, \"3\"=anyStringTimeMin/TimeMax10-42Maps to time ranges. 10=5AM, 42=9PM+Date\"Feb 16 2026\"Human-readable formatFacilityType0=any, 1=course, 2=simulatorBestDealsOnlytrue/falseHot deals filter (but returns 0 for area search)SearchType1Must be 1 (facility). 0/2/3 don't work"
      },
      {
        "title": "Response Structure",
        "body": "ttResults.teeTimes[] → array of tee time groups\n  ├── formattedTime: \"7:18\"\n  ├── formattedTimeMeridian: \"AM\"\n  ├── time: \"2026-02-16T07:18:00\"  (ISO timestamp)\n  ├── displayRate: 35.0  (price per player)\n  ├── multipleHolesRate: 18  (hole count)\n  ├── maxPriceTransactionFee: 2.99\n  ├── facility.name, facility.address.city, facility.averageRating, facility.reviewCount\n  ├── facility.seoFriendlyName  (for building URLs)\n  ├── facility.latitude, facility.longitude\n  └── teeTimeRates[] → rate options for this time slot\n       ├── rateName: \"Prepaid - Online Rate\" / \"Hot Deal\" / \"Twilight\" / etc.\n       ├── isHotDeal: true/false  🔥\n       ├── isTradeOffer: true/false  💳 (credit-bookable)\n       ├── isCartIncluded: true/false\n       ├── singlePlayerPrice.greensFees.value: 35.0\n       └── rateSetTypeId: 1=prepaid, other=pay at course"
      },
      {
        "title": "Building Course URLs",
        "body": "https://www.golfnow.com/tee-times/facility/{seoFriendlyName}/search\n\nExample: https://www.golfnow.com/tee-times/facility/5744-colony-west-golf-club-glades-course/search"
      },
      {
        "title": "Helper Script",
        "body": "Use skills/golf-tee-times/golfnow-search.py for batch queries. See script for usage."
      },
      {
        "title": "Finding Facility IDs",
        "body": "Since area search doesn't work, you need FacilityIds. Methods:\n\nUse the known course database (see below)\nWeb search: site:golfnow.com/tee-times/facility {city} {state} — URL contains the ID\nBrowser intercept: Load a course page, intercept the POST to /api/tee-times/tee-time-results, read the FacilityId from the payload"
      },
      {
        "title": "Telegram Output Format",
        "body": "Use this clean format for presenting tee times:\n\n🏌️ *Tee Times · {Day} {Date} · {Players} Players*\n\n⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯\n\n🔥 *DEALS*\n\n🔥 *[Course Name](url)*\nCity · X mi · ⭐ X.X · N reviews\n▸ Time · *$XX* · 18 holes · cart 🔥\n\n⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯\n\n*[Course Name](url)*\nCity · X mi · ⭐ X.X · N reviews\n▸ Time range · $XX\n▸ Time range · $XX twilight\n\n⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯\n\n_All prices per player · cart included · via GolfNow_\n\nKey formatting rules:\n\nUse ▸ for time slot lines\nBold the course name as a markdown link\nShow deals section first (🔥 hot deals, 💳 credit/trade offers)\nGroup times by price tier within each course\nInclude distance, rating, review count\nAdd ← AM slots or similar callouts for notable availability\nFooter: All prices per player · cart included · via GolfNow\nDo NOT use backtick code blocks for time listings (looks bad on mobile)"
      },
      {
        "title": "Discount Tips",
        "body": "🔥 GolfNow Hot Deals — isHotDeal: true in API. Unsold inventory at deep discounts.\n💳 Trade Offers — isTradeOffer: true. Bookable with GolfNow credits.\n🚶 Walk don't ride — saves $20-50 on cart fees\n🌅 Twilight rates — after 2-3 PM, prices drop significantly (look for rateName: \"Twilight\")\n🏠 FL resident rate — show ID for local discount at public courses\n⏰ Last-minute deals — day-of prices drop; hot deals appear closer to tee time\n📞 Call pro shop — phone-only rates sometimes cheaper than online\n🗓️ Weekday > Weekend — Monday-Thursday is always cheaper\n🌧️ Rain forecast — prices drop when weather looks iffy"
      },
      {
        "title": "Seasonal Notes (your area)",
        "body": "Peak season (Dec-Apr): Highest prices, book 3-7 days ahead. Morning sells out fast.\nSummer (May-Sep): 40-60% cheaper, but hot/humid. Early AM or twilight.\nHurricane season (Jun-Nov): Rain discounts common\nBest value month: September (cheapest + least crowded)"
      },
      {
        "title": "Steps",
        "body": "Navigate to https://www.golfnow.com/tee-times/facility/{facilityId}/tee-time/{teeTimeId}\nSelect golfer count — click radio button, dispatch change event, verify green fees total updates\nClick \"Continue to Book\" (.btnBook) — redirects to login if not authenticated\nLogin — GolfID iframe (my.golfid.io): use frame=[src*=golfid] to access email/password fields\n\nCreds: scripts/vault.sh get golfnow\n\n\nCheckout page (URL: .../checkout/players/{count}):\n\nApply rewards: Click #applyRewardsBtn → checkboxes by code ID (e.g. #MEMBERSAVE)\n\nNote: Rewards marked \"Cannot Be Combined\" won't stack on Hot Deals\n\n\nApply GolfPass Points: Click #btn-apply-loyalty-points (these DO work on Hot Deals)\nDecline Tee Time Protection: Click input[name=rdlTeeTimeProtection][value=false]\nDecline charity roundup: Click \"No Thanks\" if desired\nPayment: Pre-filled from saved cards (default: AMEX 1004)\n\n\n📸 SCREENSHOT & SEND TO USER — Send checkout screenshot via Telegram before proceeding\nWait for approval\nAccept terms: Check #agree-terms-top\nClick reservation: #reservation-button-top\nConfirmation: Remove Truist ad overlay ([class*=rokt], [class*=bold]), screenshot confirmation page"
      },
      {
        "title": "the user's Booking Preferences",
        "body": "Always apply points/rewards to minimize cost\nDecline Tee Time Protection (save $3-4)\nDefault payment: AMEX ending 1004\nSend confirmation screenshot after booking"
      }
    ],
    "body": "Golf Tee Time Finder ⛳\n\nFind and compare golf tee times using the GolfNow API (reverse-engineered). Works for any location.\n\nWhen to Use\nUser asks to find tee times, book golf, or play a round\nLooking for cheap/discounted golf or hot deals\nComparing courses in an area\nChecking availability for a specific date\nFinding credit-bookable (trade offer) tee times\nGolfNow API (Primary Method)\n\nThe GolfNow website uses a POST API to fetch tee times. This is the only reliable method — web_fetch returns empty shells (JS-rendered SPA).\n\nAPI Endpoint\nPOST https://www.golfnow.com/api/tee-times/tee-time-results\nContent-Type: application/json\nAccept: application/json\nUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36\nOrigin: https://www.golfnow.com\n\nFacility-Specific Search (SearchType: 1) — WORKS ✅\n\nRequires a FacilityId. Returns all tee times for that course on a given date.\n\n{\n  \"Radius\": 50,\n  \"Latitude\": 26.1224,\n  \"Longitude\": -80.1373,\n  \"PageSize\": 50,\n  \"PageNumber\": 0,\n  \"SearchType\": 1,\n  \"SortBy\": \"Date\",\n  \"SortDirection\": 0,\n  \"Date\": \"Feb 16 2026\",\n  \"BestDealsOnly\": false,\n  \"PriceMin\": \"0\",\n  \"PriceMax\": \"10000\",\n  \"Players\": \"2\",\n  \"Holes\": \"3\",\n  \"FacilityType\": 0,\n  \"RateType\": \"all\",\n  \"TimeMin\": \"10\",\n  \"TimeMax\": \"42\",\n  \"FacilityId\": 5744,\n  \"SortByRollup\": \"Date.MinDate\",\n  \"View\": \"Grouping\",\n  \"ExcludeFeaturedFacilities\": true,\n  \"TeeTimeCount\": 50,\n  \"PromotedCampaignsOnly\": \"false\",\n  \"CurrentClientDate\": \"2026-02-16T05:00:00.000Z\"\n}\n\nArea Search (SearchType: 0) — DOES NOT WORK ❌\n\nReturns 0 results without a FacilityId. The API requires facility-specific queries.\n\nKey Parameters\nParam\tValues\tNotes\nPlayers\t\"1\"-\"4\"\tString, not int\nHoles\t\"1\"=9h, \"2\"=18h, \"3\"=any\tString\nTimeMin/TimeMax\t10-42\tMaps to time ranges. 10=5AM, 42=9PM+\nDate\t\"Feb 16 2026\"\tHuman-readable format\nFacilityType\t0=any, 1=course, 2=simulator\t\nBestDealsOnly\ttrue/false\tHot deals filter (but returns 0 for area search)\nSearchType\t1\tMust be 1 (facility). 0/2/3 don't work\nResponse Structure\nttResults.teeTimes[] → array of tee time groups\n  ├── formattedTime: \"7:18\"\n  ├── formattedTimeMeridian: \"AM\"\n  ├── time: \"2026-02-16T07:18:00\"  (ISO timestamp)\n  ├── displayRate: 35.0  (price per player)\n  ├── multipleHolesRate: 18  (hole count)\n  ├── maxPriceTransactionFee: 2.99\n  ├── facility.name, facility.address.city, facility.averageRating, facility.reviewCount\n  ├── facility.seoFriendlyName  (for building URLs)\n  ├── facility.latitude, facility.longitude\n  └── teeTimeRates[] → rate options for this time slot\n       ├── rateName: \"Prepaid - Online Rate\" / \"Hot Deal\" / \"Twilight\" / etc.\n       ├── isHotDeal: true/false  🔥\n       ├── isTradeOffer: true/false  💳 (credit-bookable)\n       ├── isCartIncluded: true/false\n       ├── singlePlayerPrice.greensFees.value: 35.0\n       └── rateSetTypeId: 1=prepaid, other=pay at course\n\nBuilding Course URLs\nhttps://www.golfnow.com/tee-times/facility/{seoFriendlyName}/search\n\n\nExample: https://www.golfnow.com/tee-times/facility/5744-colony-west-golf-club-glades-course/search\n\nHelper Script\n\nUse skills/golf-tee-times/golfnow-search.py for batch queries. See script for usage.\n\nFinding Facility IDs\n\nSince area search doesn't work, you need FacilityIds. Methods:\n\nUse the known course database (see below)\nWeb search: site:golfnow.com/tee-times/facility {city} {state} — URL contains the ID\nBrowser intercept: Load a course page, intercept the POST to /api/tee-times/tee-time-results, read the FacilityId from the payload\nTelegram Output Format\n\nUse this clean format for presenting tee times:\n\n🏌️ *Tee Times · {Day} {Date} · {Players} Players*\n\n⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯\n\n🔥 *DEALS*\n\n🔥 *[Course Name](url)*\nCity · X mi · ⭐ X.X · N reviews\n▸ Time · *$XX* · 18 holes · cart 🔥\n\n⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯\n\n*[Course Name](url)*\nCity · X mi · ⭐ X.X · N reviews\n▸ Time range · $XX\n▸ Time range · $XX twilight\n\n⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯\n\n_All prices per player · cart included · via GolfNow_\n\n\nKey formatting rules:\n\nUse ▸ for time slot lines\nBold the course name as a markdown link\nShow deals section first (🔥 hot deals, 💳 credit/trade offers)\nGroup times by price tier within each course\nInclude distance, rating, review count\nAdd ← AM slots or similar callouts for notable availability\nFooter: All prices per player · cart included · via GolfNow\nDo NOT use backtick code blocks for time listings (looks bad on mobile)\nDiscount Tips\n🔥 GolfNow Hot Deals — isHotDeal: true in API. Unsold inventory at deep discounts.\n💳 Trade Offers — isTradeOffer: true. Bookable with GolfNow credits.\n🚶 Walk don't ride — saves $20-50 on cart fees\n🌅 Twilight rates — after 2-3 PM, prices drop significantly (look for rateName: \"Twilight\")\n🏠 FL resident rate — show ID for local discount at public courses\n⏰ Last-minute deals — day-of prices drop; hot deals appear closer to tee time\n📞 Call pro shop — phone-only rates sometimes cheaper than online\n🗓️ Weekday > Weekend — Monday-Thursday is always cheaper\n🌧️ Rain forecast — prices drop when weather looks iffy\nSeasonal Notes (your area)\nPeak season (Dec-Apr): Highest prices, book 3-7 days ahead. Morning sells out fast.\nSummer (May-Sep): 40-60% cheaper, but hot/humid. Early AM or twilight.\nHurricane season (Jun-Nov): Rain discounts common\nBest value month: September (cheapest + least crowded)\nBooking Flow## Booking Flow (GolfNow via Browser)\n⚠️ CRITICAL: Always send a screenshot of the final checkout page to the user BEFORE clicking \"Make Your Reservation\". Wait for explicit approval.\nSteps\nNavigate to https://www.golfnow.com/tee-times/facility/{facilityId}/tee-time/{teeTimeId}\nSelect golfer count — click radio button, dispatch change event, verify green fees total updates\nClick \"Continue to Book\" (.btnBook) — redirects to login if not authenticated\nLogin — GolfID iframe (my.golfid.io): use frame=[src*=golfid] to access email/password fields\nCreds: scripts/vault.sh get golfnow\nCheckout page (URL: .../checkout/players/{count}):\nApply rewards: Click #applyRewardsBtn → checkboxes by code ID (e.g. #MEMBERSAVE)\nNote: Rewards marked \"Cannot Be Combined\" won't stack on Hot Deals\nApply GolfPass Points: Click #btn-apply-loyalty-points (these DO work on Hot Deals)\nDecline Tee Time Protection: Click input[name=rdlTeeTimeProtection][value=false]\nDecline charity roundup: Click \"No Thanks\" if desired\nPayment: Pre-filled from saved cards (default: AMEX 1004)\n📸 SCREENSHOT & SEND TO USER — Send checkout screenshot via Telegram before proceeding\nWait for approval\nAccept terms: Check #agree-terms-top\nClick reservation: #reservation-button-top\nConfirmation: Remove Truist ad overlay ([class*=rokt], [class*=bold]), screenshot confirmation page\nthe user's Booking Preferences\nAlways apply points/rewards to minimize cost\nDecline Tee Time Protection (save $3-4)\nDefault payment: AMEX ending 1004\nSend confirmation screenshot after booking"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/tag-assistant/golf-tee-times",
    "publisherUrl": "https://clawhub.ai/tag-assistant/golf-tee-times",
    "owner": "tag-assistant",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/golf-tee-times",
    "downloadUrl": "https://openagent3.xyz/downloads/golf-tee-times",
    "agentUrl": "https://openagent3.xyz/skills/golf-tee-times/agent",
    "manifestUrl": "https://openagent3.xyz/skills/golf-tee-times/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/golf-tee-times/agent.md"
  }
}