Install
openclaw skills install hotel-searchSearch Google Hotels for hotel prices, ratings, and availability using browser automation. Use when user asks to search hotels, find accommodation, compare hotel prices, check availability, or look up places to stay. Triggers include "search hotels", "find hotels", "hotels in", "where to stay", "accommodation", "hotel prices", "cheapest hotel", "best hotel", "places to stay", "hotel near", "book a hotel", "hotel ratings".
openclaw skills install hotel-searchSearch Google Hotels via agent-browser to find hotel prices, ratings, amenities, and availability.
Always use --session hotels for isolation.
Build a URL with location and dates encoded. Loads results directly — 3 commands total.
https://www.google.com/travel/search?q={QUERY}&qs=CAE4AA&ts={TS_PARAM}&ap=MAE
Where {QUERY} is the location/hotel name and {TS_PARAM} is a base64-encoded date parameter.
Google Hotels uses a protobuf-encoded ts parameter for dates. The byte layout is fixed for years 2025-2030. Use this bash function to generate it:
hotel_ts() {
local ci_y=$1 ci_m=$2 ci_d=$3 co_y=$4 co_m=$5 co_d=$6 nights=$7
local cyl=$(printf '%02x' $(( ($ci_y & 0x7f) | 0x80 )))
local cyh=$(printf '%02x' $(($ci_y >> 7)))
local col=$(printf '%02x' $(( ($co_y & 0x7f) | 0x80 )))
local coh=$(printf '%02x' $(($co_y >> 7)))
echo -n "08011a200a021a00121a12140a0708${cyl}${cyh}10$(printf '%02x' $ci_m)18$(printf '%02x' $ci_d)120708${col}${coh}10$(printf '%02x' $co_m)18$(printf '%02x' $co_d)18$(printf '%02x' $nights)32020801" \
| xxd -r -p | base64 | tr -d '\n='
}
# Usage: hotel_ts CHECKIN_YEAR MONTH DAY CHECKOUT_YEAR MONTH DAY NIGHTS
# Example: hotel_ts 2026 3 15 2026 3 20 5
# Output: CAEaIAoCGgASGhIUCgcI6g8QAxgPEgcI6g8QAxgUGAUyAggB
Constraints: Years 2025-2030, months 1-12, days 1-31, nights 1-127. These cover all realistic hotel searches.
| Format | Example |
|---|---|
| City | Hotels+in+Bangkok |
| City + country | Hotels+in+Bangkok+Thailand |
| Neighborhood | Hotels+in+Shibuya+Tokyo |
| Near landmark | Hotels+near+Eiffel+Tower |
| Region | Hotels+in+Amalfi+Coast |
| Airport | Hotels+near+BKK+airport |
| Specific hotel | Haus+im+Tal+Munich |
| Feature | Via URL? |
|---|---|
| Location | ✅ Yes (via q=) |
| Dates | ✅ Yes (via ts=) |
| Guests / rooms | ❌ Set interactively (default: 1 room, 2 guests) |
| Filters (stars, price, amenities) | ❌ Set interactively |
# Step 1: Generate ts parameter
ts=$(hotel_ts 2026 3 15 2026 3 20 5)
# Step 2: Open with location + dates — results load immediately
agent-browser --session hotels open "https://www.google.com/travel/search?q=Hotels+in+Bangkok&qs=CAE4AA&ts=${ts}&ap=MAE"
agent-browser --session hotels wait --load networkidle
agent-browser --session hotels snapshot -i
# Step 3: Extract results from snapshot, then close
agent-browser --session hotels close
ts=$(hotel_ts 2026 3 9 2026 3 12 3)
agent-browser --session hotels open "https://www.google.com/travel/search?q=Haus+im+Tal+Munich&qs=CAE4AA&ts=${ts}&ap=MAE"
agent-browser --session hotels wait --load networkidle
agent-browser --session hotels snapshot -i
agent-browser --session hotels close
If the user doesn't specify dates, omit the ts, qs, and ap parameters:
agent-browser --session hotels open "https://www.google.com/travel/search?q=Hotels+in+Bangkok"
agent-browser --session hotels wait --load networkidle
agent-browser --session hotels snapshot -i
Results will show "starting from" prices. Set dates interactively if the user provides them later (see deep-dive reference).
For detailed interactive workflows (calendar navigation, guest/room selector, filters), see the deep-dive reference.
Present results as a single rich table:
| # | Hotel | Stars | Rating | Price/Night | Total | Via | Key Amenities |
|---|-------|-------|--------|-------------|-------|-----|---------------|
| 1 | Sukhothai Bangkok | ★★★★★ | 9.2 | $185 | $925 | Hotels.com | Pool, Spa, WiFi |
| 2 | Centara Grand | ★★★★★ | 8.8 | $165 | $825 | Booking.com | Pool, Gym, WiFi |
| 3 | Ibis Sukhumvit | ★★★ | 7.4 | $45 | $225 | Agoda | WiFi, Restaurant |
Only use when the user explicitly asks for a comparison between distinct searches (e.g., "Compare hotels in Shibuya vs Shinjuku").
agent-browser --session shibuya open "https://www.google.com/travel/search?q=Hotels+in+Shibuya+Tokyo" &
agent-browser --session shinjuku open "https://www.google.com/travel/search?q=Hotels+in+Shinjuku+Tokyo" &
wait
agent-browser --session shibuya wait --load networkidle &
agent-browser --session shinjuku wait --load networkidle &
wait
# Set dates in both sessions, then snapshot both
agent-browser --session shibuya snapshot -i
agent-browser --session shinjuku snapshot -i
agent-browser --session shibuya close &
agent-browser --session shinjuku close &
wait
| Rule | Why |
|---|---|
Prefer URL fast path with ts= | 3 commands with dates vs 10+ interactive |
wait --load networkidle | Smarter than fixed wait 5000 |
| Always encode dates in URL when available | Use hotel_ts to generate the ts parameter |
Use fill not type for text | Clears existing text first |
| Wait 2s after typing location | Autocomplete needs API roundtrip |
| Click suggestions, never Enter | Enter is unreliable for autocomplete |
| Re-snapshot after every interaction | DOM changes invalidate refs |
| Check for "View prices" | Means dates aren't set yet |
| Never leave Google Hotels during search | Exception: hotel's own site for direct booking check after results |
| Navigate calendar with "<" and ">" | Calendar may open on wrong month — use arrows to go backward or forward |
| Problem | Solution |
|---|---|
| Consent popup | Click "Accept all" or "Reject all" |
| URL fast path fails | Fall back to google.com/travel/hotels interactive flow |
| No results / "View prices" | Set check-in and check-out dates |
| Calendar opens on wrong month | Use "<" arrow to navigate backward or ">" to go forward. Always re-snapshot after navigating to confirm target month is visible |
| Snapshot blocked by calendar overlay | Press Escape to close the calendar, re-snapshot, then re-open the date picker and try again |
| Stale pricing | Prices are real-time and indicative — mention this caveat |
| Currency mismatch | Google uses browser locale currency — note any discrepancy |
| CAPTCHA | Inform user. Do NOT solve. Retry after a short wait |
| Map view instead of list | Click "List" or "View list" toggle |
| Hotel not found | Try variations: full name, shorter name, name + city, name + neighborhood |
After presenting results, always ask the user if they'd like you to check for better deals. Phrase it like:
"Want me to check [hotel name]'s direct website for promo codes or member rates? Direct booking is often cheaper than OTAs."
Open the hotel's own website in a new session (--session direct) and look for:
# After Google Hotels search is done, visit hotel's direct site
agent-browser --session direct open "https://www.example-hotel.com"
agent-browser --session direct wait --load networkidle
agent-browser --session direct snapshot -i
# Look for: promo banners, "offers" or "deals" links, booking widget prices
agent-browser --session direct close
If the hotel belongs to a major chain, mention the loyalty program — members often get better rates, room upgrades, or points:
| Chain | Brands | Loyalty Program | Typical Member Perks |
|---|---|---|---|
| IHG | Holiday Inn, InterContinental, Crowne Plaza, Kimpton, Indigo | IHG One Rewards | Member rate (often cheapest), points earning, 4th night free on reward stays |
| Marriott | Marriott, Sheraton, Westin, W, Ritz-Carlton, Courtyard, Aloft | Marriott Bonvoy | Member rate, mobile check-in, points/miles |
| Hilton | Hilton, DoubleTree, Hampton, Conrad, Waldorf Astoria | Hilton Honors | Member discount, 5th night free on reward stays, digital key |
| Accor | Sofitel, Novotel, ibis, Mercure, Moxy, Fairmont | ALL - Accor Live Limitless | Member rates, status benefits |
| Hyatt | Hyatt, Andaz, Park Hyatt, Thompson | World of Hyatt | Member rate, free night awards, suite upgrades |
The Google Hotels snapshot often includes the chain name:
"Holiday Inn Express Bangkok Sukhumvit 11 by IHG" → IHG"Courtyard by Marriott Bangkok" → Marriott"Hilton Munich City" → Hilton"Novotel Muenchen City" → AccorFor independent/boutique hotels (like Haus im Tal):
After checking, present a direct vs OTA comparison:
## Haus im Tal — Booking Comparison
| Source | Room Type | Price/Night | Total (3 nights) | Notes |
|--------|-----------|-------------|-------------------|-------|
| Booking.com | Downtown Cozy | €183 | €549 | Free cancellation |
| Hotel direct | Downtown Cozy | €175 | €525 | Use code HIT24 for 5% off |
| Hotel direct (with code) | Downtown Cozy | €166 | €499 | Best price |
Tip: Always remind the user that you cannot complete the booking — just provide the link and any promo codes found.
See references/interaction-patterns.md for: