# Jalan.net Reviews Scraper (じゃらん クチコミ) (`boncross/jalan-reviews`) Actor

Scrape Jalan (じゃらん クチコミ) hotel reviews, all or only new ones. Just add hotel URLs, hotel ID numbers or Japanese names and get overall and six category scores, title, full text, posting date, stay month, reviewer age, gender and purpose, plan, room, meal and hotel reply. $2.50 per 1,000 reviews.

- **URL**: https://apify.com/boncross/jalan-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

## Jalan.net Reviews Scraper (じゃらん クチコミ)

### What is Jalan.net Reviews Scraper (じゃらん クチコミ)?

A クチコミ on Jalan.net (じゃらん) is written by a guest who booked through the site, and it says a lot more than a star count: six category scores, the plan they booked, the meal terms and the price band they paid. Jalan.net Reviews Scraper gets you those reviews for any hotel on Jalan, and it keeps going past the last 12 months into the older ones. Paste a hotel's URL, its Jalan number or its Japanese name.

Where it earns its place:

- You get a hotel's whole review history. On two Kyoto hotels it returned 426 of 426 and 189 of 189 reviews, the oldest from 2019.
- Each review has its context. Room, bath, breakfast, dinner, service and cleanliness are scored separately, next to the plan, room type, meal plan and price band.
- It's quick at scale: 3,523 reviews from 100 hotels across Japan in 12 seconds.
- A scheduled run can return only the reviews posted since last time. The ones you've already had are free.
- $2.50 per 1,000 reviews on the Free plan and $1.75 on Business, with proxy usage and platform usage included.

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

- 29 of 29 live checks on its inputs and filters passed on 7 October 2026
- 12 hotels run the same day by number, link or name: 203 reviews, 1 error row
- Charges matched the 203 reviews
- A hotel given by its Japanese name resolves to that hotel

### What do people do with Jalan reviews?

- Track guest sentiment for a property or a competitor set, over the past year or over several
- Break satisfaction down by room, bath, breakfast, dinner, service and cleanliness
- Segment feedback by travel purpose, age band and gender
- Compare the price band guests paid with the score they gave
- Measure how often, and how quickly, a property replies
- Watch for new reviews daily and alert on low scores
- Feed Japanese review text into sentiment or topic models

### What review data can you extract?

| | |
|---|---|
| 📝 Review title and full text | ⭐ Overall score out of 5 |
| Six category scores per review | 🗓️ Posting date |
| Month of stay | Plan booked |
| 🛏️ Room type | 🍽️ Meal plan |
| 💴 Price band paid per adult | Reviewer name and profile URL |
| Reviewer gender and age band | 🧳 Travel purpose, in Japanese and English |
| 💬 Hotel's reply and its date | 🏨 Hotel name, Jalan number and URL |
| Jalan review id and review page URL | Whether the review is older than a year |
| Hotel overall rating and review count | Hotel's six category averages |

### How to scrape Jalan.net reviews

There's a form to fill in and a file to download at the end. That's all of it.

1. [Sign up for a free Apify account](https://console.apify.com/sign-up) and open [Jalan.net Reviews Scraper](https://apify.com/boncross/jalan-reviews).
2. Add your hotels as Jalan URLs, Jalan numbers or Japanese hotel names.
3. Choose how many reviews you want per hotel, and a sort.
4. Add a rating, travel purpose or date filter if you need one, then click Start.
5. Download the reviews as Excel, CSV, JSON, XML or HTML.

### ⬇️ Input

Start with the hotels: Jalan URLs, Jalan numbers such as `301552`, or Japanese hotel names. For a long list of links, use Start URLs, which can read them from a file, a Google Sheet or a remote list. Hotels from both inputs are read.

You can sort newest first, by overall rating, or by any one of the six category scores.

There are two limits. "Max reviews per hotel" (default 90, up to 10,000) applies to each hotel separately: ten hotels at 50 each returns 500. "Maximum results for the whole run" caps the total, and you pay for nothing past it.

Three switches decide what a run returns:

- "Include reviews older than a year" is on by default. Once a hotel's recent list runs out, the run carries on into its older reviews. Each row's `isArchived` tells you which list it came from.
- "Include hotel summary on each row" is on by default. It repeats the hotel's overall rating, review count and six category averages on each review.
- "Summary only" gives you one row per hotel with the aggregate scores and no individual reviews.

#### Every review for one hotel, back to the oldest

```json
{
  "hotels": ["https://www.jalan.net/yad301552/"],
  "maxReviewsPerHotel": 1000,
  "sort": "newest"
}
```

#### Best-rated reviews for a set of hotels

```json
{
  "hotels": ["301552", "301928", "ホテルグランヴィア京都"],
  "sort": "rating_high",
  "maxReviewsPerHotel": 100
}
```

#### Critical reviews from family travellers

```json
{
  "hotels": ["301552"],
  "maxRating": 3,
  "travelPurposes": ["family"],
  "maxReviewsPerHotel": 200
}
```

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

```json
{
  "hotels": ["301552", "301928"],
  "postedAfter": "2026-06-01",
  "dedupStoreName": "jalan-reviews-seen",
  "maxReviewsPerHotel": 90
}
```

#### For developers

- `maxReviewsPerHotel` is the per-hotel limit and `maxItems` the run-wide one. Nothing past `maxItems` is fetched or charged for.
- When your filters keep few or none of the reviews, 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 newest-first sort it also stops as soon as the reviews predate your date filter or reach ones an earlier run already returned.
- `minRating` above `maxRating` is refused before anything is read.
- `travelPurposes` takes `solo`, `couple`, `family`, `friends`, `business` or `group`, or a fragment of the Japanese label (一人旅, 夫婦旅行, 家族旅行, 友達旅行, 出張).
- `dedupStoreName` names the storage that remembers which reviews you've had. Later runs push only new ones, and the already-seen ones aren't charged.
- `summaryOnly` rows are billed as `hotel-summary`. `includeHotelSummary` costs nothing extra.
- `maxConcurrency` (Parallel requests, default 16, 1 to 32) sets how many requests run at once, and `delayMs` (default 0, up to 15000) adds a pause in milliseconds before each call. Both are best left as they are unless a run reports errors.
- When Jalan answers that it's too busy, the page is asked for again, and that hotel's reviews don't end early.
- A run the platform restarts part-way carries on where it stopped. Reviews already delivered aren't delivered or charged a second time.

### ⬆️ Output

One record per review. With the hotel summary on, each one also has its hotel's rating and category averages.

```json
{
  "input": "301552",
  "hotelId": 301552,
  "hotelName": "ホテルヴィスキオ京都 ｂｙ ＧＲＡＮＶＩＡ",
  "hotelUrl": "https://www.jalan.net/yad301552/",
  "hotelRating": 4.6,
  "hotelRatingScale": 5,
  "hotelReviewCount": 426,
  "hotelAspects": { "room": 4.6, "bath": 4.5, "breakfast": 4.8, "dinner": null, "service": 4.5, "cleanliness": 4.7 },
  "id": "15538337",
  "url": "https://www.jalan.net/yad301552/kuchikomi/detail_15538337/",
  "rating": 5,
  "ratingScale": 5,
  "aspects": { "room": 5, "bath": 5, "breakfast": 5, "dinner": null, "service": 5, "cleanliness": 5 },
  "title": "何もかもよPERFECT",
  "text": "京都には何度も来て宿泊してますが 今回のお宿は初めての宿泊でした チェックイン前 荷物を預かって頂く時も 嫌な顔もせず 笑顔での神対応！…",
  "postedAt": "2026-08-28",
  "stayMonth": "2026年8月",
  "reviewer": {
    "name": "ひめ",
    "profileUrl": "https://www.jalan.net/user/BBJ0048430HFD/mypage/?screenId=UWW3701",
    "gender": "female",
    "ageBand": "60代",
    "travelPurpose": "夫婦旅行",
    "travelPurposeEn": "couple"
  },
  "plan": "ベーシックプラン ☆ 朝食付き",
  "roomType": "ツイン",
  "mealPlan": "朝のみ",
  "priceBand": "12,001～13,000円(大人１名あたり/税込)",
  "hotelReply": {
    "text": "この度はホテルヴィスキオ京都を御利用いただき、またお時間を割いてご感想を賜り誠に有難うございます。…",
    "date": "2026-09-01"
  },
  "isArchived": false,
  "sort": "newest",
  "scrapedAt": "2026-09-08T19:45:15.343Z"
}
```

`id` is Jalan's own review id, and `url` opens that review's own page on Jalan.

### How far back does it go, and how fast?

| Run | Results | Time |
|---|---|---|
| 1 hotel, 10 reviews | 10 reviews | 4 s |
| 2 hotels, up to 90 each | 131 reviews (one hotel lists fewer than 90 for the last year) | 5 s |
| 2 hotels, every review | 615 reviews: 426 of 426 and 189 of 189, back to 2019 and 2020 | 11 s |
| 12 Kyoto hotels, up to 90 each | 981 reviews, all with text and category scores, 920 with a hotel reply | 6 s |
| 100 hotels across Japan, up to 60 each | 3,523 reviews | 12 s |

Jalan's main review list covers the last 12 months, and older reviews sit in a separate list. With older reviews switched on (the default) you get both, which is how a hotel's whole headline count arrives: 426 of 426 and 189 of 189 on the two Kyoto hotels measured, the oldest from 2019. Older reviews follow the recent ones newest first, whatever sort you chose, and they have `isArchived: true`.

Large runs return thousands of reviews a minute, well inside the default one-hour run limit.

### How much does it cost to scrape Jalan 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 nothing for reviews your filters drop or reviews an only-new run has already seen, and the price covers proxy usage and platform usage.

- One hotel by URL, 150 reviews: `0.002 + 150 × 0.0025 = $0.377` ($0.2645 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 you have $5 of credits a month. At the default of 90 reviews for one hotel ($0.227 a run) that's about 22 runs, or roughly 2,000 reviews.

### Limitations

- Review text is Japanese only. Jalan publishes no translation.
- The score sorts order the last 12 months only. Older reviews follow newest first, because Jalan does not sort them.
- Properties with too few reviews have no review page on Jalan. You get a row explaining that.
- "Posted after" stops the scan only on the newest-first sort, because the score sorts are not in date order. Pair the two.
- English hotel names rarely resolve. Use the Japanese name, the number or the URL.

### FAQ

#### How far back do the reviews go?

As far as Jalan keeps them. Its main list covers the last 12 months, and the actor then reads the older reviews too, often back several years. Switch off "Include reviews older than a year" if you only want the recent ones.

#### How do I get only the new reviews each day?

Give "Dedup store name" a name and schedule the run. Each run returns only reviews it hasn't returned before, and you aren't charged for the ones it has already seen.

#### Can I sort by breakfast, or by the bath?

Any one of the six categories works as a sort: room, bath, breakfast, dinner, service or cleanliness, highest first. Newest first and highest overall rating are the other two.

#### How do I find a hotel's worst reviews?

Set "Max rating" to 3, or lower. You can narrow it further with "Travel purposes", for example `family` or `business`.

#### How do I pass a hotel?

As a Jalan URL, a number such as `301552`, or the Japanese hotel name. URLs and numbers are free to resolve, and a name costs one `hotel-resolved` lookup. If you need the numbers for a whole area, [Jalan.net Hotel Search Scraper](https://apify.com/boncross/jalan-search) lists them.

#### Can I get just the scores, without the reviews?

Switch on "Summary only". You get one row per hotel with its overall rating, review count and six category averages, billed at $0.002 a hotel on the Free plan.

#### Do I need proxies or a Jalan account?

Neither. Proxy usage is included in the price and there's nothing to set up. No login is used.

#### Is it legal to scrape Jalan.net reviews?

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

### Monitoring, the API and AI agents

For review monitoring, put the actor on an Apify Schedule with a dedup store name, and send low scores on to Slack or a Google Sheet through Apify's integrations or a webhook. Zapier, Make, Airbyte and GitHub connect the same way.

In code, `POST https://api.apify.com/v2/acts/boncross~jalan-reviews/run-sync-get-dataset-items` returns the reviews in a single call for small runs, and the asynchronous run endpoint handles larger ones. The `apify-client` package exists for Node.js (NPM) and Python (PyPI).

With the Apify MCP server (`mcp.apify.com`) added to Claude, Cursor or ChatGPT, the actor is a tool named `boncross/jalan-reviews`. An agent can pull a Japanese property's recent reviews and summarise them for you.

### More from BonCross

- [Jalan.net Area Rates Scraper (じゃらん)](https://apify.com/boncross/jalan-area-rates): Jalan (じゃらん) prices and rooms left for every available hotel in an area, a whole…
- [Jalan.net Room Rates Scraper (じゃらん)](https://apify.com/boncross/jalan-room-rates): Every plan and room Jalan (じゃらん) lists for a hotel on a date.
- [Jalan.net Hotel Search Scraper (じゃらん)](https://apify.com/boncross/jalan-search): Jalan (じゃらん) hotel search results for any area and your dates.
- [Marriott Reviews Scraper](https://apify.com/boncross/marriott-reviews): Guest reviews for any Marriott hotel.
- [Rakuten Travel Reviews Scraper (楽天トラベル)](https://apify.com/boncross/rakuten-travel-reviews): Rakuten Travel (楽天トラベル) hotel reviews by hotel number, URL or Japanese name: overall…
- [Tripadvisor Place Details Scraper](https://apify.com/boncross/tripadvisor-location-details): The full Tripadvisor record for any hotel, restaurant or attraction.

### Your feedback

Seen a クチコミ on Jalan that didn't make it into your dataset, or a score in the wrong column? Report it on the Issues tab in Apify Console and include the hotel number. We look at each report and reply on the issue.

# Changelog

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

# Actor input Schema

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

jalan.net hotel URLs, hotel ID numbers, or Japanese hotel names.

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

Jalan 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`):

Jalan serves 30 per page.

## `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`):

Newest first, or highest score first by overall or by one category.

## `minRating` (type: `number`):

Keep reviews with overall score ≥ this (1–5). Post-filter, free. Scores are decimal, so 4.5 is a valid bound.

## `maxRating` (type: `number`):

Keep reviews with overall score ≤ this (1–5). 0 = no limit. Scores are decimal, so 4.5 is a valid bound.

## `travelPurposes` (type: `array`):

Keep only these reviewer purposes: `solo`, `couple`, `family`, `friends`, `business`, `group`, or a Japanese label fragment (一人旅, 夫婦旅行, 家族旅行, 友達旅行, 出張).

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

YYYY-MM-DD. Drop reviews posted before this date (use with `newest`).

## `includeOlderReviews` (type: `boolean`):

Jalan's main review list covers the last 12 months. With this on, once that list runs out (and the per-hotel limit still has room), the run carries on into the hotel's older reviews, back to the oldest Jalan still shows — often several years and many times more reviews. Older reviews always come newest first, after the recent ones, whatever sort you choose. Each row says which list it came from in `isArchived`.

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

Repeat the hotel's overall rating, review count and six category averages on every review.

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

One row per hotel with the aggregate scores, no individual reviews (charged as `hotel-summary`).

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

Named key-value store remembering reviews already returned, so scheduled runs push only new ones.

## `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://www.jalan.net/yad301552/"
  ],
  "startUrls": [],
  "maxReviewsPerHotel": 90,
  "maxItems": 0,
  "sort": "newest",
  "minRating": 0,
  "maxRating": 0,
  "travelPurposes": [],
  "postedAfter": "",
  "includeOlderReviews": true,
  "includeHotelSummary": true,
  "summaryOnly": false,
  "dedupStoreName": "",
  "delayMs": 0,
  "maxConcurrency": 16
}
```

# Actor output Schema

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

Jalan.net Hotel Reviews Scraper (クチコミ): 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://www.jalan.net/yad301552/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("boncross/jalan-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://www.jalan.net/yad301552/"] }

# Run the Actor and wait for it to finish
run = client.actor("boncross/jalan-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://www.jalan.net/yad301552/"
  ]
}' |
apify call boncross/jalan-reviews --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,boncross/jalan-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/3h1wAt8KQQipMmoPY/builds/KFtyBL0eCNfpoqYwh/openapi.json
