# Choice Hotels Scraper: Room Rates, Reviews & Rate-Drop Alerts (`getascraper/choice-hotels-scraper`) Actor

Extracts Choice Hotels properties (Comfort, Quality, Sleep Inn, Cambria, Clarion) by destination or coordinates. Returns real phone numbers, dated room rates with taxes, and guest reviews, never blank fields. Rate-drop monitor mode alerts you when a tracked hotel rate changes.

- **URL**: https://apify.com/getascraper/choice-hotels-scraper.md
- **Developed by:** [GetAScraper](https://apify.com/getascraper) (community)
- **Categories:** Travel, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.88 / 1,000 hotel records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Choice Hotels Scraper: Room Rates, Reviews & Rate-Drop Alerts

<table width="100%">
<tr>
<td style="padding:24px 28px;background:#ECFEFF;border:1px solid #A5F3FC;border-top:4px solid #0E7490;border-radius:12px">
<span style="font-size:23px;font-weight:800;color:#1C1917;line-height:1.3">Choice Hotels data with the blanks filled in</span><br>
<span style="font-size:15px;color:#57534E;line-height:1.6">Search Comfort, Quality, Sleep Inn, Cambria, and Clarion properties and get a real phone number, description, and dated room rate on every hotel, not a form waiting to be finished.</span>
</td>
</tr>
</table>

<table width="100%">
<tr>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #A5F3FC;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#0E7490">☎️ Phone numbers, always</span><br>
<span style="font-size:12px;color:#57534E">Every hotel comes with its actual front-desk number, not a blank field.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #A5F3FC;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#0E7490">📅 Rates by date, not just "from $X"</span><br>
<span style="font-size:12px;color:#57534E">Nightly price, taxes, and member discount for the exact dates you ask for.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #A5F3FC;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#0E7490">⭐ Reviews, on request</span><br>
<span style="font-size:12px;color:#57534E">Add real guest reviews to any hotel without a second run.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #A5F3FC;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#0E7490">🔔 Rate-drop alerts</span><br>
<span style="font-size:12px;color:#57534E">Track a hotel and dates once, get notified only when the price actually changes.</span>
</td>
</tr>
</table>

A hotel listing with no phone number is a dead end for anyone who needs to call ahead. This Actor pulls hotel data straight from [ChoiceHotels.com](https://www.choicehotels.com), covering Comfort, Quality, Sleep Inn, Cambria, Clarion, and other Choice-family brands across the US, with contact details, dated room rates, and guest reviews attached to every result.

### 🚀 Why use it

**"I compare hotel rates for a living."** I need nightly price, taxes, and member discount on every hotel in one run, not a starting price with no dates attached.

**"I build corporate travel tools."** A hotel record with no phone number is useless to a travel coordinator who needs to call ahead.

**"I track hotel pricing over time."** I want to know the moment a rate drops for the dates I'm watching, not re-run the same search every day and compare by hand.

### 🧭 How to use it

<table width="100%">
<tr>
<td style="padding:16px 14px;width:33%;background:#ECFEFF;border:1px solid #A5F3FC;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#0E7490;letter-spacing:1px">STEP 1</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Pick a destination and your dates</span><br>
<span style="font-size:12px;color:#57534E">Search by city name or exact coordinates, plus check-in and check-out.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#ECFEFF;border:1px solid #A5F3FC;border-left:none;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#0E7490;letter-spacing:1px">STEP 2</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Run it once, or schedule it</span><br>
<span style="font-size:12px;color:#57534E">Turn on monitor mode to get notified only when a tracked rate changes.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#ECFEFF;border:1px solid #A5F3FC;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#0E7490;letter-spacing:1px">STEP 3</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Get every hotel, fully attached</span><br>
<span style="font-size:12px;color:#57534E">Contact info, dated rates, and reviews already in the same row.</span>
</td>
</tr>
</table>

### 📥 Input

| Field | Type | Required | Description |
|---|---|---|---|
| `mode` | enum | No | Search a destination for multiple hotels, or fetch specific hotels directly. |
| `destination` | string | No | A US city and state to search, e.g. "Nashville, TN". Search mode only. |
| `latitude` / `longitude` | float | No | Search around a point instead of a city name. Search mode only. |
| `radiusMiles` | integer | No | How far from the destination or point to search. |
| `hotelCodes` | array of strings | No | Choice Hotels property codes to fetch directly. Fetch specific hotels mode only. |
| `startUrls` | array of URLs | No | Direct ChoiceHotels.com property page URLs to fetch. Fetch specific hotels mode only. |
| `brand` | enum | No | Limit search results to one Choice Hotels brand. |
| `petFriendly` | boolean | No | Only return hotels that allow pets. |
| `minRating` | integer | No | Only return hotels with at least this average guest rating. |
| `checkIn` / `checkOut` | string | No | Stay dates. Needed to fetch dated room rates. |
| `adults` / `children` / `rooms` | integer | No | Occupancy for rate pricing. |
| `currency` | enum | No | Currency for displayed rates. |
| `proxyConfiguration` | object | No | Connection settings. Works reliably with the default. |
| `includeRates` | boolean | No | Fetch dated room rates for each hotel. |
| `includeReviews` | boolean | No | Fetch guest reviews for each hotel. |
| `monitorMode` | boolean | No | When on, only pushes a hotel when its tracked rate has changed since the previous run. |
| `maxItems` | integer | No | Stop after this many hotels. |
| `maxReviewsPerProperty` | integer | No | Stop fetching reviews for a hotel after this many. |

### 📤 Output

```json
{
  "rowType": "detail",
  "hotelCode": "TN877",
  "name": "Cambria Hotel Nashville Midtown",
  "brandCode": "BR",
  "brandName": "Cambria",
  "street": "1409 Church Street",
  "city": "Nashville",
  "state": "TN",
  "postalCode": "37203",
  "latitude": 36.156,
  "longitude": -86.795,
  "phone": "(615) 931-0777",
  "description": "Book direct at the Cambria Hotel Nashville Midtown in Nashville, TN near Nashville Convention Center and Nashville International Airport.",
  "amenities": ["Free WiFi", "Fitness Center", "On-site Restaurant"],
  "ratingValue": 4.1,
  "ratingMax": 5,
  "reviewsCount": 612,
  "recommends": 480,
  "rates": [
    {
      "checkIn": "2026-09-20",
      "checkOut": "2026-09-21",
      "nightlyRate": 279.03,
      "totalRate": 325.5,
      "taxAmount": 46.47,
      "memberRate": 251.13,
      "discountPercentage": 10
    }
  ],
  "status": "ACTIVE",
  "sourceUrl": "https://www.choicehotels.com/hotels/TN877",
  "scrapedAt": "2026-09-05T05:10:48.409Z"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

### 🗃️ Data table

| Field | Type | Description |
|---|---|---|
| `name` | string | Hotel name |
| `brandCode` / `brandName` | string | Which Choice Hotels brand the property belongs to |
| `street` / `city` / `state` / `postalCode` | string | Full address components |
| `latitude` / `longitude` | number | Geographic coordinates |
| `phone` | string | The hotel's own front-desk number |
| `description` | string | A short, hotel-specific summary |
| `amenities` | array | Amenities the hotel offers |
| `images` | array | Hotel photo URLs |
| `ratingValue` / `ratingMax` | number | Average guest rating |
| `reviewsCount` / `recommends` | number | How many guests reviewed, and how many recommend the hotel |
| `rates` | array | Nightly price, taxes, and member discount for the requested dates |
| `reviews` | array | Individual guest reviews, when requested |
| `status` | string | Whether the property is currently active |
| `sourceUrl` | string | Link to the hotel's own page |

### 💰 Pricing

This Actor uses pay per event pricing: you're charged per hotel record extracted, and nothing else. Empty runs cost nothing. There are no subscriptions and no minimum spend.

### ⭐ Enjoying Choice Hotels Scraper?

<table width="100%" style="display:table;width:100%">
<tr>
<td style="padding:20px 24px 14px;background:#ECFEFF;border:1px solid #A5F3FC;border-left:5px solid #0E7490;border-radius:10px 10px 0 0">
<span style="font-size:20px;letter-spacing:4px">⭐ ⭐ ⭐ ⭐ ⭐</span><br>
<span style="font-size:17px;font-weight:800;color:#1C1917">If this saved you from a hotel record with no phone number, that's worth a rating.</span><br>
<span style="font-size:14px;color:#57534E">A 5-star rating helps other travel and hospitality teams find it. Your feedback also tells us what to build next.</span>
</td>
</tr>
<tr>
<td style="padding:0;background:#0E7490;border:1px solid #A5F3FC;border-top:none;border-radius:0 0 10px 10px;text-align:center">
<a href="https://apify.com/getascraper/choice-hotels-scraper/reviews" style="display:block;padding:13px 16px;color:#FFFFFF;text-decoration:none;font-weight:800;font-size:15px;letter-spacing:0.3px">★&nbsp;&nbsp;Rate this Actor on Apify</a>
</td>
</tr>
</table>

### ❓ FAQ

**Does this Actor need a Choice Hotels or Choice Privileges account?**
No. Every field comes from the site's own public pages. There's no login, credential, or key input anywhere in this Actor.

**Which brands does it cover?**
Comfort, Quality, Sleep Inn, Cambria, Clarion, Econo Lodge, Rodeway Inn, MainStay Suites, Suburban Studios, and Ascend Hotel Collection, all US properties.

**Why is a field sometimes missing on one hotel?**
Not every hotel publishes every field. A field left out of a result means the site itself doesn't have that data for that property, never a placeholder.

**Can I get alerted only when a rate drops, not the whole search every time?**
Yes. Turn on monitor mode with your check-in and check-out dates, and schedule the Actor to run periodically. Each run after the first only pushes a hotel when its rate has actually changed.

**Is this legal?**
This Actor only extracts publicly available information already shown to any visitor of the site. Always review the target site's terms of service before using the data commercially.

### 🔗 Other actors

- [Ostrovok Hotels Scraper: Отели Островок](https://apify.com/getascraper/ostrovok-hotels-scraper) ↗ - Hotel listings and rates from Ostrovok, Eastern Europe's booking platform.
- [Pages d'Or Gouden Gids Scraper: VAT, KBO & Business Leads](https://apify.com/getascraper/pagesdor-goudengids-scraper) ↗ - Belgian business directory leads with VAT and government register status.
- [Capitol Trades Scraper: Congress Stock Trades & Monitor Mode](https://apify.com/getascraper/capitol-trades-scraper) ↗ - US Congress stock-trade disclosures with monitor mode.
- [Forge Global Scraper: Pre-IPO Valuations & Funding Rounds](https://apify.com/getascraper/forge-global-scraper) ↗ - Private company valuations and funding-round history.

# Actor input Schema

## `mode` (type: `string`):

Search a destination for multiple hotels, or fetch one or more specific hotels directly.

## `destination` (type: `string`):

A US city and state to search, e.g. "Nashville, TN". Search mode only.

## `latitude` (type: `number`):

Alternative to destination: search around a point instead of a city name. Search mode only.

## `longitude` (type: `number`):

Used together with latitude. Search mode only.

## `radiusMiles` (type: `integer`):

How far from the destination or point to search. Search mode only.

## `hotelCodes` (type: `array`):

Choice Hotels property codes to fetch directly. Fetch specific hotels mode only.

## `startUrls` (type: `array`):

Direct ChoiceHotels.com property page URLs to fetch. Fetch specific hotels mode only.

## `brand` (type: `string`):

Limit search results to one Choice Hotels brand. Leave blank for all brands. Search mode only.

## `petFriendly` (type: `boolean`):

Only return hotels that allow pets.

## `minRating` (type: `integer`):

Only return hotels with at least this average guest rating (out of 5). 0 disables the filter.

## `checkIn` (type: `string`):

YYYY-MM-DD. Needed to fetch dated room rates. Leave blank to skip rates.

## `checkOut` (type: `string`):

YYYY-MM-DD. Must be after check-in.

## `adults` (type: `integer`):

Number of adults per room.

## `children` (type: `integer`):

Number of children per room.

## `rooms` (type: `integer`):

Number of rooms to price.

## `currency` (type: `string`):

Currency for displayed rates.

## `proxyConfiguration` (type: `object`):

A real browser session is required to load ChoiceHotels.com. Datacenter proxies are blocked outright by the site's bot protection (confirmed live), so Residential is the default here.

## `includeRates` (type: `boolean`):

Fetch dated, occupancy-aware room rates for each hotel (requires check-in/check-out). This is the Actor's main value beyond a starting price.

## `includeReviews` (type: `boolean`):

Fetch guest reviews for each hotel, bounded by "Max reviews per hotel" below.

## `monitorMode` (type: `boolean`):

When on, scheduled runs only push a row when the tracked hotel's rate for the given dates has changed since the previous run. Requires check-in/check-out and either hotel codes or hotel URLs.

## `maxItems` (type: `integer`):

Stop after this many hotels. Each one is a separate page load, so keep this modest for a quick run.

## `maxReviewsPerProperty` (type: `integer`):

Stop fetching reviews for a hotel after this many. Only used when "Include guest reviews" is on.

## Actor input object example

```json
{
  "mode": "search",
  "destination": "Nashville, TN",
  "radiusMiles": 25,
  "hotelCodes": [],
  "startUrls": [],
  "brand": "",
  "petFriendly": false,
  "minRating": 0,
  "adults": 2,
  "children": 0,
  "rooms": 1,
  "currency": "USD",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "includeRates": true,
  "includeReviews": false,
  "monitorMode": false,
  "maxItems": 10,
  "maxReviewsPerProperty": 5
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "destination": "Nashville, TN",
    "hotelCodes": [],
    "startUrls": [],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/choice-hotels-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "destination": "Nashville, TN",
    "hotelCodes": [],
    "startUrls": [],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("getascraper/choice-hotels-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "destination": "Nashville, TN",
  "hotelCodes": [],
  "startUrls": [],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call getascraper/choice-hotels-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,getascraper/choice-hotels-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/hzRnEC9CKCJPpnhmZ/builds/5s8jaSwVrY5g14Q5u/openapi.json
