Compare live hotel room rates across Booking.com, Agoda, Traveloka, and OpenTravel for specific dates — which OTA is cheapest for the same property, per-room prices, and free-cancellation terms. Use when comparing hotel prices, checking room rates for a named hotel, asking which site is cheaper, or finding the best rate for given check-in/check-out dates.
Scanned 9/3/2026
Install to Claude Code
npx -y skills add aiskillstore/marketplace --skill pricewin-price-comparison --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Pricewin Price Comparison?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/aiskillstore-pricewin-price-comparison)More formats (shields.io, HTML) on the badges page.
---
name: pricewin-price-comparison
description: Compare live hotel room rates across Booking.com, Agoda, Traveloka, and OpenTravel for specific dates — which OTA is cheapest for the same property, per-room prices, and free-cancellation terms. Use when comparing hotel prices, checking room rates for a named hotel, asking which site is cheaper, or finding the best rate for given check-in/check-out dates.
version: 1.0.3
author: PriceWin
platforms: [linux, macos, windows]
tags: [price-comparison, compare-hotel-prices, hotel-price-comparison, room-rates, cheapest-hotel, best-hotel-rates, booking-vs-agoda, ota-comparison, cancellation-policy, free-cancellation, agoda, booking-com, traveloka, opentravel, mcp, hotel, travel]
metadata:
openclaw:
emoji: "⚖️"
homepage: https://github.com/Price-Win/pricewin-skills-hub
---
> Requires the `pricewin` MCP server. This skill issues no network calls of its own.
# Price Comparison
**MCP server:** `pricewin`. Compares live rates across **Booking.com, Agoda, Traveloka** (crawled) plus **OpenTravel** (direct API).
Comparison is something you do **over the returned sources** — there is no server-side
compare call. Pick the entry point by what the user gave you:
| User gave you | Tool |
|---|---|
| A **city** — "compare hotel prices in Da Nang" | `search_hotels_live` → `poll_search_results` |
| A **named hotel** — "is Mercure Danang cheaper on Agoda or Booking?" | `get_ota_hotel_detail` |
| A hotel already known to be **OpenTravel direct** (`source: "OPENTRAVEL_DIRECT"`, has `propertyId`) | `get_hotel_detail` |
## City-wide comparison
`search_hotels_live` returns IMMEDIATELY with a `sessionId` — it does **not** return hotels.
1. `search_hotels_live` — required: `city`, `checkIn`, `checkOut` (YYYY-MM-DD). Optional: `adults` (default 2), `rooms`, `area`, `hotelName`, `priceMin`, `priceMax`, `language`
2. Wait 5s → `poll_search_results(sessionId, nights)`
3. While `status` is `pending` or `partial`: wait 5s and poll again — up to 18 times (90s)
4. Present as soon as `status == "partial"` with hotels; keep polling silently and refine
Then compare per hotel across its sources. See [`pricewin-hotel-search`](../pricewin-hotel-search/SKILL.md)
for the full dedupe + presentation contract — do not restate it differently here.
## Single named hotel
`get_ota_hotel_detail` — for one specific Booking.com/Agoda hotel the user named.
- Required: `checkIn`, `checkOut`. Pass `hotelName` + `city` + `queryText` (verbatim user text) whenever known
- **Do NOT call `search_hotels_live` for a named hotel** — that returns a whole-city list
- Live crawl, **~20–60s**. Say nothing about "loading" until it actually returns
- Speed-up: if a prior search already gave you `prices.booking.url`, pass it as `propertyUrl` to skip name resolution
- If it returns not-found under load, retry **once**
Returns rooms, prices, facilities, photos, reviews for that property.
## OpenTravel direct properties
`get_hotel_detail` — only for results with `source: "OPENTRAVEL_DIRECT"`.
- Pass `propertyId` (UUID from `opentravelResults[].propertyId`) when available
- `hotelName` + `city` is a fallback **only** for a property already confirmed as OpenTravel direct
- Required: `checkIn`, `checkOut`. Optional: `adults`, `children`, `language`
- Returns room types with `roomTypeId` and `ratePlanId` — these are what make a property bookable
⚠️ Router rule: **have a `propertyId` → `get_hotel_detail`. Name only → `get_ota_hotel_detail`.**
## Cancellation terms
For OpenTravel rate plans only: `get_cancellation_policy(propertyId, ratePlanId, checkInDate)`
→ non-refundable flag, free-cancellation window, refund %, and the computed deadline.
`ratePlanId` comes from `get_hotel_detail` → `roomTypes[].ratePlanId`. Pass `checkInDate`
or you get no deadline. OTA hotels have no structured policy — quote whatever the crawl returned.
## Presenting a comparison
- Rank **purely by price**. No source gets priority, OpenTravel included
- Show the cheapest source first, then the others underneath:
`Agoda $X · Booking $Y · OpenTravel $Z`
- Savings vs the next-cheapest source: `(next - cheapest) / next * 100` → "Save Z%"
- When the gap is small, prefer the free-cancellation option and say why
- All prices USD unless the tool says otherwise. No conversion
Tool inputs and response fields: [reference.md](reference.md).
## Security & data handling
Documentation only — no code, no dependencies, no network calls of its own. The
only data sent is the comparison query (city or hotel name, dates, guests, plus
`queryText` — the user's message verbatim), to PriceWin's hosted MCP server
`https://mcp.price.win/mcp` (no credentials, no account). No PII, and this skill
cannot book or pay for anything. Full disclosure — operator, backend provenance,
exact fields per tool — in [`SECURITY.md`](./SECURITY.md).
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!