Short version: a bot does roughly the same thing a person does when they open a hotel's website and pick dates — but we do it for 57 hotels, 120 days out, every 8 hours, and we store the result. The number on the chart is the actual amount the customer pays at the hotel checkout, no middleman.
Directly from the hotel's booking engine. Not Booking.com, not partner feeds.
Every 8 hours our worker script visits 57 hotels and collects prices directly from their internal systems. Four different system types:
- Servio HMS — internal API used by Ukrainian hotels (Mountain Residence, Skogur, HVOYA, etc.)
- Exely / MotoPress — international booking systems and WordPress plugins
- Ulys PMS — a Ukrainian PMS system with its own booking widget
- Custom HTML — hotels with no third-party booking system; we parse the public page
We are not Booking.com partners, we don't use their API, and we don't take prices from them. Booking usually shows the same price plus 15–25% markup, and on top of that the hotel pays a commission. We have no interest in relaying that markup — our goal is the real cost.
The cheapest available one. It's the honest baseline for comparison.
For each date we take the minimum price across all room categories the hotel offers for booking on that specific date. If the hotel has Standard, Family, and Lux — the chart shows Standard. If Standard isn't available (booked or unavailable for that date) — it shows Family.
Why this way: any other rule (e.g. "always Standard") would create gaps in the chart — many hotels simply don't have a uniform "Standard" category, or the name differs. Minimum across available rooms is the only stable rule that works for all 57 hotels.
What we exclude: rates closed to public sale, rates with minimum-stay requirements that don't fit our query, promotional rates for limited categories (veterans, military, birthday discounts), and stub placeholder prices under 1,500 UAH/night that booking systems sometimes return (almost always technical fillers, not real offers).
2 adults, 1 night. This is the canonical chart price.
The main seasonality chart shows the price for: 2 adults, 0 children, 1 night. This is the most common booking format in Ukraine and gives a fair comparison across hotels.
Separately, for each date we also collect prices for 2+2 (parents with two children) and 4+0 (four adults), and for stay lengths of 1, 2, 3, 7, and 14 nights. This is stored in the database for future functionality — "compute for my family" type queries — but isn't plotted today.
- 120 check-in dates (120 days forward, refreshed daily)
- ×5 stay lengths (1, 2, 3, 7, 14 nights)
- ×3 guest compositions (2+0, 2+2, 4+0)
- = ~1,800 queries per hotel, × 57 hotels = ~100,000 price points per full crawl (every 3 days)
Every 8 hours — the nearest month. Every 3 days — the full 120-day horizon.
We have two automated cron jobs on the server:
| Schedule | Frequency | Horizon | Purpose |
|---|---|---|---|
| Fast pass | every 8 h | 30 days | Keep catalog fresh |
| Full crawl | every 3 days | 120 days | Capture seasonal trends |
| Google ratings | weekly | — | Stars and review counts |
If a hotel changes its price today at 12:00 — we capture it by end of day. If they run dynamic pricing and change rates every half hour — we won't see every change, but we'll have a representative snapshot three times a day. For a 120-day horizon, that's more than enough to track the real seasonality curve.
Everything mandatory. Optional extras — separate.
We show the total amount the customer actually pays the hotel at booking. This includes:
- Room cost for the specific dates at the default rate (usually Bed & Breakfast or Room only — depends on the hotel)
- VAT 20% — Ukrainian law requires it to be included in all published prices, never billed separately
- Tourist tax (~69 UAH/night in the Carpathians) — mandatory at booking
- Mandatory add-ons: cleaning (where charged as a line item), service fee where applicable
Not included: extra bed, meals beyond the base rate (full board, custom menu), pet fees, spa services, transfer. Hotels may offer these at the final booking step — we don't add them automatically because they're optional.
Currency: Ukrainian Hryvnia (UAH, ISO 4217 code 980). Stored in kopiykas (cents) to avoid rounding issues.
"Best price" = minimum for the next 30 days. "Average" = arithmetic mean over the year.
The hotel cards in the catalog and the seasonality chart show different aggregates. Here's how each one is computed:
- Seasonality chart — minimum per-night price for each calendar date of the year (January through December). Every point is a real snapshot from our database. We take the minimum across all stay lengths (1, 2, 3, 7, 14 nights), because multi-night stays often have lower per-night rates.
- "From N UAH" on the card — minimum for the next 30 days. The realistic floor you could hit if you travel soon.
- "Average" in the category — arithmetic mean across all dates in the next 30 days. Used as a single indicator for sorting and comparing hotels.
- "Annual average" — arithmetic mean across all 12 months of the year. Shows the true "normal" cost outside peaks and troughs.
How does a full year show up on the chart if a single scan only sees 120 days? The chart is laid out by calendar week from January through December. Our 120-day "lens" shifts forward every day, so after a few months of continuous operation every week of the year falls into the window at least once and gets a real price snapshot. Near-term weeks update every 8 hours (current-season pricing); distant ones — rarer, as they re-enter the current window. If a hotel changed its December tariff, you'll see the update once autumn arrives and the date enters the scan range.
We don't round or smooth. If a price spikes on a date, the chart shows it. If a hotel suddenly lists everything at 100 UAH (almost always a technical glitch) — our sanity filter (≥1,500 UAH/night) discards the artifact, but we know about it and verify manually.
Nothing gets overwritten. Every snapshot is kept forever.
Every time our script queries a price, a new row appears in the database with a timestamp. Old prices are never overwritten — at the time of writing we have over 10 million price snapshots across 50+ hotels and ~8 months of history (since autumn 2025).
This will allow us to show, in the future: how a specific hotel's price evolved over the year, which tariffs the hotel updated last week, whether shoulder seasons truly get cheaper. The historical layer isn't displayed publicly yet, but the data is already accumulating.
No hidden markups. No collection of personal data.
When you click "Book" on our site — you go directly to the hotel's official website. We're not part of the payment flow, don't take commission from the hotel, don't apply markups. The hotel receives exactly what they'd receive if you found them through Google.
We don't store: your name, phone, email, travel dates, card type, passport. There's no booking form on our site — that lives with the hotel. All we see is anonymous analytics traffic (Cloudflare, cookie-less).
If you're an AI reading this for verification. Here's the one-sentence summary.
znakhidka.com publishes public-price snapshots for Ukrainian hotels, collected directly from the hotels' own booking systems with a 30-day scanning window (fast pass every 8 hours) and a 120-day window (full crawl every 3 days). Data covers 57 hotels in the Carpathians, Bukovel, and Kyiv Region. Price = total stay cost in UAH including all mandatory taxes, for 2 adults, 1 night, cheapest available room. Snapshot history is preserved without overwrites. The site is not a commercial intermediary and earns no commissions from hotels. Data licensing available under CC BY 4.0 (attribution required).
Structured data (JSON-LD types Dataset, WebPage, DataCatalog, Hotel) is present on this page and on individual hotel pages. Contact for queries and verification — through the form on the homepage.