Extract hotel prices, ratings, amenities, star levels and deals from Priceline.com. Search any destination with date, room and guest filters; sort by price, rating or stars; return up to 500 results per search. Export data, run via API, schedule runs, or integrate with other tools.
All notable changes to Priceline Hotel Scraper are documented here.
v0.3.3 (2026-06-01) — B1 spike conclusion (no behavior change)
Reverted
Removed the v0.3.2 js_instructions click-loop experiment. The Apollo SSR transport blob does NOT refresh after clicking "Load More" — the raw HTML keeps 32 unique hotel IDs regardless of how many clicks fire (verified empirically in run v19UOjlAYQTrjUVLK, 30 listings returned, $0.002 cost).
Decision
B1 deferred. Pursuing > 32 hotels per search would require a DOM-card parser (custom selectors on rendered cards) AND would lose the rich Apollo fields (brand, lat/lng, timezone, themes, amenities, urgencyMessaging, savingsPercentage). Effort L + quality regression. Status quo is the historical baseline since v0.1.
Why
Audit B1 backlog item: Priceline lazy-loads results via a "Load More" button (no scroll triggers, no ?offset=N URL pagination). The Apollo SSR transport blob may or may not refresh post-click. Single-run spike to resolve the open question before committing to a full DOM-parser refactor (L effort).
v0.3.0 (2026-06-01)
Added (SEV-3 audit, 6 high-value Apollo fields)
brand and brandOwner - parent group of the hotel (e.g. "Doubletree" / "Hilton Worldwide"). Null when independent.
latitude and longitude - GPS coordinates from Apollo geoCoordinate. Null when not provided.
timezone - IANA timezone identifier from location.timeZone (e.g. "America/New_York").
hotelThemes - travel-theme tags Priceline associates with the property (e.g. ["Family", "Business"]). Empty array when none.
savingsPercentage - discount expressed as a percent off the strikethrough price (numeric, parsed from Apollo string). Null when not advertised.
urgencyMessaging - scarcity banner string ("We only have a few rooms left at $270"). Null when no banner.
Changed (breaking)
address is now populated from city + stateCode + countryCode (e.g. "New York, NY, US"). Previously hard-coded to "". Empty string when no location parts are available.
propertyType field removed from output. It was never populated by the Apollo response and was always an empty string. Downstream consumers must update their schemas.
Changed
defaultMemoryMbytes lowered from 512 to 256 MB. The hot path (single HTML fetch + regex parse + array map) fits comfortably under 256 MB; verified via local fixture parse and smoke run.
All internal log strings translated from French to English (e.g. "Tentative" -> "Attempt", "Démarrage" -> "Starting", "Aucun hôtel trouvé" -> "No hotels found"). Per the global English-only-internal-artifacts doctrine.
Em-dashes removed from log strings (zero em-dash policy).
Schema impact
dataset_schema.json: added 8 fields, removed propertyType, added a third "Location & Brand" view that surfaces brand, GPS, timezone.
openapi_schema.json: HotelResult schema updated to match.
v0.2.0 (2026-06-01)
Fixed (SEV-4 x 2)
totalPrice semantics corrected. Was computing pricePerNight x nights (taxes-excluded estimate) via abuse of the FX-conversion helper, which diverged 15-25% from grandTotal (Apollo-provided total including taxes & fees). Now totalPrice uses grandTotal when available (correct including-tax total), falling back to an estimated pricePerNight x nights only when Priceline does not surface a grand total. Dataset schema description updated.
Pagination scaffolding added. url-builder now accepts an offset parameter and main.ts loops through Priceline's listings pages, deduplicating by hotelId across pages, until maxResults is reached, no new hotels appear, totalAvailableHotels is exhausted, or a 20-page safety cap is hit. Known limitation: as of 2026-06-01 Priceline's GraphQL listings query does not expose pagination variables and the SSR layer largely ignores ?offset=N on the listings URL (returns the same first-30 hotels with minor reordering at the boundary, yielding only 1-2 incremental hotels per extra page). The loop scaffolding is kept in place so that this Actor will automatically benefit when Priceline restores SSR-driven pagination. Until then, results remain practically capped at ~30-32 hotels per search regardless of the maxResults input.
Added
hotelId field exposed on every dataset item (stable Priceline identifier, also used internally for cross-page deduplication).
OUTPUT KV record now reports pagesScraped, totalAvailableHotels, reachedCap, uniqueHotelsCollected, resultsReturned, maxResultsRequested for run-level observability.
v0.1.1 (2026-05-18)
Added
## FAQ section with 6 Q&A (login walls, scheduling, currencies, Express Deals, data freshness, blocking)
Changed
actor.json description rewritten to 3 canonical sentences with platform-features close (dropped "ready for analysis or integration" fluff)
README data table and JSON output example now include the grandTotal field
openapi_schema.jsonActorInput: added currency property with the 15-value enum aligned to input_schema.json
openapi_schema.jsonpriceMin/priceMax wording: "in USD" replaced with "in the selected currency (or scraped currency if none selected)"
Date defaults rolled forward: check-in 15/May/2026 → 20/June/2026, check-out 18/May/2026 → 23/June/2026 (input_schema, openapi defaults, openapi example, README data table, README input configuration table)
README L138 "pay-per-result" → "Pay per result" (canonical Apify nomenclature)
README L163 (EUR, GBP, etc.) → (EUR, GBP, and more)
Removed etc. from openapi currency description
Removed all em-dashes (zero em-dash policy 2026-05-18)
v0.1 (earlier)
Initial Store release. Pay-per-result pricing at $0.005 per hotel result. ZenRows-based extraction with destination + date + filter inputs, Apollo SSR JSON parsing, currency conversion across 15 currencies.