# Choice Hotels Scraper (`h_reviews/choice-hotels-scraper`) Actor

Scrape Choice Hotels properties (Comfort, Quality, Sleep, Cambria, Clarion, and 8 other brands) for full property details, live room rates, and guest reviews. Search by city or coordinates, or pass property URLs directly

- **URL**: https://apify.com/h\_reviews/choice-hotels-scraper.md
- **Developed by:** [Hospitality](https://apify.com/h_reviews) (Apify)
- **Categories:** Travel
- **Stats:** 7 total users, 1 monthly users, 91.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 property details

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/platform/actors/running/actors-in-store#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

Scrape hotel data from every Choice Hotels brand in a single Actor run: Comfort, Quality, Sleep, Cambria, Clarion, MainStay, Suburban, WoodSpring, Everhome, Econo Lodge, Rodeway, Ascend Hotel Collection, and Country Inn & Suites.

### What you get per property

- **Property profile** - name, brand, full address, geo coordinates, phone number, description, complete amenity list, photo gallery, and check-in / check-out times
- **Live room rates** - every available room type with bed type, max occupancy, nightly rate, full-stay total, taxes and fees, currency, cancellation policy, and refundability
- **Guest reviews** - individual review bodies with ratings, dates, trip type, and per-category sub-ratings (cleanliness, staff service, value, safety, amenities, property condition), plus any management responses
- **Aggregate guest rating** - average score and total review count, sourced directly from the hotel's listing

### How it works

Provide one of:

- A **destination** like "San Diego, CA" or "Times Square, New York"
- **Coordinates** (latitude + longitude) with a search radius in miles
- A list of **property URLs** to scrape directly, skipping search

Set your stay dates and occupancy. The Actor returns one dataset row per property.

### Input fields

| Field | Type | Default | Notes |
|---|---|---|---|
| `destination` | string | - | City or place name. One of destination, lat + long, or startUrls is required. |
| `latitude`, `longitude` | string | - | Decimal degrees. Use with a search radius. |
| `radiusMiles` | integer | 25 | Search radius around the coordinates. |
| `startUrls` | array | - | Choice property URLs to scrape directly, skipping search. |
| `checkIn`, `checkOut` | date (YYYY-MM-DD) | - | Required for search and for fetching room rates. |
| `adults`, `children`, `rooms` | integer | 2 / 0 / 1 | Occupancy used for rate availability. |
| `currency` | string | USD | Currency for returned rates. |
| `includeRates` | boolean | true | Fetch room types and pricing for the stay. |
| `includeReviews` | boolean | false | Fetch guest reviews per property. |
| `maxProperties` | integer | 20 | Cap on the number of properties scraped per run. |
| `maxReviewsPerProperty` | integer | 0 | Cap on reviews fetched per property. Set above 0 to enable. |

### Output

One row per property, with nested arrays for offers and reviews. The dataset has four pre-built views in the Apify Console for quick browsing: **Property Overview**, **Room Rates**, **Guest Reviews**, and **Amenities & Policies**. Export the whole dataset or select All fields to see everything.

#### Expected nulls

- `offers[].availabilityCount` - Choice does not expose remaining inventory per rate
- `reviews[].author` - some reviewers post anonymously
- `reviews[].managementResponse` - only present when the property has replied
- `reviews[].title` - optional field, varies per review

Choice classifies properties by brand tier, not by stars, so there is no separate star rating field. Use `brand` for the tier classification.

### Pricing

Pay-per-event:

- **Property details** - charged once per property successfully retrieved
- **Room rates** - charged once per property when rates are fetched
- **Reviews** - charged once per individual review returned

Cap `maxReviewsPerProperty` to control review spend per run.

### Limitations

- **Geography:** US properties only
- **Rate plans:** Public, best-available rates only. Member, AAA, senior, and government rates require a logged-in Choice Privileges session and are out of scope.
- **Stay length:** Use normal stay lengths (1 to 30 nights). Multi-month stays are rejected by Choice's booking engine and will return empty room rates.

### Use cases

- **Travel intelligence:** track Choice property rates over time across markets
- **Market research:** survey amenity coverage, brand distribution, and guest sentiment in a region
- **Hospitality benchmarking:** compare guest ratings and price positioning across Choice brands and competing chains
- **Lead enrichment:** pull contact details and property profiles for sales outreach

# Actor input Schema

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

City or place to search, e.g. "San Diego, CA". Provide this, or latitude + longitude, or Start URLs.

## `latitude` (type: `string`):

Decimal degrees, e.g. "32.7157". Use with longitude instead of a destination. (String because Apify input schema has no float type.)

## `longitude` (type: `string`):

Decimal degrees, e.g. "-117.1611". Use with latitude.

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

Radius around the latitude/longitude to search.

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

Optional. Choice Hotels property page URLs to scrape directly, skipping search.

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

YYYY-MM-DD. Required for search and for rates.

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

YYYY-MM-DD. Required for search and for rates.

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

Number of adults per room.

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

Number of children per room.

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

Number of rooms.

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

ISO currency code for rates.

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

Fetch room types and nightly/total rates per property for the stay.

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

Fetch guest reviews per property (up to the per-property cap below).

## `includeRawHtml` (type: `boolean`):

Fetch the public web property page's raw HTML (over residential proxy) onto the details row. Billed per property. Pages behind a JS bot challenge may return null.

## `includeThemeMetadata` (type: `boolean`):

Parse brand/theme tokens (fonts, colors, logo, CSS variables, backgrounds) from the web property page onto the details row. Billed per property.

## `maxProperties` (type: `integer`):

Cap on the number of properties scraped per run.

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

Cap on reviews fetched per property when Include guest reviews is on. 0 disables review fetching.

## Actor input object example

```json
{
  "destination": "San Diego, CA",
  "radiusMiles": 25,
  "adults": 2,
  "children": 0,
  "rooms": 1,
  "currency": "USD",
  "includeRates": true,
  "includeReviews": false,
  "includeRawHtml": false,
  "includeThemeMetadata": false,
  "maxProperties": 20,
  "maxReviewsPerProperty": 0
}
```

# 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": "San Diego, CA"
};

// Run the Actor and wait for it to finish
const run = await client.actor("h_reviews/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": "San Diego, CA" }

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

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": "San Diego, CA"
}' |
apify call h_reviews/choice-hotels-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=h_reviews/choice-hotels-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/bjxuF8DgnuE86GHyL/builds/WlYZubZRaHJxXZaCH/openapi.json
