# Japan Hotel Scraper - Jalan Rates, Reviews & Availability (`datamill/jalan-hotel-scraper`) Actor

Scrape Japanese hotels and ryokan from Jalan: live nightly rates for your dates, guest ratings, reviews and every plan price.

- **URL**: https://apify.com/datamill/jalan-hotel-scraper.md
- **Developed by:** [Data Mill](https://apify.com/datamill) (community)
- **Categories:** Travel, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/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

### What does Japan Hotel Scraper do?

This Actor extracts **Japanese hotel and ryokan data** from [Jalan](https://www.jalan.net), one of Japan's two largest domestic booking sites (operated by Recruit), and returns it as clean JSON. For any destination and date you get **real bookable nightly rates**, guest ratings, review counts, addresses, station access and **every available plan with its per-person price**.

Japan's inbound tourism is at record highs, yet Jalan's inventory is effectively invisible to non-Japanese tools: the site is Japanese-only and served in the legacy **Shift-JIS** encoding that most scrapers choke on. Many of its properties — especially family-run ryokan and onsen inns — never appear on Booking.com or Expedia at all, or appear there at higher prices. This Actor gives you that inventory through **API**, **scheduling**, **proxy rotation** and **MCP** on the Apify platform.

### Why use Japan Hotel Scraper?

- **Rate intelligence** — compare Jalan's domestic pricing against global OTAs for identical dates and spot the gap.
- **Revenue management** — hoteliers tracking competitor pricing in their own area, day by day.
- **Travel products and AI agents** — surface ryokan and onsen stays that global OTAs simply do not list.
- **Market research** — measure how prices move across cherry blossom season, Golden Week, Obon and autumn foliage.
- **Lead generation** — a clean, structured directory of Japanese accommodation providers with addresses.

### How to use Japan Hotel Scraper

1. Click **Try for free** to open the Actor.
2. Type a **Destination keyword** — English names like `Tokyo`, `Kyoto`, `Hakone` or `Niseko` are translated automatically, and any Japanese keyword works too.
3. Optionally set a **Check-in date**, **nights**, **adults** and **rooms** to get live prices for that exact stay.
4. Set **Max hotels** (results arrive 30 per page) and click **Start**.
5. Open the **Output** tab and export as JSON, CSV, Excel or HTML.

Leave the check-in date empty to build a hotel directory with reference prices; set it to get availability-based rates.

### Input

| Field | Type | Description |
|---|---|---|
| `keyword` | string | Destination, area, station or hotel name. English city names auto-translate |
| `checkInDate` | string | `YYYY-MM-DD`, today or later. Unlocks live pricing |
| `nights` | integer | Length of stay, 1–14 |
| `adults` | integer | Adult guests, 1–9 |
| `rooms` | integer | Number of rooms, 1–9 |
| `maxHotels` | integer | Stop after this many hotels |

```json
{
  "keyword": "Kyoto",
  "checkInDate": "2026-09-19",
  "nights": 1,
  "adults": 2,
  "maxHotels": 100
}
```

### Output

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

```json
{
  "jalanHotelId": "358756",
  "hotelUrl": "https://www.jalan.net/yad358756/",
  "name": "ロイヤルツインホテル京都八条口 〜みやびの湯〜",
  "area": "京都 > 京都駅周辺",
  "rating": 4.7,
  "reviewCount": 1992,
  "lowestPriceYen": 18744,
  "priceFromYen": 18744,
  "priceToYen": 23940,
  "plans": [
    {
      "name": "★☆★開業6th Anniversaryプラン★☆★【特別料金】〜素泊り〜",
      "roomAndMeal": "ダブル 食事なし",
      "pricePerPersonYen": 21300
    }
  ],
  "address": "京都府京都市南区東九条室町４６−２",
  "access": "京都駅「中央改札口」を出て「八条西口」出口から徒歩約2分",
  "checkInDate": "2026-09-19",
  "checkOutDate": "2026-09-20"
}
```

### Data you can extract

| Field | Description |
|---|---|
| `name`, `catchPhrase`, `description` | Property name and marketing copy |
| `jalanHotelId`, `hotelUrl` | Stable Jalan ID and canonical page URL |
| `area`, `address`, `access` | Region hierarchy, postal address, station directions |
| `rating`, `reviewCount` | Guest score out of 5 and number of reviews |
| `lowestPriceYen` | Cheapest bookable rate for your dates and party size |
| `priceFromYen`, `priceToYen` | Price span across the property's available plans |
| `plans[]` | Plan name, room type + meal plan, `pricePerPersonYen` |
| `thumbnailUrl` | Property photo |
| `checkInDate`, `checkOutDate`, `adults`, `rooms` | The search context each price belongs to |

Prices are read from Jalan's own price elements — loyalty points, campaign scores and coupon amounts are never mistaken for room rates.

### How much does it cost to scrape Jalan?

Pay per event, charged per hotel returned:

| Event | Price |
|---|---|
| Hotel scraped | $0.01 |

Scanning 100 hotels in Kyoto for a given weekend costs about **$1.00**. A daily rate-tracking job covering 200 properties runs roughly **$60/month**. Apify's free tier includes $5 of monthly usage — enough for around 500 hotels before you pay anything.

### Tips

- **Narrow keywords give sharper results.** `箱根 強羅` beats `Hakone` if you care about one sub-area.
- **Price seasonality is the signal.** Schedule the same query weekly across late March–early April (sakura), Apr 29–May 5 (Golden Week), mid-August (Obon), November (autumn leaves) and New Year.
- Japanese keywords reach the largest inventory; the built-in English map covers major destinations only.
- Prices depend on party size — a rate for 2 adults in 1 room differs from 4 adults, so keep `adults` and `rooms` consistent when comparing over time.

### FAQ

**Is scraping Jalan legal?**
The Actor reads only public search pages, with no login, no paywall bypass and modest request volume with delays between pages. Scraping publicly available data is generally lawful in many jurisdictions, but you are responsible for the source site's terms and your local regulations.

**Why do some hotels have no price?**
If a property is sold out for your dates, or you ran without a check-in date, no bookable rate exists to report. The hotel record is still returned with its rating, address and reviews.

**Can I get review text or room photos?**
Not in this version — it returns search-level data. Open an issue on the **Issues** tab if you need per-property detail pages; custom Japanese data sources can be built on request.

**Does it cover Rakuten Travel or Ikyu too?**
Not yet. Tell us via Issues if you want cross-OTA coverage and it will be prioritised.

### Other Actors by Data Mill

- [YouTube Transcript Scraper](https://apify.com/datamill/youtube-transcript-scraper) — bulk transcripts, subtitles and RAG chunks from videos, playlists and channels
- [Mercari Sold Price Scraper](https://apify.com/datamill/mercari-sold-price-scraper) — verified sold prices across Mercari, Yahoo Auctions and PayPay Flea Market
- [Japan Horse Racing Scraper](https://apify.com/datamill/netkeiba-race-scraper) — JRA race cards, live odds and results with full payouts

All of them return clean English-keyed JSON and are maintained the same way.

# Actor input Schema

## `keyword` (type: `string`):

City, area or hotel keyword. Japanese works best (東京, 京都, 箱根). Common English city names (Tokyo, Kyoto, Hakone, Niseko, ...) are translated automatically.

## `checkInDate` (type: `string`):

Optional. When set, results include real nightly prices for the stay. Must be today or later (JST).

## `nights` (type: `integer`):

Length of stay when `checkInDate` is set.

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

Number of adult guests.

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

Number of rooms.

## `maxHotels` (type: `integer`):

Stop after this many hotels (30 hotels per result page).

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

Jalan is generally accessible without proxies; enable Apify Proxy if you run into blocking.

## Actor input object example

```json
{
  "keyword": "Tokyo",
  "nights": 1,
  "adults": 2,
  "rooms": 1,
  "maxHotels": 50,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

No description

# 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 = {
    "keyword": "Tokyo",
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("datamill/jalan-hotel-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 = {
    "keyword": "Tokyo",
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("datamill/jalan-hotel-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 '{
  "keyword": "Tokyo",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call datamill/jalan-hotel-scraper --silent --output-dataset

```

## MCP server setup

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