# Jalan.net Hotel Reviews Scraper (じゃらん 口コミ) (`crawlyard/jalan-reviews-scraper`) Actor

Scrape Jalan.net (じゃらん) hotel and ryokan guest reviews. Get review text, overall and 6 category ratings, reviewer age/gender, travel purpose, stay month, plan, room type, price band, and the hotel's official reply. Clean structured JSON for hospitality reputation management and AI workflows.

- **URL**: https://apify.com/crawlyard/jalan-reviews-scraper.md
- **Developed by:** [Crawlyard Data](https://apify.com/crawlyard) (community)
- **Categories:** Travel, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 reviews

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

## Jalan.net Hotel Reviews Scraper (じゃらん 口コミ)

Extract guest reviews and ratings from **Jalan.net** — Japan's largest accommodation
booking platform, covering hotels, ryokan, minshuku and resorts nationwide.

Japanese review data is one of the biggest blind spots in hospitality analytics:
most reputation tools cover Booking.com, Agoda and TripAdvisor, but not the domestic
platform that Japanese guests actually use. This Actor closes that gap.

### What you get

One row per review, with every field Jalan exposes:

| Field | Description |
|---|---|
| `body` | Full review text (Japanese) |
| `reviewTitle` | Review headline |
| `rating` | Overall score (1–5) |
| `subRatings` | 6 category scores: 部屋 (room), 風呂 (bath), 料理(朝食) (breakfast), 料理(夕食) (dinner), 接客・サービス (service), 清潔感 (cleanliness) |
| `reviewerGender` | 男性 / 女性 / その他 |
| `reviewerAgeGroup` | e.g. 50代 |
| `travelPurpose` | 一人旅, 夫婦旅行, 家族旅行, 友達旅行, 恋人旅行, 出張, その他 |
| `stayMonth` | Month of stay (`YYYY-MM`) |
| `postedDate` | Date the review was posted (`YYYY-MM-DD`) |
| `planName` | Booked plan name |
| `roomType` | e.g. ダブル, ツイン |
| `mealPlan` | e.g. 食事なし, 朝食付き |
| `priceBand` | Price bracket paid per person |
| `hotelReply` | The property's official reply, if any |
| `hotelReplied` | Boolean flag for reply-rate analysis |

Plus one summary row per hotel: `hotelName`, `averageRating`, `totalReviewCount`,
`topRatedAspects`.

### Input

```json
{
  "hotelUrls": [
    "https://www.jalan.net/yad301924/",
    "308860"
  ],
  "maxReviewsPerHotel": 100,
  "includeHotelSummary": true,
  "maxConcurrency": 4
}
```

Accepts full Jalan hotel URLs **or** bare hotel IDs. Set `maxReviewsPerHotel` to `0`
to collect every available review.

### Sample output

```json
{
  "type": "review",
  "hotelId": "301924",
  "hotelName": "ホテルリソル上野",
  "reviewTitle": "初めてだと見つけにくい",
  "body": "きれいでおしゃれなホテルですが、ホテルの表示が小さいので…",
  "rating": 3,
  "subRatings": { "部屋": 3, "風呂": 3, "料理(朝食)": null, "料理(夕食)": null, "接客・サービス": 3, "清潔感": 3 },
  "reviewerGender": "女性",
  "reviewerAgeGroup": "50代",
  "travelPurpose": "夫婦旅行",
  "stayMonth": "2026-08",
  "postedDate": "2026-08-19",
  "roomType": "ダブル",
  "mealPlan": "食事なし",
  "priceBand": "10,001～11,000円(大人１名あたり/税込)",
  "hotelReply": "このたびはホテルリソル上野に宿泊いただき…",
  "hotelReplied": true
}
```

### Use cases

- **Reputation management** — track Japanese guest sentiment your Booking.com / Agoda
  feed never sees, including how fast properties reply.
- **Competitive benchmarking** — compare category scores against nearby properties.
- **Revenue management** — correlate `priceBand`, `roomType` and `mealPlan` with
  satisfaction to price plans better.
- **Market research** — segment sentiment by traveller demographics and trip purpose.
- **AI / RAG pipelines** — clean structured Japanese review corpora for LLM analysis.

### How it works

- No proxy required for normal volumes; Apify Proxy is optional if you scale up.
- Requests are throttled and retried with exponential backoff, so the target site
  is treated politely.
- Only paths that `jalan.net/robots.txt` permits are requested.
- Only publicly visible review content is collected. Reviewer handles are the public
  pseudonyms shown on the page; no private or contact data is retrieved.

### Pricing

Pay per event — you are charged for reviews actually delivered. A failed page costs
you nothing.

### Notes

- Jalan serves pages in Windows-31J (cp932); this Actor decodes them correctly, so
  Japanese text arrives intact rather than mojibake.
- Reviews are paginated 30 per page and de-duplicated automatically.

# Actor input Schema

## `hotelUrls` (type: `array`):

Jalan.net hotel page URLs (e.g. https://www.jalan.net/yad301924/) or bare hotel IDs (e.g. 301924). Reviews are collected for each.

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

Stop after this many reviews per hotel. 0 = no limit (all available reviews).

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

Also output one row per hotel with the aggregate rating and review count.

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

Parallel requests. Lower values are gentler on the target site.

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

Optional. Use Apify Proxy if you hit rate limits. Not required for normal volumes.

## Actor input object example

```json
{
  "hotelUrls": [
    "https://www.jalan.net/yad301924/",
    "308860"
  ],
  "maxReviewsPerHotel": 100,
  "includeHotelSummary": true,
  "maxConcurrency": 4,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `reviews` (type: `string`):

All scraped reviews and hotel summaries as JSON.

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

Same dataset exported as CSV for spreadsheets and BI tools.

# 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 = {
    "hotelUrls": [
        "https://www.jalan.net/yad301924/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlyard/jalan-reviews-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 = { "hotelUrls": ["https://www.jalan.net/yad301924/"] }

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

```

## MCP server setup

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