Observatory Price Scraper

Local build — modeled on the production observatory price-shop report, not a pixel copy

Price points

Every distinct current price for this observatory, and how much of the calendar it covers.

How "sunset" is detected — two separate, independent checks, shown as two columns because they answer different questions:
  • Labeled sunset — the venue's own booking system tagged this time slot "Sunset" (or it's a dedicated sunset-named ticket type). This is the venue's own marketing claim, taken as-is from their data — it does not by itself mean the price is actually higher.
  • Confirmed premium — independent of any label: does this slot fall inside the real astronomical sunset window for that specific date in NYC (computed from actual sunrise/sunset times, not a fixed clock time), AND is it priced at least 10% above that same product's cheapest slot that day? Only counted when both are true.
A slot can be one, both, or neither — e.g. a venue may label a 3-hour block "Sunset" for marketing, but only the ~1-hour window around true dusk that's also priced higher counts as confirmed premium. For an exact per-slot breakdown, use Export CSV — the sunset_signals column shows exactly which checks fired for every row.

Products captured

Coverage

Source evidence

Most recently touched rows in price_current — what the scraper actually saw.

Each day: one swatch per venue, colored on THAT venue's own price range (a red ESB day and a red SUMMIT day are each peak-for-that-venue, not the same dollar amount). Click a day for the full intraday breakdown.

Daily price matrix

One row per (visit date, day part, product); one column per observatory — grouped by day part, not exact time, since each venue posts slots on its own cadence. Each cell shows that venue's own real time. Low/High compare across the row.

Change strategy by observatory

A "change" = a tracked slot's price or status differs from what the previous run saw (built on the delta-storage schema — no re-scan noise).

Change events

Data checks

One row per observatory — freshness, coverage, and how much history has accumulated.

Recent scrape runs