# Rakuten Travel Reviews Scraper (楽天トラベル) (`boncross/rakuten-travel-reviews`) Actor

Scrape Rakuten Travel (楽天トラベル) hotel reviews by hotel number, URL or Japanese name: overall and eight category scores, title, full text, stay date, plan and room booked, reviewer profile, hotel reply and averages. Sort newest, highest or lowest, or get only new ones. $2.50 per 1,000 reviews.

- **URL**: https://apify.com/boncross/rakuten-travel-reviews.md
- **Developed by:** [BonCross API](https://apify.com/boncross) (community)
- **Categories:** Travel
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.75 / 1,000 review-scrapeds

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Rakuten Travel Reviews Scraper (楽天トラベル)

### What is Rakuten Travel Reviews Scraper (楽天トラベル)?

Reviews on Rakuten Travel (楽天トラベル), one of Japan's largest domestic travel sites, are written by guests who booked their stay through it, and each guest scores the hotel on up to eight things beside the overall mark. Rakuten Travel Reviews Scraper gets you those reviews in full for any hotel you name: the text, the eight category scores, the plan and room the guest booked, and the hotel's reply.

Reasons to use it:

- You see more than one number. Room, service, location, breakfast, dinner, bath, facilities and cleanliness are scored separately on each review, and averaged for the hotel.
- Each review is tied to a stay. The stay date and the room booked are on the row, with the plan where Rakuten shows it.
- It's fast enough for a whole portfolio. 20 hotels across Japan returned 1,884 reviews in 11 seconds, which is about 13,000 reviews a minute.
- A scheduled run can return only what's new. In testing, a second run with the same only-new store returned 0 of 180, and reviews you've already had aren't charged.
- $2.50 per 1,000 reviews on the Free plan and $1.75 on Business. Reviews your filters remove are free.

**BonCross Verified** means we tested this actor against the live site before release and kept the record:

- 25 of 25 live checks on its inputs and filters passed on 7 October 2026
- 12 hotels run the same day by number, link or Japanese name: 236 reviews, none empty
- Charges matched the rows: 236 reviews, 2 name lookups
- A hotel given by its Japanese name resolves to that hotel

The rest, in short:

- Read the title, full text and overall score of each review
- See the reviewer's nickname, age band, gender, travel purpose and companion
- Sort by newest, Rakuten's recommendation, highest or lowest score
- Filter by rating band, purpose, companion, posting date or replies only
- Get one summary row per hotel, with averages and the rating distribution, if you don't need the individual reviews

### What can you do with Rakuten Travel reviews?

- Track guest sentiment for a hotel or a competitor set over time
- Break satisfaction down across eight categories, not one score
- Segment feedback by travel purpose and companion type
- Measure how often a property replies to its reviews
- Watch the rating distribution shift after a refurbishment or a price change
- Find recurring complaints in the Japanese text, or feed it to a sentiment or topic model
- Check new reviews daily and alert on low scores

### What data can you extract?

| | |
|---|---|
| 📝 Review title and full text | ⭐ Overall score out of 5 |
| Eight category scores per review | 🗓️ Posting date |
| Stay date | Plan and room booked |
| 🧑 Reviewer nickname and profile | Age band and gender where shown |
| 🧳 Travel purpose and companion | 💬 Hotel's reply |
| 👍 Likes and view count | 🔗 Review id and review URL |
| 🏨 Hotel name, number and URL | Hotel overall score |
| Hotel's eight category averages | 📊 Hotel rating distribution |
| Headline review count and reviews with text | Hotel area chain |

### How to scrape Rakuten Travel reviews

It takes a hotel and a number. [Sign up for Apify](https://console.apify.com/sign-up) if you haven't (it's free), then:

1. Open [Rakuten Travel Reviews Scraper](https://apify.com/boncross/rakuten-travel-reviews) and add your hotels: Rakuten hotel numbers, hotel or review URLs, or Japanese hotel names.
2. Say how many reviews you want per hotel, pick a sort, and add any rating, purpose or date filter.
3. Press Start, and download the reviews as Excel, CSV, JSON, XML or HTML when it finishes.

### ⬇️ Input

The hotel is the only thing you have to give. A Rakuten hotel number such as `1369` is the surest form, and a hotel or review URL works the same way. You can also type the hotel's Japanese name. Numbers and URLs are free to resolve, and a name costs one `hotel-resolved`.

If you leave the rest alone you get the 100 newest reviews per hotel, each with the hotel's score summary repeated on it.

More links than you'd want to paste go in "Start URLs", which loads them from a file, a Google Sheet or a remote list. Both inputs are used together.

There are two limits. "Max reviews per hotel" (1 to 50,000, default 100) applies to each hotel on its own: ten hotels at 50 each returns 500. "Maximum results for the whole run" caps the total, with 0 for no cap, and nothing past it is fetched or charged for.

"Travel purpose" takes `leisure`, `business` or `other`. "Companion type" takes `solo`, `family`, `lover`, `friend`, `colleague` or `other`. Both are Rakuten's own categories. For one record per hotel with its averages and no individual reviews, switch on "Summary only".

#### Recent reviews for one hotel

```json
{
  "hotels": ["1369"],
  "maxReviewsPerHotel": 200,
  "sort": "recent"
}
```

#### Critical reviews across a competitor set

```json
{
  "hotels": ["1369", "7365", "178586"],
  "maxRating": 3,
  "sort": "lowest",
  "maxReviewsPerHotel": 150
}
```

#### Family stays with a hotel reply

```json
{
  "hotels": ["1369"],
  "companions": ["family"],
  "withReplyOnly": true,
  "maxReviewsPerHotel": 100
}
```

#### A daily watch that returns only new reviews

```json
{
  "hotels": ["1369", "7365"],
  "postedAfter": "2026-06-01",
  "dedupStoreName": "rakuten-reviews-seen",
  "maxReviewsPerHotel": 100
}
```

#### For developers

- `maxReviewsPerHotel` is the per-hotel limit and `maxItems` the run-wide one. Rows that report a hotel the actor couldn't resolve aren't counted against `maxItems`.
- `minRating`, `maxRating`, `purposes`, `companions`, `postedAfter` and `withReplyOnly` are applied to reviews as they're read. When they keep few or none, reading a hotel stops early: after a run of pages that kept nothing, when 20 or more pages have kept fewer than 0.15 a page, or at about three times the pages `maxReviewsPerHotel` needs.
- On the `recent` sort, reading also stops as soon as the reviews predate `postedAfter` or reach ones an earlier run already returned.
- `minRating` above `maxRating` is refused before anything is read.
- `dedupStoreName` names the store of review ids already returned. A run that uses it returns only reviews it hasn't seen.
- `includeHotelSummary` (default true) repeats the hotel's overall score, review count, category averages, rating distribution and area on each review row. Switch it off for leaner rows.
- `summaryOnly` returns one record per hotel and bills it as `hotel-summary`.
- `maxConcurrency` (default 16, from 1 to 32) is how many requests run at once across the run, and `delayMs` (default 0, up to 10,000) adds a pause before each. Lower the first only if a run reports errors.

### ⬆️ Output

Each review is one record, with its hotel's score summary and rating distribution alongside unless you've switched that off. A category the guest didn't rate is left out of `scores`. Where the hotel replied, `hotelReply` has the reply's text, date and author.

```json
{
  "input": "https://review.travel.rakuten.co.jp/hotel/voice/14550/",
  "hotelId": 14550,
  "hotelName": "ホテルアルファーワン富山荒町",
  "hotelUrl": "https://travel.rakuten.co.jp/HOTEL/14550/14550.html",
  "hotelRating": 3.77,
  "hotelRatingScale": 5,
  "hotelReviewCount": 1687,
  "hotelReviewsWithText": 876,
  "hotelCategoryScores": {
    "room": 3.62, "service": 3.78, "location": 3.71, "breakfast": 3.85,
    "dinner": null, "bath": 3.88, "facilities": 3.59, "cleanliness": 3.65
  },
  "hotelRatingDistribution": { "1": 7, "2": 29, "3": 156, "4": 406, "5": 136 },
  "hotelArea": ["全国", "富山県", "富山・八尾・立山"],
  "id": "33123479426783",
  "reviewId": "33123479426783",
  "legacyReviewId": "24858764",
  "url": "https://review.travel.rakuten.co.jp/hotel/voice/14550/?f_review=33123479426783",
  "title": "駐車場は有料だが朝食の種類が豊富で満足",
  "text": "ホテル駐車場が有料になってしまった事以外は満足です。…",
  "rating": 5,
  "ratingScale": 5,
  "scores": { "room": 5, "service": 5, "location": 3, "bath": 4, "facilities": 4, "cleanliness": 4 },
  "postedAt": "2026-09-17T23:27:41Z",
  "viewCount": 33,
  "likes": 0,
  "stay": {
    "checkIn": "2026-09-16",
    "planId": null,
    "planName": null,
    "roomId": "rdt",
    "roomName": "『喫煙』DXツイン■サウナ付展望大浴場",
    "adults": null,
    "children": null
  },
  "reviewer": {
    "nickname": "ドンたか",
    "userId": "RNOXQ3FB",
    "gender": "male",
    "ageRange": "60s",
    "purpose": "leisure",
    "companion": "family",
    "reviewCount": 12,
    "viewCount": 47,
    "likes": 0,
    "avatar": null
  },
  "hotelReply": null,
  "images": [],
  "sort": "recent",
  "scrapedAt": "2026-09-25T10:02:39.882Z"
}
```

You can download the dataset as JSON, CSV, Excel, XML or HTML, and choose which fields to keep before you export.

### How many reviews can you get, and how fast?

| Run | Results | Time |
|---|---|---|
| Four hotels, 100 newest each | 400 reviews | 6.5 s |
| 20 hotels across Japan, 100 newest each (3 October 2026) | 1,884 reviews | 11 s |
| One hotel (given as its review URL), 10 newest | 10 reviews | 4 s |
| Kyoto Century Hotel (given as its review URL) and a Takayama ryokan, 200 newest each | 334 reviews: every text review the ryokan has (134) and 200 of the hotel's 4,750 | |
| Three hotels, 60 newest each | 180 reviews, 102 with a hotel reply; a second run with the same only-new store returned 0 | |

The 20-hotel run is about 13,000 reviews a minute. A list of thousands of hotels fits in one run.

One number needs explaining. A hotel's headline review count on Rakuten includes submissions that are a score with no text, and those have no review page. `hotelReviewsWithText` is how many reviews the pages actually hold, and that's the most a run can return for the hotel.

### How much does it cost to scrape Rakuten Travel reviews?

| Event | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| `actor-start`, per run | $0.002 | $0.002 | $0.002 | $0.002 |
| `hotel-resolved`, per Japanese name looked up (URLs and numbers skip it) | $0.002 | $0.002 | $0.002 | $0.002 |
| `review-scraped`, per review returned | $0.0025 | $0.00225 | $0.002 | $0.00175 |
| `hotel-summary`, per hotel in `summaryOnly` mode | $0.002 | $0.0018 | $0.0016 | $0.0014 |

Enterprise plans pay the Business price.

**$2.50 per 1,000 reviews** on the Free plan, $1.75 on Business. You pay for reviews you receive. The ones a filter drops and the ones an only-new run has already given you cost nothing, and proxy usage and platform usage are included.

- One hotel by number, 500 reviews: `0.002 + 500 × 0.0025 = $1.252` ($0.877 on Business)
- Twenty hotels by name, summary rows only: `0.002 + 20 × 0.002 + 20 × 0.002 = $0.082` ($0.07 on Business)

On Apify's Free plan, the $5 of monthly credits is about 1,990 reviews with this actor, taken 200 at a time from hotels given by number.

### Limitations

- The most you can get for a hotel is its reviews with text. The headline count is higher because it includes score-only submissions.
- Don't plan on review photos. `images` was empty on all 216 reviews in our 7 October 2026 sample.
- Reviewer names are site nicknames.
- Review text is Japanese as written. The site doesn't translate reviews.
- Rating, purpose, companion, date and reply filters are applied as reviews are read, and a narrow filter still reads through the pages in between.
- The recommended order is Rakuten's own ranking. Nothing on a review shows why it sits where it does.
- Party size (`stay.adults`, `stay.children`) was empty on every review measured, and the plan name is missing on some reviews.

### FAQ

#### Why did I get fewer reviews than the count on the hotel's page?

Rakuten's headline count includes guests who left a score and no text. Those have no review page. Compare your rows with `hotelReviewsWithText` instead: in one run a Takayama ryokan returned all 134 of its text reviews.

#### How do I get only the reviews posted since my last run?

Give "Only-new store" a name and schedule the run with the newest-first sort. Each run returns reviews it hasn't returned before and stops reading when it reaches ones it has. You aren't charged for those.

#### Can I pull just the bad reviews?

Set "Maximum rating" to 3 (or lower) and sort by lowest. The competitor-set example above does this for three hotels. Add "With hotel reply only" if what you want is how the property answered.

#### Should I use the hotel's name or its number?

The number, when you have it. It's free to resolve and there's no lookup involved. Japanese names work and cost $0.002 each to look up. [Rakuten Travel Search Scraper](https://apify.com/boncross/rakuten-travel-search) returns the numbers for a whole area if you need to collect them first.

#### Are the reviews in English?

They're in Japanese, as the guests wrote them. Rakuten Travel publishes no translation, and neither does this actor.

#### Do I need proxies, an account or an API key?

You don't need any of them. Proxy usage is included in the price and there's nothing to configure.

#### Is it legal to scrape Rakuten Travel reviews?

Scraping publicly available data is generally legal, but reviews contain personal data, and you should collect them only where you have a legitimate reason. This actor reads only what the site serves to any logged-out visitor. You're responsible for complying with Rakuten's terms and applicable law.

### Run it from your own tools

Review monitoring is a schedule plus an only-new store: add the actor to an Apify Schedule, name the store, and send each run's new reviews to Slack or a Google Sheet through Apify's integrations. A webhook can start your own job when a run finishes.

The API call for a short run is `POST https://api.apify.com/v2/acts/boncross~rakuten-travel-reviews/run-sync-get-dataset-items`, with the input JSON as the body. Longer runs use the asynchronous run endpoint. Node.js and Python have an `apify-client` package each.

Through the Apify MCP server at `mcp.apify.com`, an agent in Claude, Cursor, ChatGPT or another MCP client gets the actor as a tool named `boncross/rakuten-travel-reviews`. It can then pull a Japanese hotel's recent reviews and summarise them for you.

### More from BonCross

- [Rakuten Travel Room Rates Scraper (楽天トラベル)](https://apify.com/boncross/rakuten-travel-room-rates): Every plan and room Rakuten Travel (楽天トラベル) prices for a hotel and your dates.
- [Rakuten Travel Search Scraper (楽天トラベル)](https://apify.com/boncross/rakuten-travel-search): Rakuten Travel (楽天トラベル) hotel search results for any area and your dates.
- [Tripadvisor Place Details Scraper](https://apify.com/boncross/tripadvisor-location-details): The full Tripadvisor record for any hotel, restaurant or attraction.
- [Tripadvisor Reviews Scraper](https://apify.com/boncross/tripadvisor-reviews): Every Tripadvisor review for any hotel, restaurant, attraction or tour.
- [Agoda Reviews Scraper](https://apify.com/boncross/agoda-reviews): Agoda hotel reviews, including the Booking.com reviews Agoda shows.
- [Booking.com Reviews Scraper](https://apify.com/boncross/booking-reviews): Every Booking.com guest review for any hotel.

### Your feedback

Seen a review on 楽天トラベル that didn't come through, or a score in the wrong category? Raise it on the Issues tab in Apify Console with the hotel number. We read each issue and reply there.

# Changelog

This Actor's version history is a separate document: https://apify.com/boncross/rakuten-travel-reviews/changelog.md

# Actor input Schema

## `hotels` (type: `array`):

Rakuten hotel numbers (1369), any travel.rakuten.co.jp / review.travel.rakuten.co.jp URL, or Japanese hotel names.

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

Rakuten Travel page addresses, with the option to load them in bulk from a file, a Google Sheet or a remote list. Use this when you have more links than you want to paste. Combined with anything in the list above.

## `maxReviewsPerHotel` (type: `integer`):

20 reviews per page; the actor stops at this many.

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

A run-wide ceiling across every target. The per-target limit above applies to each one separately, so ten targets at 50 each returns 500; set this to cap the total. Zero means no run-wide limit. Rows that report an input the actor could not resolve are not counted here and are never charged for.

## `sort` (type: `string`):

Rakuten's orderings: recommended, recent (newest first), highest, lowest.

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

Post-filter on the overall score.

## `maxRating` (type: `integer`):

Post-filter on the overall score (0 = no limit).

## `purposes` (type: `array`):

Keep only reviews by guests travelling for this purpose.

## `companions` (type: `array`):

Keep only reviews by guests who travelled this way. Picked from Rakuten's own categories, so a value cannot be mistyped.

## `postedAfter` (type: `string`):

Drop reviews posted before this date. Combine with sort = recent to stop early.

## `withReplyOnly` (type: `boolean`):

Keep only reviews the hotel answered.

## `includeHotelSummary` (type: `boolean`):

Adds the hotel's overall score, review count, 8 category averages, rating distribution and area chain to each review record.

## `summaryOnly` (type: `boolean`):

Push one record per hotel with the aggregates and no individual reviews (charged as hotel-summary).

## `dedupStoreName` (type: `string`):

Key-value store name remembering review ids already returned, so scheduled runs push only new reviews.

## `delayMs` (type: `integer`):

Optional pause before each call, in milliseconds. 0 (the default) runs as fast as the parallel limit allows.

## `maxConcurrency` (type: `integer`):

How many requests run at once across the whole run. The default is the fastest level measured clean; lower it only if a run reports refusals or errors.

## Actor input object example

```json
{
  "hotels": [
    "https://review.travel.rakuten.co.jp/hotel/voice/1369/",
    "7365"
  ],
  "startUrls": [],
  "maxReviewsPerHotel": 100,
  "maxItems": 0,
  "sort": "recent",
  "minRating": 0,
  "maxRating": 0,
  "purposes": [],
  "companions": [],
  "postedAfter": "",
  "withReplyOnly": false,
  "includeHotelSummary": true,
  "summaryOnly": false,
  "dedupStoreName": "",
  "delayMs": 0,
  "maxConcurrency": 16
}
```

# Actor output Schema

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

Rakuten Travel reviews: every row the run returned.

## `stats` (type: `string`):

Counts for the run: what was resolved, fetched, filtered and returned.

# 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 = {
    "hotels": [
        "https://review.travel.rakuten.co.jp/hotel/voice/1369/",
        "7365"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("boncross/rakuten-travel-reviews").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 = { "hotels": [
        "https://review.travel.rakuten.co.jp/hotel/voice/1369/",
        "7365",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("boncross/rakuten-travel-reviews").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 '{
  "hotels": [
    "https://review.travel.rakuten.co.jp/hotel/voice/1369/",
    "7365"
  ]
}' |
apify call boncross/rakuten-travel-reviews --silent --output-dataset

```

## MCP server setup

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

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/n0ibZQqtjwSdFVcn1/builds/ucfxXfalVI7VvuPGG/openapi.json
