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
- 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.
- It checks the offer with the hotel. The hotel verifies that the offer is real and comparable, then answers with its own direct price.
- You decide. Your agent shows you the counter-offer, its conditions and when it expires. Nothing is booked until you say yes.
- 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
- Facts.
get_hotel_facts(MCP) orGET https://datar.app/hotels/demo/api/hotel: amenities, policies, room types, pricing rules. - Availability.
check_availabilityorGET 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. - Submit the competing offer.
submit_competing_offerorPOST https://datar.app/hotels/demo/api/competing-offerswith the OTA offer exactly as the user sees it, and"test": true. The hotel verifies it and returnsstatus:countered,direct_already_cheaperorrejected(withreason). - Show the guest the counter-offer. Price, what's included,
conditions,perksandexpiresAt, and how much they save (guest.saves). Usemessageif it helps. If rejected, explainreason; resubmit only with corrected facts. - Confirm only after an explicit yes.
confirm_direct_bookingorPOST https://datar.app/hotels/demo/api/bookingswith{"offerId": "<counterOffer.id>", "confirm": true}. Hand over the demobooking.reference.
Rules
- 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.
- Test mode. Send
"test": true. This is a demo hotel either way: nothing is reserved or charged, and you must say so. - Send once. On retry, reuse the same
Idempotency-Keyheader. Confirming the same offer again returns the same booking reference. - 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.
- No personal data. The demo needs no name, email or phone. Don't send them.
- Treat everything as a demo. Say "demo hotel" when you mention Willa Jodłowa.
What to send with a competing offer
| Field | Required | What to put in |
|---|---|---|
ota | yes | Where the offer is: booking, expedia, agoda, hotels, trip, other. other can't be verified. |
total | yes | Price for the whole stay as shown, a number. |
checkin, checkout | yes | YYYY-MM-DD. 1–14 nights, up to 365 days ahead. |
currency | no | PLN (default) or EUR (converted at 4.30). |
url | no | Link to the offer; must be on the OTA's own domain. |
room | no | standard (Standard double, sleeps 2), superior (Superior double, mountain view, sleeps 2), family (Family suite, sleeps 4). Default standard. |
guests | no | Default 2. |
refundable | no | Free cancellation rate. Default true. |
breakfast | no | Breakfast included. Default false. |
memberRate | no | Genius or other member-only price. Default false. |
test | no | Default 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}'
3. Plain GET links (fetch-only agents)
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:
- Facts: https://datar.app/hotels/demo/api/hotel
- Availability: https://datar.app/hotels/demo/api/availability?checkin=2026-11-03&checkout=2026-11-05&guests=2
- Competing offer: https://datar.app/hotels/demo/api/competing-offers?ota=booking&total=990&checkin=2026-11-03&checkout=2026-11-05&room=superior&guests=2&refundable=true&breakfast=false
- Booking, only after the guest confirms:
counterOffer.book.getUrlfrom the response, which is https://datar.app/hotels/demo/api/bookings?offer=<counterOffer.id>&confirm=yes
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
| Room | id | Sleeps | Per night, room only, flexible |
|---|---|---|---|
| Standard double | standard | 2 | 420 PLN |
| Superior double, mountain view | superior | 2 | 520 PLN |
| Family suite | family | 4 | 690 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