playbook/antigravity-awesome-skills/skills/hasdata-cli/references/travel.md

5.5 KiB
Raw Blame History

Travel reference

Subcommands:

  • airbnb-listing, airbnb-property (5 credits each) — short-term rentals.
  • booking-search, booking-place (10 credits each) — hotels and other lodging on Booking.com.
  • google-flights (15 credits) — flight prices and itineraries via Google Flights.

*-listing / *-search is the filtered search; *-property / *-place is a single-property deep dive.

For activities at the destination see google-events (in search.md); for ground transport scrape the operator's site with web-scraping.


airbnb-listing

hasdata airbnb-listing --location "Lisbon, Portugal" \
  --check-in 2026-06-15 --check-out 2026-06-22 \
  --adults 2 --price-max 200 --raw

Run --help for the full filter set (room type, amenities, instant book, etc.).

airbnb-property

hasdata airbnb-property --url "https://www.airbnb.com/rooms/12345678" --raw

booking-search (10 credits)

hasdata booking-search \
  --keyword "Lisbon" \
  --check-in-date 2026-07-10 --check-out-date 2026-07-13 \
  --adults 2 --children 0 --rooms 1 \
  [--price-min 50 --price-max 250] [--rating 4 --rating 5] \
  [--review-score reviewScoreVeryGood --review-score reviewScoreSuperb] \
  [--property-type hotels --property-type apartments] \
  [--meals breakfastIncluded] [--facilities freeParking --facilities pool] \
  [--sort priceLowestFirst|ratingHighToLow|topReviewed|...] \
  [--page 2] [--currency USD] [--language en-us] \
  --raw | jq '.results[]'

Required (no defaults work in production, even though --help shows them): --keyword, --check-in-date, --check-out-date, --adults, --children, --rooms. Pass --children 0 explicitly when none.

When --children > 0, also pass --children-ages-json '[5,7]' with one age per child (017). Booking rejects the request otherwise.

Bracketed price filters (--price-min / --price-max) require >= 10 / >= 20 respectively; one of the two is required when filtering on price.

Top-level response: results, searchInformation, pagination, requestMetadata. Per-result keys (verified live): hotelId, roomId, title, url, location, rating, reviews, price, room, beds, bedTypes, policies, photo.

# Cheap-first filtered search
hasdata booking-search --keyword "Paris" \
  --check-in-date 2026-08-01 --check-out-date 2026-08-04 \
  --adults 2 --children 0 --rooms 1 \
  --review-score reviewScoreVeryGood \
  --sort priceLowestFirst --raw \
  | jq -c '.results[] | {title, price: .price.total, rating, url}'

booking-place (10 credits)

hasdata booking-place \
  --url "https://www.booking.com/hotel/fr/le-bristol-paris.html" \
  --check-in-date 2026-07-10 --check-out-date 2026-07-13 \
  --adults 2 --children 0 --rooms 1 \
  [--currency USD] [--language en-us] \
  --raw | jq .

Required: --url (must be on booking.com / www.booking.com), stay dates, --adults, --children, --rooms.

Response: overview, bookingDetails, rooms[], facilities, houseRules, ratings, reviews, restaurants, breadcrumbs, questionsAndAnswers. overview carries id, title, address, description, propertyType, photos, highlights, mostPopularFacilities. Each rooms[i] has roomId, name, bedTypes, beds, facilities, otherFacilities, variants[] (pricing/availability per package).

google-flights (15 credits)

hasdata google-flights \
  --departure-id "JFK" --arrival-id "LAX" \
  --outbound-date 2026-06-15 --return-date 2026-06-22 \
  --currency USD --raw | jq .

Round-trip vs. one-way controlled by presence/absence of --return-date. Run --help for the full flag set (cabin class, max stops, preferred airlines, etc.).


Non-obvious use cases

  • Hotel-vs-rental arbitrage — same dates and party size via booking-search and airbnb-listing; compare nightly cost percentile-for-percentile. The cheaper platform isn't always the same one across cities.
  • Conference-room pricing auditbooking-search --keyword "$CITY" --check-in-date $START --check-out-date $END --sort priceHighestFirst during a known conference window vs an idle week; the delta is the conference premium.
  • Family-friendly filter--children-ages-json '[5,9]' --children 2 --rooms 1 --travel-group family and Booking returns only properties that accept the party size with appropriate beds.
  • Loyalty-program portfoliobooking-search --keyword "$CITY" --raw | jq '.results[] | select(.title | test("Marriott|Hilton|Hyatt"))' filters to chains you collect points with.
  • Airbnb price-arbitrage check — same dates, same area, two airbnb-listing calls with different --adults counts to surface listings that don't scale per-person price. Sometimes the difference is the deal.
  • STR-vs-LTR feasibility — pair airbnb-listing for nightly rates with zillow-listing --type forSale (see real-estate.md) for purchase price in the same area; compute gross yield client-side.
  • Flights without a travel APIgoogle-flights with --departure-id, --arrival-id, dates, and --currency for ad-hoc fare checks against a vendor like Skyscanner.
  • Multi-leg cost planning — chain google-flights calls for each leg and sum .best_flights[].price; cheaper than the round-trip price-bot SaaS for one-off itineraries.
  • Trip-cost preview — combine google-flights (transport) + booking-search / airbnb-listing (lodging) + google-events (activities, see search.md) into one cost estimate before pitching a destination.