# UpFront Reviews Scraper & Property Intelligence (`thescrapelab/upfront-reviews-intelligence`) Actor

Scrape UpFront Reviews guest reviews, ratings and owner replies from public accommodation pages. Export CSV or JSON, compare holiday rental properties in an HTML report, and add optional AI guest feedback analysis. No source API key required.

- **URL**: https://apify.com/thescrapelab/upfront-reviews-intelligence.md
- **Developed by:** [Inus Grobler](https://apify.com/thescrapelab) (community)
- **Categories:** Travel
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 review delivereds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## UpFront Reviews Scraper: Export Guest Reviews & Ratings

Scrape UpFront Reviews guest reviews, ratings, and owner replies from public accommodation pages. Export CSV or JSON for holiday rental review analysis, compare properties in a readable HTML report, and add optional AI-powered guest feedback insights.

Built for property managers, holiday rental agencies, and hospitality researchers who want to understand guest experiences without copying reviews by hand.

This is an independent, unofficial Actor. It is not affiliated with UpFront Reviews or SuperControl. It reads public pages and does not need a source API key or booking-system login.

### Quick start — three steps

1. Paste your property or company link into **Links to scrape**. Keep the example if you just want to try it.
2. Set **Number of reviews** (10 is a good first run). Optionally turn on **Add AI insights**.
3. Click **Start**. When the run finishes, open **Read your report** in the Output tab.

That is all you need for a normal run. Date filters, location search, and advanced limits are in collapsible sections. No coding, prompt writing, or API key entry is required.

For a simple JSON input:

```json
{
  "startUrls": [
    "https://www.upfrontreviews.com/reviews/23315/windermere-marina-village/hawkshead-apartments-8-marina-view/611907/"
  ],
  "maxReviews": 20,
  "enableAi": false
}
```

Number of reviews is a total limit across all links, not a promise that the source contains that many matching reviews. For multiple properties, a property can use most of the limit; set Reviews per property in Advanced limits if you want to spread the sample.

### What data can you export from UpFront Reviews?

- One review row per guest review, including title, text, submitted date, overall and category ratings, recommendation, published stay details, and an available owner reply.
- Property-summary rows with published aggregate scores and statistics calculated separately over your collected sample.
- An HTML report with a cross-property comparison table, category scores, expandable reviews, and optional AI feedback themes.
- Separate CSV downloads with plain-English columns: **Guest reviews** (one row per review) and **Property summaries** (one row per property).
- A run summary showing page counts, failures, coverage limits, AI availability, and reported AI usage.

Every review has a stable identifier and a link to the original evidence. Missing source fields remain null.

### Use cases for accommodation review analysis

- **Improve guest experience:** review feedback about cleanliness, comfort, maintenance, location, value, and service.
- **Compare holiday rental properties:** inspect published scores alongside clearly labeled collected-sample ratings.
- **Analyze guest feedback:** enable AI to group supported strengths and complaints and suggest practical improvements.
- **Research accommodation reviews:** export source-linked records for spreadsheets, dashboards, or your own analysis.

### Pricing and recommended run settings

Pay only for delivered reviews and optional, successfully saved AI analysis. Platform usage, property summaries, owner replies, reports, and downloads are included; there is no separate dataset-row fee.

| Item | Price |
| --- | ---: |
| Delivered review | $0.002 ($2 per 1,000) |
| Optional AI analysis | Additional $0.003 per analyzed review |
| Actor start | $0.00005 per run at supported 256–512 MB RAM |

The start fee applies even if a run fails or finds no matching reviews. Failed or unavailable AI has no AI surcharge. Duplicate links and repeated theme mentions do not create extra review charges within a run. Starting a new run collects a new snapshot and may charge again.

For example, 10 reviews cost **$0.02005 without AI**, or **$0.05005 if all 10 are analyzed**. A 100-review run costs $0.20005 without AI or $0.50005 with all 100 analyzed. For 1,000 reviews with the maximum 100 AI-analyzed reviews per run, the total is $2.30005. These examples assume the requested results are available and all optional analyses succeed.

Set **Maximum cost per run** in Apify to control your spending. The minimum accepted limit is $0.00205, enough for the start and one review. Reviews take priority over optional AI when the limit is small; your report explains reduced AI coverage. For a 10-review trial, a $0.06 limit covers either option. A spending limit is a ceiling, not a flat fee. Check the Actor's Pricing tab for the current rates.

API users: always send a **positive** `maxTotalChargeUsd` (`max_total_charge_usd` in Python). Do not use zero to request a free test: Apify may treat zero as an omitted limit and apply your account's default allowance.

Recommended run settings are 256 MB RAM and a 180-second timeout. For bulk AI analysis, use a 240-second timeout; unusually large source pages may benefit from 512 MB RAM. Runs exit as soon as the work finishes. The timeout is a safety ceiling, not a minimum billable duration. Page, time, and spending limits still apply: larger requested limits do not guarantee complete coverage.

### Find accommodation companies by location

You may also supply an accommodation-company URL to collect reviews from its properties. Overlapping company and property inputs are deduplicated.

Open Find companies by location, remove the example from Links to scrape, turn on Search by location, and choose a country. UK searches require a region, such as Scotland. An optional subregion narrows UK results further. Use the region labels displayed in the public UpFront Reviews directory.

Location filters apply to the site's accommodation-company directory, not verified property addresses. A company can list properties outside the selected area. Use direct property URLs when exact property location matters.

```json
{
  "startUrls": [],
  "discover": true,
  "country": "GB",
  "region": "Scotland",
  "maxReviews": 10,
  "enableAi": false
}
```

### Inputs and limits

| Input                                | Behavior                                                                                                          |
| ------------------------------------ | ----------------------------------------------------------------------------------------------------------------- |
| startUrls                            | Property or company URLs; at most 100.                                                                            |
| discover, country, region, subregion | Optional public-directory discovery and location filters.                                                         |
| dateFrom, dateTo                     | Inclusive submitted-date filters in YYYY-MM-DD format. Undated reviews are excluded when a date filter is active. |
| maxProperties                        | Default 10; maximum 100 properties across all inputs.                                                             |
| maxReviewsPerProperty                | Optional advanced cap. When empty, follows maxReviews; maximum 2,000.                                             |
| maxReviews                           | Maximum exported review rows across all properties; default 10, hard ceiling 2,000.                               |
| maxRequests                          | Default 10; maximum 250 page attempts, including retries.                                                         |
| enableAi                             | Optional AI analysis, off by default.                                                                             |
| maxAiReviews                         | Optional advanced cap. When empty, follows maxReviews up to 100 newest collected reviews.                         |

With no inputs, the Actor uses one example property and collects up to 10 reviews. For a larger sample, change Number of reviews. The per-property and AI limits follow automatically when left empty. Explicit advanced values still take precedence, including values saved in older tasks. Page, property, time, and spending limits can reduce the final sample.

### Output: guest review CSV, property summaries, and reports

| Output link                   | Use it for                                                                                                                                             |
| ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Read your report              | The easiest way to read findings, compare properties, and inspect source evidence.                                                                     |
| Guest reviews — CSV           | Open in Excel or import into Google Sheets; one row per review with rating, text, date, owner reply, and source link.                                  |
| Property summaries — CSV      | Compare properties in a spreadsheet, with clearly separated published and collected-sample ratings. AI insight columns are empty when analysis is off. |
| All data — JSON (advanced)    | Complete original records for integrations, including IDs, nested scores, and every AI observation.                                                    |
| Run details — JSON (advanced) | Troubleshoot source failures, limits, timings, and AI availability.                                                                                    |

CSV column headings use plain English. Blank cells mean the source did not provide a value or the field does not apply; they do not mean zero. Scores are out of 5. Empty results still include CSV headers. CSV text beginning like a spreadsheet formula is protected with a leading apostrophe; original JSON text stays unchanged.

The default dataset contains review and property\_summary records. Use recordType to select the rows you need. The Guest reviews and Property summaries views expose relevant columns; exports may include both row types.

Example review fields:

```json
{
  "recordType": "review",
  "reviewId": "123",
  "propertyId": "9",
  "propertyName": "Example Cottage",
  "title": "Relaxing stay",
  "text": "A peaceful location with a comfortable bed.",
  "submittedDate": "2026-09-01",
  "rating": 4.7,
  "recommends": true,
  "ownerReply": null,
  "sourceUrl": "https://www.upfrontreviews.com/reviews/7/example-company/example-cottage/9/#review_123"
}
```

Use the two dedicated CSV downloads to avoid mixed review/property rows. The advanced dataset still supports standard JSON, CSV, and Excel exports for existing integrations.

Published ratings/counts refer to the website's aggregate. Sample ratings/counts refer only to exported reviews after your filters and caps. An incomplete sample must not be interpreted as the property's full review history.

### Optional AI guest feedback analysis

AI analysis is optional and disabled by default. Clients do not supply a key. For public use, owner-funded AI requires a paid Apify plan, active event pricing, and an available owner spending allowance. Free-plan users can still collect reviews and use the factual report. Private owner testing is supported separately.

AI is billed only when validated review-level evidence has been saved. Property summaries and repeated theme mentions do not incur additional AI charges. See Pricing and recommended run settings above for rates and examples.

When enabled, the report identifies strengths and complaints around cleanliness, comfort, maintenance, location, value, and service, and offers suggested improvements. Findings link to analyzed reviews and show code-calculated evidence counts. Suggestions are AI interpretations, not verified maintenance facts or promises of outcomes.

Each theme includes its share of analyzed reviews and review-by-review observations. Compact summaries display up to three distinct observations; the evidence details retain every analyzed observation. Topic counts indicate mentions of a broad theme, not identical defects. Sentiment counts and the property comparison table help you inspect differences without confusing the sample with the full published history.

Only a bounded sample is analyzed, and each run has an owner-controlled spending allowance. If AI is unavailable, the key is missing, or the allowance is exhausted, collected review data and the factual report remain available. The report explicitly identifies partial or unavailable analysis.

AI uses an owner-managed service shared across applications. Availability depends on that service's overall credit and rate limits; clients do not need to configure or provide an OpenRouter key.

Check the **AI coverage** notice near the top of the report. It shows how many collected reviews were analyzed and explains any spending, time, or availability limit. An incomplete AI sample is not described as completed analysis.

AI receives at most the first 6,000 characters of each selected review; the exported review text is not shortened for this reason.

When AI is enabled, selected review text and ratings are sent through OpenRouter to the configured model provider for analysis. Leave AI off if you only want source extraction without sending review content to an AI provider.

### Limitations

- Only publicly available UpFront Reviews content is supported. No booking details, private guest records, or SuperControl account data are accessed.
- Each run is a fresh snapshot. Stable IDs and submitted-date filters support downstream comparisons; this Actor does not remember earlier runs.
- Interrupted runs preserve completed downloads and evidence as they become available. Automatic resurrection of the same run is stopped to avoid duplicate data or charges; start a new run for a fresh snapshot. An interruption can leave the default dataset without its final property-summary rows; use the saved report and CSV files for the available results.
- Source changes, unavailable pages, or limits can reduce coverage. Partial failures are listed in the run summary.
- Crawling has a three-minute time budget and may stop sooner when the run timeout is close. Results collected so far are saved with a coverage warning.
- Property pages may publish a review count that differs from the reviews currently accessible. These differences are reported.
- Public guest display names and locations are included only as published. Missing values are not guessed.

### Python API example

Use a current `apify-client` release supporting `max_total_charge_usd` (tested with 3.2.0). Upgrade older clients before running this example. Use your Apify token; event spending is capped at $0.10:

```python
import os
from decimal import Decimal
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("TheScrapeLab/upfront-reviews-intelligence").call(run_input={
    "startUrls": ["https://www.upfrontreviews.com/reviews/23315/windermere-marina-village/hawkshead-apartments-8-marina-view/611907/"],
    "maxReviews": 20,
    "enableAi": False,
}, max_total_charge_usd=Decimal("0.10"))
if run is None:
    raise RuntimeError("Actor did not return a run")
## Compatible with dictionary-returning and typed versions of apify-client.
dataset_id = run["defaultDatasetId"] if isinstance(run, dict) else run.default_dataset_id
for item in client.dataset(dataset_id).iterate_items():
    if item.get("recordType") == "review":
        print(item["propertyName"], item["rating"], item["text"])
```

### Frequently asked questions

#### Do I need an UpFront Reviews API key?

No. This scraper reads public UpFront Reviews pages, so you do not need a source API key, a booking-system login, or a SuperControl account. Run it through the Apify form without writing code. An Apify token is needed only if you choose to run it through the Apify API.

#### Can I export UpFront Reviews to Excel or Google Sheets?

Yes. Download Guest reviews — CSV or Property summaries — CSV from the Output tab. These files use separate row types and plain-English column headings. Standard dataset exports also offer Excel and JSON.

#### Does the scraper work without AI?

Yes. AI is off by default. Review extraction, ratings, owner replies, CSV downloads, and the factual HTML report work without AI. Add AI insights only when you want guest feedback themes and suggestions; the configured service uses OpenRouter, and AI usage costs apply.

#### Why did I receive fewer reviews than I requested?

The number is a maximum, not a guaranteed result count. Available source reviews, date filters, per-property caps, page limits, and the run timeout can reduce the sample. Check the report's coverage notes before treating the results as a complete review history. If a large company page times out, try its direct property links.

#### Does it access bookings or private guest records?

No. The Actor only collects supported public UpFront Reviews content. It does not access reservations, payment details, private guest records, or SuperControl account data. Public reviewer details are included only as published.

### Support

Use the Actor's **Issues** tab on Apify to report a problem. Include the run ID, public source URL, and expected versus actual result. Never include API keys or private guest information. For incomplete results, first check the report's coverage notice and Run details download.

# Actor input Schema

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

Paste one or more UpFront Reviews property or company links. A property link collects that property's reviews; a company link visits its properties. Replace the example with your own link, or keep it for a quick test.

## `maxReviews` (type: `integer`):

Collect up to this many reviews in total across all links. Start with 10. Fewer may be available after filters or source limits. Property summaries do not count toward this number.

## `enableAi` (type: `boolean`):

Optional: summarize strengths, complaints, and improvements with links to the supporting reviews. Public use requires a paid Apify plan and an available AI allowance; successful AI analysis has a separate charge when pricing is enabled. No key entry is needed. If AI is unavailable, reviews and the factual report are still saved.

## `dateFrom` (type: `string`):

Include reviews submitted on or after this date. Reviews without a known date are excluded when a date filter is used.

## `dateTo` (type: `string`):

Include reviews submitted on or before this date. Leave empty for no end date.

## `discover` (type: `boolean`):

Find companies in the public directory and visit their properties. Choose a country below. United Kingdom searches also need a region.

## `country` (type: `string`):

Used only when Search by location is on.

## `region` (type: `string`):

Required only for United Kingdom location searches. Enter the directory's region name, for example Scotland. Not needed when scraping your own links.

## `subregion` (type: `string`):

Narrow a UK location search using the directory's exact subregion name. Leave empty to search the whole selected region.

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

Stop after this many properties across all links and location searches. Does not change the total review limit.

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

Leave empty to use Number of reviews. Set a smaller value to spread a company sample across multiple properties. The total review limit still applies.

## `maxAiReviews` (type: `integer`):

Leave empty to analyze the requested sample, up to 100 reviews. Set a smaller value to reduce AI usage. Only used when Add AI insights is on; time and spending limits still apply.

## `maxRequests` (type: `integer`):

Safety limit for page downloads, including retries. Leave at 10 for a small run. Increase this if the report says the page limit was reached while searching multiple companies or properties.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.upfrontreviews.com/reviews/23315/windermere-marina-village/hawkshead-apartments-8-marina-view/611907/"
  ],
  "maxReviews": 10,
  "enableAi": false,
  "discover": false,
  "country": "GB",
  "maxProperties": 10,
  "maxRequests": 10
}
```

# Actor output Schema

## `report` (type: `string`):

The easiest starting point: property comparisons, guest reviews, and optional AI insights. Check the coverage notes for missing or limited results.

## `reviewsCsv` (type: `string`):

One row per review, with plain-English columns for property, date, rating, review text, owner reply, and source link. Opens in Excel or Google Sheets.

## `propertiesCsv` (type: `string`):

One row per property: collected review count, sample and published scores, AI coverage, strengths, and complaints.

## `dataset` (type: `string`):

Complete original data for integrations. Contains review and property\_summary rows; use recordType to tell them apart.

## `runSummary` (type: `string`):

Coverage limits, source failures, timings, and AI usage. Use this for troubleshooting, not as the main results file.

# 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 = {
    "startUrls": [
        "https://www.upfrontreviews.com/reviews/23315/windermere-marina-village/hawkshead-apartments-8-marina-view/611907/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("thescrapelab/upfront-reviews-intelligence").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 = { "startUrls": ["https://www.upfrontreviews.com/reviews/23315/windermere-marina-village/hawkshead-apartments-8-marina-view/611907/"] }

# Run the Actor and wait for it to finish
run = client.actor("thescrapelab/upfront-reviews-intelligence").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 '{
  "startUrls": [
    "https://www.upfrontreviews.com/reviews/23315/windermere-marina-village/hawkshead-apartments-8-marina-view/611907/"
  ]
}' |
apify call thescrapelab/upfront-reviews-intelligence --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,thescrapelab/upfront-reviews-intelligence"
        }
    }
}

```

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/zTshHlfFGeHtpzjNs/builds/yjpNVaoY0KhKmzmBY/openapi.json
