Priceline Hotel Reviews Scraper avatar

Priceline Hotel Reviews Scraper

Pricing

from $0.49 / 1,000 results

Go to Apify Store
Priceline Hotel Reviews Scraper

Priceline Hotel Reviews Scraper

Extracts the full verified-guest review history for any hotel on Priceline.com by hotel URL, with pros/cons text, per-category scores and traveller type.

Pricing

from $0.49 / 1,000 results

Rating

0.0

(0)

Developer

Ibnu Adzim

Ibnu Adzim

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Extracts the full verified-guest review history for any hotel listed on Priceline.com — just give it the hotel page link.

Why use this actor

  • No account, no login, and no API key needed — works on public hotel pages only.
  • Returns every guest review up to your chosen limit, not just the handful shown on the page: separate "liked" and "disliked" text, the guest's score, traveller type (couple, family, business, solo…), their home city, and the review date.
  • Also returns Priceline's own rating breakdown per hotel — Location, Staff, Cleanliness and Overall scores, plus the score-band and traveller-type filter counts.
  • Choose the review order: most recent, highest score, or lowest score — useful when you only care about the newest feedback or the complaints.
  • Stable, flat JSON that drops straight into a spreadsheet, database, or analysis pipeline.
  • Every hotel you submit gets at least one output row — including a clear diagnostic reason on the rare rows that couldn't be fetched, so nothing silently disappears from your results.

How it works

  1. You give the actor one or more Priceline hotel page links (or bare hotel IDs).
  2. For each hotel, it reads that hotel's review history, 100 reviews at a time, until it reaches your limit or runs out of reviews.
  3. Results are streamed to your dataset as they finish, with automatic retries when Priceline is temporarily unresponsive.
  4. You export the finished dataset as JSON, CSV, or Excel straight from the Apify Console — no scrapers, browsers, or blocks to babysit.

Input

{
"hotelUrls": [
"https://www.priceline.com/hotel-deals/en-us/P3000001947/H41914/the-biltmore-los-angeles.ssp"
],
"maxReviewsPerHotel": 300,
"sortBy": "MOST_RECENT",
"maxConcurrency": 3,
"proxyConfiguration": { "useApifyProxy": false }
}
FieldTypeDescription
hotelUrlsarray of stringsPriceline hotel page URLs. Both the public hotel-deals page (.../H41914/<slug>.ssp) and the booking page (/relax/at/41914/...) work, and a bare hotel ID such as 41914 is also accepted.
maxReviewsPerHotelintegerStop after this many reviews per hotel. Reviews are fetched 100 at a time, so this maps directly to how much work each hotel costs. Set to 0 to fetch every review. Default 300.
sortBystringMOST_RECENT, HIGHEST_SCORE, or LOWEST_SCORE. Default MOST_RECENT.
maxConcurrencyintegerHow many hotels to process at the same time. Default 3.
proxyConfigurationobjectProxy settings. Off by default; Residential is recommended for large production runs.

Output

Each hotel produces one summary row plus one review row per guest review. Real examples from a live run:

Summary row (recordType: "SUMMARY"):

{
"_input": "https://www.priceline.com/hotel-deals/en-us/P3000001947/H41914/the-biltmore-los-angeles.ssp",
"_source": "S1-graphql-getreviewsbyhotelids",
"_scrapedAt": "2026-08-10T18:13:22Z",
"recordType": "SUMMARY",
"hotelId": "41914",
"totalReviews": 770,
"totalPages": 8,
"reviewSummary": {
"scores": [
{ "type": "LOCATION", "label": "Location", "score": "8.6" },
{ "type": "STAFF", "label": "Staff", "score": "8.4" },
{ "type": "CLEANLINESS", "label": "Cleanliness", "score": "8.3" },
"… 1 more"
],
"total": { "count": "2062", "label": "2,062 Reviews" }
},
"filterSummary": {
"sortOptions": [
{ "value": "MOST_RECENT", "label": "Most Recent" },
{ "value": "HIGHEST_SCORE", "label": "Highest Review" },
{ "value": "LOWEST_SCORE", "label": "Lowest Review" }
],
"filters": [
{
"filterType": "RATING",
"title": "Score",
"options": [
{ "count": 1095, "label": "9-10", "value": "9,10", "sublabel": "(1095)" },
{ "count": 574, "label": "7-8", "value": "7,8", "sublabel": "(574)" },
{ "count": 203, "label": "5-6", "value": "5,6", "sublabel": "(203)" },
"… 2 more"
]
}
]
}
}

Review row (recordType: "REVIEW"):

{
"_input": "https://www.priceline.com/hotel-deals/en-us/P3000001947/H41914/the-biltmore-los-angeles.ssp",
"_source": "S1-graphql-getreviewsbyhotelids",
"_scrapedAt": "2026-08-10T18:13:22Z",
"recordType": "REVIEW",
"hotelId": "41914",
"positiveRemark": "Level of service, best I've ever experienced ",
"negativeRemark": "There was a very loud concert venue across the street making it very hard to sleep\nAlso parking is limited and expensive \nFood is way overpriced ",
"genericText": null,
"scores": [
{ "type": "OVERALL", "score": "10", "label": "Overall" }
],
"reviewerInfo": {
"name": "Michelle",
"travelerType": { "type": "COUPLE", "label": "Traveling as a Couple" },
"location": "North Las Vegas, NV"
},
"reviewId": "3966872680",
"entryDate": "Jul 2026"
}

When the input isn't a recognisable Priceline hotel link, the actor still emits one row for that input with a clear reason:

{
"_input": "https://example.com/not-priceline",
"_source": "none",
"_scrapedAt": "2026-08-10T18:13:22Z",
"recordType": "ERROR",
"_error": "invalid_input",
"_errorDetail": "Expected a priceline.com hotel URL (e.g. https://www.priceline.com/hotel-deals/en-us/P3000001947/H41914/<slug>.ssp or https://www.priceline.com/relax/at/41914/...) or a bare hotel id such as 41914."
}
FieldTypeDescription
_inputstringThe hotel URL or ID you submitted.
_sourcestringWhich internal strategy produced this row. "none" on a failed row.
_scrapedAtstringUTC timestamp of when this row was produced.
recordTypestring"SUMMARY", "REVIEW", or "ERROR".
hotelIdstringPriceline's numeric hotel ID.
totalReviewsintegerHow many written reviews this hotel has in total (summary row).
reviewSummaryobjectPriceline's own category scores plus the site-wide review count (summary row).
filterSummaryobjectAvailable sort options and the score/traveller-type filter counts (summary row).
positiveRemarkstringWhat the guest liked. null when they left none.
negativeRemarkstringWhat the guest disliked. null when they left none.
genericTextstringFree-form comment when the guest didn't split it into likes/dislikes.
scoresarrayThe guest's own score(s) for this stay.
reviewerInfoobjectReviewer first name, traveller type, and home location.
reviewIdstringPriceline's stable ID for this review — safe to de-duplicate on.
entryDatestringMonth and year the review was posted, e.g. "Jul 2026".
_errorstringPresent only on rows that couldn't be fetched, e.g. invalid_input, hotel_not_found.
_errorDetailstringHuman-readable detail for the error, present only alongside _error.

Notes / limits

  • totalReviews (reviews with written text — what this actor returns) is smaller than the site-wide count in reviewSummary.total.count, which also counts score-only ratings with no text. Both are reported so you can see the difference.
  • Reviewer names are first names only and locations are city-level — that is all Priceline publishes.
  • entryDate has month precision ("Jul 2026"), not a full date.
  • A partial_* error row means pagination stopped partway through a hotel after already returning some real reviews — you still get what was fetched, plus a diagnostic explaining why it stopped early.

Other actors in this collection

ActorWhat it returns
HolidayCheck Hotel Reviews ScraperGuest reviews for hotels listed on HolidayCheck (.de/.at/.ch)
Agoda Reviews ScraperGuest reviews for hotels listed on Agoda.com
Booking.com Reviews ScraperGuest reviews for hotels listed on Booking.com
Trip.com Reviews ScraperGuest reviews for hotels listed on Trip.com
Orbitz Hotel Reviews ScraperGuest reviews for hotels listed on Orbitz.com
Viator Reviews ScraperGuest reviews for tours/activities listed on Viator
GetYourGuide Reviews ScraperGuest reviews for tours/activities listed on GetYourGuide