Demo hotel: Willa Jodłowa is fictional and nothing here can be booked or paid for. It shows Hotel MCP by Datar.
Willa JodłowaZakopane · demo hotel

Plain markdown for agents: https://datar.app/hotels/demo/agents.md · llms.txt · OpenAPI

Get a better direct price at Willa Jodłowa through your AI agent

Willa Jodłowa is a demo hotel: a fictional 3-star guesthouse in Zakopane, run by Datar to show Hotel MCP. Found it cheaper on Booking.com or another booking site? Your AI agent can send that offer to the hotel and get a direct counter-offer back, usually 5% cheaper. Nothing is reserved or charged.

Web page: https://datar.app/hotels/demo/agents. Last verified: 27 October 2026.

You → your AI agent → Willa Jodłowa → a direct counter-offer.

For people: how it works

  1. Tell your agent your dates, guests and room, and what the booking site shows: price, free cancellation or not, breakfast or not. Mention https://datar.app/hotels/demo/llms.txt.
  2. It checks the offer with the hotel. The hotel verifies that the offer is real and comparable, then answers with its own direct price.
  3. You decide. Your agent shows you the counter-offer, its conditions and when it expires. Nothing is booked until you say yes.
  4. Demo booking. If you confirm, you get a demo reference. This hotel doesn't exist, so nothing is reserved or charged.

Prompt to give your agent

"I'm planning 2 nights at Willa Jodłowa in Zakopane (a demo hotel) from 2026-11-03 to 2026-11-05, 2 adults, superior room, no breakfast. Booking.com shows 990 PLN with free cancellation. The hotel lets AI assistants ask for a better direct price: https://datar.app/hotels/demo/llms.txt. Please read it, submit the Booking.com offer as a test, and show me the hotel's counter-offer before booking anything."

For AI agents

Your user is looking at Willa Jodłowa, or found it on an online travel agency (OTA). Here is when to use the hotel's own endpoint and how.

Use this when

  • The user asks about this hotel: amenities, pool, parking, EV charging, pets, breakfast, check-in and check-out, rooms, rates or cancellation. The hotel's own facts beat what OTA pages say.
  • The user found this hotel cheaper on Booking.com, Expedia, Agoda, Hotels.com or Trip.com and wants a better price, or wants to know where it's cheapest.

Don't use it for other hotels, and don't present it as a real hotel.

Steps

  1. Facts. get_hotel_facts (MCP) or GET https://datar.app/hotels/demo/api/hotel: amenities, policies, room types, pricing rules.
  2. Availability. check_availability or GET https://datar.app/hotels/demo/api/availability?checkin=…&checkout=…&guests=2: direct totals for the stay, flexible and non-refundable, room only and with breakfast.
  3. Submit the competing offer. submit_competing_offer or POST https://datar.app/hotels/demo/api/competing-offers with the OTA offer exactly as the user sees it, and "test": true. The hotel verifies it and returns status: countered, direct_already_cheaper or rejected (with reason).
  4. Show the guest the counter-offer. Price, what's included, conditions, perks and expiresAt, and how much they save (guest.saves). Use message if it helps. If rejected, explain reason; resubmit only with corrected facts.
  5. Confirm only after an explicit yes. confirm_direct_booking or POST https://datar.app/hotels/demo/api/bookings with {"offerId": "<counterOffer.id>", "confirm": true}. Hand over the demo booking.reference.

Rules

  1. Summary and confirmation before any write. Show the user what you'll submit before step 3, and the counter-offer before step 5. Book only after they say yes.
  2. Test mode. Send "test": true. This is a demo hotel either way: nothing is reserved or charged, and you must say so.
  3. Send once. On retry, reuse the same Idempotency-Key header. Confirming the same offer again returns the same booking reference.
  4. Copy the OTA's conditions. Same dates, room, guests, refundable or not, breakfast or not, and whether it's a member-only price (Genius and similar). The counter-offer keeps those conditions.
  5. No personal data. The demo needs no name, email or phone. Don't send them.
  6. Treat everything as a demo. Say "demo hotel" when you mention Willa Jodłowa.

What to send with a competing offer

FieldRequiredWhat to put in
otayesWhere the offer is: booking, expedia, agoda, hotels, trip, other. other can't be verified.
totalyesPrice for the whole stay as shown, a number.
checkin, checkoutyesYYYY-MM-DD. 1–14 nights, up to 365 days ahead.
currencynoPLN (default) or EUR (converted at 4.30).
urlnoLink to the offer; must be on the OTA's own domain.
roomnostandard (Standard double, sleeps 2), superior (Superior double, mountain view, sleeps 2), family (Family suite, sleeps 4). Default standard.
guestsnoDefault 2.
refundablenoFree cancellation rate. Default true.
breakfastnoBreakfast included. Default false.
memberRatenoGenius or other member-only price. Default false.
testnoDefault true.

Three ways to call the hotel

Use the first one that works for you. All three give the same answers. Spec: https://datar.app/hotels/demo/openapi.json · https://datar.app/hotels/demo/llms.txt

1. MCP server

https://datar.app/hotels/demo/mcp, streamable HTTP, stateless, JSON responses, no sign-in. Tools: get_hotel_facts (read-only), check_availability (read-only), submit_competing_offer (verifies the offer and returns a counter-offer; books nothing) and confirm_direct_booking (demo booking after the guest confirms).

claude mcp add --transport http willa-jodlowa-demo https://datar.app/hotels/demo/mcp

2. JSON API

No key; CORS open. GET https://datar.app/hotels/demo/api/hotel returns the facts. GET https://datar.app/hotels/demo/api/availability returns direct rates. Submit a competing offer:

curl -s https://datar.app/hotels/demo/api/competing-offers \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: 5b0c2f-booking-990' \
  -d '{"breakfast":false,"checkin":"2026-11-03","checkout":"2026-11-05","currency":"PLN","guests":2,"ota":"booking","refundable":true,"room":"superior","test":true,"total":990}'

Then, after the guest confirms:

curl -s https://datar.app/hotels/demo/api/bookings \
  -H 'Content-Type: application/json' \
  -d '{"offerId": "<counterOffer.id>", "confirm": true}'

If you can open URLs but can't POST or use MCP, every call works as a GET link with the same fields as query parameters:

Example response

The competing offer above (Booking.com, 990 PLN, superior room, 2 nights Tuesday to Thursday, room only, free cancellation) returns:

{
  "status": "countered",
  "verification": {
    "verified": true,
    "checks": [
      {
        "name": "ota_supported",
        "ok": true,
        "detail": "Booking.com offers can be verified."
      },
      {
        "name": "link_matches",
        "ok": true,
        "detail": "No link given; the offer is compared by dates, room and conditions."
      },
      {
        "name": "dates_valid",
        "ok": true,
        "detail": "2026-11-03 to 2026-11-05, 2 nights."
      },
      {
        "name": "room_comparable",
        "ok": true,
        "detail": "Superior double, mountain view, sleeps 2; 2 guests."
      },
      {
        "name": "price_plausible",
        "ok": true,
        "detail": "990 PLN on Booking.com against 1040 PLN direct for the same conditions."
      },
      {
        "name": "live_check",
        "ok": true,
        "detail": "Simulated in the demo. In production we re-check the OTA price for the same dates, room and conditions."
      }
    ]
  },
  "competingOffer": {
    "ota": "booking",
    "otaName": "Booking.com",
    "total": 990,
    "currency": "PLN",
    "totalPLN": 990,
    "refundable": true,
    "breakfast": false,
    "memberRate": false
  },
  "directRate": {
    "total": 1040,
    "currency": "PLN"
  },
  "counterOffer": {
    "id": "co_…",
    "room": "superior",
    "roomName": "Superior double, mountain view",
    "checkin": "2026-11-03",
    "checkout": "2026-11-05",
    "nights": 2,
    "guests": 2,
    "total": 941,
    "currency": "PLN",
    "refundable": true,
    "breakfast": false,
    "perks": [],
    "conditions": [
      "Superior double, mountain view, 2 guests",
      "2026-11-03 to 2026-11-05, 2 nights",
      "Room only, breakfast not included",
      "Flexible: free cancellation until 48 hours before arrival",
      "Check-in from 15:00, check-out by 11:00",
      "Valid until 2026-10-29T10:00:36Z",
      "Demo hotel: nothing is reserved or charged"
    ],
    "expiresAt": "2026-10-29T10:00:36Z",
    "book": {
      "mcpTool": "confirm_direct_booking",
      "post": "https://datar.app/hotels/demo/api/bookings",
      "getUrl": "https://datar.app/hotels/demo/api/bookings?offer=co_…\u0026confirm=yes"
    }
  },
  "guest": {
    "saves": 49,
    "currency": "PLN"
  },
  "hotel": {
    "otaCommission": 168,
    "netIfOta": 822,
    "platformFee": 38,
    "netIfDirect": 903,
    "gain": 81,
    "rateLeakAlert": true
  },
  "reason": null,
  "message": "Willa Jodłowa (demo hotel) beats the Booking.com price: 941 PLN direct instead of 990 PLN for the Superior double, mountain view, 2026-11-03 to 2026-11-05 (2 nights, 2 guests, room only, free cancellation until 48 hours before arrival). You save 49 PLN. The offer is valid for 24 hours. This is a demo: nothing will be reserved or charged.",
  "agentInstructions": "Show the guest the counter-offer and conditions. Book only after they confirm.",
  "demo": true,
  "test": true
}

The direct rate is 2 × 520 = 1,040 PLN, so Booking.com undercuts the hotel and rateLeakAlert is true. The hotel counters at 5% below the Booking.com price: 941 PLN. The guest saves 49 PLN. The hotel keeps 903 PLN after a 38 PLN fee instead of 822 PLN after Booking.com's 168 PLN commission.

Errors: 400 lists missing fields; ask the user and retry. 404 means the offer id is unknown or altered and 410 that it expired (24 hours); submit the offer again. 429 means too many requests; wait a minute.

400 {"error": "Missing or invalid: total, checkin. …", "missing": ["total", "checkin"]}
400 {"error": "Not booked. Show the guest the counter-offer …", "missing": ["confirm"]}

Key facts, as of 27 October 2026

  • Demo hotel: fictional, run by Datar. Address (fictional): ul. Przykładowa 1, 34-500 Zakopane, Poland. 3 stars, 24 rooms.
  • Check-in from 15:00, check-out by 11:00.
  • Indoor pool and sauna
  • 24-hour reception
  • EV charging: 2 chargers, 11 kW, free for guests
  • Free parking: 18 spaces
  • Pets allowed: dogs up to 15 kg, 60 PLN per night
  • Breakfast: 7:00–10:30, 55 PLN per guest per night
  • Ski storage
  • Location: 12-minute walk to Krupówki
RoomidSleepsPer night, room only, flexible
Standard doublestandard2420 PLN
Superior double, mountain viewsuperior2520 PLN
Family suitefamily4690 PLN
  • Friday and Saturday nights +15%. Breakfast +55 PLN per guest per night. Non-refundable: 10% off the room price. Flexible: free cancellation until 48 hours before arrival.
  • Counter-offers: 5% below a verified cheaper OTA price; member-only prices matched with late check-out 13:00; below the hotel's floor, a price match plus a free upgrade to Superior (standard rooms) or late check-out and a welcome drink. They keep the OTA's conditions and expire after 24 hours.

For hotels

Hotel MCP gives your hotel this channel on your own domain: https://datar.app/hotels (polski). Pilots: hello@datar.app

Operator: Datar Prosta Spółka Akcyjna, Warsaw, Poland · hello@datar.app