# Jalan.net Room Rates Scraper (じゃらん) (`boncross/jalan-room-rates`) Actor

Scrape every plan and room Jalan (じゃらん) lists for a hotel on a date. Just add hotel URLs, hotel numbers or Japanese names and get tax-inclusive total and per-person price, room name and type, meals, check-in times, rooms left, prepaid and card flags and plan URL. $3.50 per 1,000 priced hotel-stays.

- **URL**: https://apify.com/boncross/jalan-room-rates.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 $2.10 / 1,000 hotel-priceds

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 Room Rates Scraper (じゃらん)

### What is Jalan.net Room Rates Scraper (じゃらん)?

Hotel Granvia Kyoto sells 107 plan and room combinations for a single night on Jalan.net (じゃらん), and a search result shows you a handful of them. Jalan.net Room Rates Scraper returns all of them: one row per plan (プラン) and room, each with its tax-inclusive total, meal terms, rooms left and cancellation policy. Paste a hotel's Jalan URL, its number or its Japanese name, set a date, and you have the hotel's whole rate grid.

What a search row can't tell you, and this does:

- The full grid, fast. 12 Kyoto hotels over 3 stays gave 1,435 rows in 5 seconds.
- How each plan cancels. You get the free-cancellation date and the fee ladder as Jalan words it, switched on by default.
- What's in the price. Breakfast and dinner are flagged separately on each row, next to Jalan's own meal label.
- Whether a date is sold out. A full hotel gets a row that says so, and it costs you $0.0005, not the price of a stay.
- A year of dates in one go. A run takes up to 366 stays for the same hotels.

You pay per hotel-stay, not per row: $3.50 per 1,000 hotel-stays on the Free plan, $2.60 on Business, whether a stay has 5 rows or 107.

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

- 41 of 41 live checks on its inputs and filters passed on 7 October 2026
- 5 hotels run the same day on 2 stays each: 193 plans, 2 sold-out answers
- Charges matched the rows
- A sold-out stay, or one your filters empty, comes back as a row saying so

The rest, briefly:

- Read plan titles, labels, room names, room types and booking periods for your date and party
- Check rooms left, with prepaid, online-card-only and card-accepted flags
- See each night's price and rooms left on a multi-night stay
- Add about two months of daily prices for the cheapest plans, if you want a calendar
- Keep only refundable plans, plans with breakfast, or plans inside a price band
- Track the price between runs and get back only the rows that moved

### What rate data do you get for each plan and room?

| | |
|---|---|
| 🏨 Hotel name, Jalan number and URL | Plan title, plan code and labels |
| 🛏️ Room name, room code and room type | Room labels |
| 💴 Stay total, with a tax-included flag | Price per person per night |
| 🍽️ Meal plan, with breakfast and dinner flags | Jalan points earned |
| Prepaid and online-card-only flags | 💳 Card accepted flag |
| Rooms left, as a number or the site's wording | 🕒 Check-in and check-out times |
| Each night's price and rooms left, for multi-night stays | Cancellation policy: free-cancellation date and the fee ladder |
| Deposit and plan check-in/out; optional non-smoking, private bath and toilet, per-guest price breakdown | 🗓️ Optional two-month daily price and availability calendar |
| Booking period for the plan | 🔗 Direct plan URL |
| ⭐ Hotel rating and review count | Availability and sold-out flags |
| 📈 Previous price and price change | Plan description |

### How much does it cost to price a Jalan hotel?

| 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 |
| `hotel-checked`, per hotel and stay Jalan answered, priced or not: a sold-out stay, a date Jalan does not sell, a stay whose plans were all filtered out or unchanged, and a hotel number Jalan has no hotel for are charged this alone | $0.0005 | $0.0005 | $0.0005 | $0.0005 |
| `hotel-priced`, per hotel and stay priced, however many rows come back | $0.003 | $0.0027 | $0.0024 | $0.0021 |
| `calendar-day`, per calendar day returned when `priceCalendar` is on | $0.0003 | $0.00027 | $0.00024 | $0.00021 |

Enterprise plans pay the Business price.

**$3.50 per 1,000 hotel-stays** on the Free plan, $2.60 on Business, with all of a stay's rooms and plans included. There's nothing on top: proxy usage and platform usage are in the price.

- Ten hotels by number, one date each: `0.002 + 10 × (0.003 + 0.0005) = $0.037` ($0.028 on Business)
- Twenty hotels by name, three dates each: `0.002 + 20 × 0.002 + 60 × (0.003 + 0.0005) = $0.252` ($0.198 on Business)

The $5 of credits in Apify's Free plan each month buys you about 135 runs the size of the first example. That's roughly 1,350 hotel-stays with their full grids before you pay anything.

What a stay with no rates costs you:

- Sold out on your date: a row marked sold out, and $0.0005.
- A date Jalan won't sell (too far ahead, or in the past): a row with the reason in `error`, and $0.0005.
- All plans removed by your filters: a row with the reason in `error` and the number of plans Jalan had in `ratesFound`, and $0.0005.
- Unchanged in an only-changes run: no row, and $0.0005.
- A hotel number Jalan doesn't know: $0.0005.
- A stay Jalan never answered: nothing.

The calendar is the one extra. It's billed per day row, and with the default 3 plans over about two months that's roughly 180 rows a stay, about $0.054 on the Free plan.

### How to scrape Jalan.net room rates

1. [Create a free Apify account](https://console.apify.com/sign-up).
2. Open [Jalan.net Room Rates Scraper](https://apify.com/boncross/jalan-room-rates).
3. Add your hotels: Jalan URLs, Jalan numbers or Japanese hotel names.
4. Set the date, adults, children and rooms.
5. Add a plan filter or a sort if you need one, and click Start.
6. Download the rates as Excel, CSV, JSON, XML or HTML.

Don't have the hotel numbers yet? [Jalan.net Hotel Search Scraper](https://apify.com/boncross/jalan-search) lists the properties in an area, and each row's `hotelId` goes straight in here.

### ⬇️ Input

Give it hotels and a date. A hotel can be a Jalan URL, a Jalan number such as `301552`, or the hotel's Japanese name. English names rarely resolve, because Jalan indexes Japanese ones. If you have a long list of links, put them in Start URLs, which loads them in bulk from a file, a Google Sheet or a remote list. Both inputs are used together.

To price several date ranges for the same hotels, list them in "Multiple stays". It takes up to 366 a run.

You have three limits. "Max rate rows per hotel-stay" caps the plans kept for each stay. "Maximum hotel-stays for the whole run" caps the priced stays, and "Maximum rows for the whole run" caps the rows. The run stops at whichever of the two run-wide caps it reaches first, and you aren't charged for anything past it.

**Dates and guests.** Set a check-in and check-out date (YYYY-MM-DD), or use "Check-in days ahead" (default 30) with "Nights" (1 to 9, default 1), or list stays. "Adults per room" defaults to 2, "Rooms" to 1, and "Children ages" takes one age per child, 0 to 12.

**Filters and sorting.** "Sort" orders the plans. "Meal type" (`any`, `none`, `breakfast`, `dinner` or `both`, default `any`) is applied by Jalan. "Min price per person" and "Max price per person" set a band in JPY per adult per night, where 0 means no limit. The maximum is applied to the rows returned: a plan stays only when its `pricePerPerson` is at or under it. "Refundable only" drops plans marked non-refundable or prepaid, and "Breakfast only" keeps plans with breakfast.

**What each row includes.** "Cancellation policy and plan details" is on by default. It adds each plan's cancellation policy with its free-cancellation date and fee ladder, the deposit, the plan's own check-in and check-out, the sale period and the point rate. Turn it off for the fastest run. "Room details per row" is off by default. For each room of each plan it adds non-smoking, private bath and toilet, the fewest rooms left over the stay, points earned and the per-night price by guest, and it's slower. "Two-month price calendar" adds about two months of daily price and rooms left, one row per day, for the cheapest plans of each stay ("Plans per stay in the calendar", default 3, 1 to 20).

#### Every plan for one hotel on a date

```json
{
  "hotels": ["https://www.jalan.net/yad301552/"],
  "checkIn": "2026-11-07",
  "checkOut": "2026-11-08",
  "adults": 2
}
```

#### Several hotels, refundable plans with breakfast

```json
{
  "hotels": ["301552", "ホテルグランヴィア京都"],
  "checkInDaysAhead": 30,
  "nights": 1,
  "refundableOnly": true,
  "breakfastOnly": true,
  "sort": "price_low_to_high"
}
```

#### Two stays for the same hotels

```json
{
  "hotels": ["301552", "301928"],
  "stays": [
    { "checkIn": "2026-11-07", "checkOut": "2026-11-08" },
    { "checkIn": "2026-12-24", "checkOut": "2026-12-26" }
  ],
  "adults": 2,
  "maxPlansPerHotel": 50
}
```

#### A daily rate watch that returns only changes

```json
{
  "hotels": ["301552", "301928"],
  "checkInDaysAhead": 30,
  "nights": 1,
  "priceStoreName": "jalan-rates",
  "onlyNewOrChanged": true
}
```

#### For developers

- `maxPlansPerHotel` caps the plans kept for each hotel-stay (0 = all). `maxItems` caps the priced hotel-stays in the whole run and `maxRows` caps the rows. When `maxRows` falls partway through a stay, that stay is cut to fit, keeping its cheapest plans, and billed as one stay. Nothing past a cap is fetched or charged for.
- Sold-out stays, dates Jalan doesn't sell and unchanged stays don't count toward `maxItems`.
- `stays` is a list of `{checkIn, checkOut}` pairs and overrides the single check-in and check-out.
- `includePlanDetails` reads one extra call per plan, because plan-level fields are the same on each room of a plan. `includeRoomDetails` reads one per row.
- `priceCalendar` rows are billed as `calendar-day`, for the `calendarPlansPerStay` cheapest plans of each stay.
- `priceStoreName` names the storage that remembers each room and plan total per stay, and fills `previousPriceTotal`, `priceChange`, `priceChangePct` and `previousScrapedAt` on later runs. With `onlyNewOrChanged`, rows whose total hasn't changed are skipped.
- `maxConcurrency` (Parallel requests, default 16, 1 to 32) is how many requests run at once. It's set to the fastest level we measured clean. `delayMs` (default 0, up to 15000) adds a pause in milliseconds before each call.
- When Jalan answers that it's too busy (about 4% of pages on a Saturday morning, Japan time), the page is asked for again. The busy answer never reaches your data.
- A run the platform restarts part-way carries on where it stopped. Hotel-stays already delivered aren't delivered or charged a second time.

### ⬆️ Output

You get one record per plan and room, which is why a single hotel and date can give you many rows.

```json
{
  "input": "318030",
  "id": "318030-2026-11-05-1-03693324-0474541",
  "hotelId": 318030,
  "hotelName": "コンフォートホテルERA京都東寺",
  "hotelUrl": "https://www.jalan.net/yad318030/",
  "hotelRating": 4.3,
  "hotelRatingScale": 5,
  "hotelReviewCount": 376,
  "checkIn": "2026-11-05",
  "checkOut": "2026-11-06",
  "nights": 1,
  "adults": 2,
  "childrenAges": [],
  "rooms": 1,
  "isAvailable": true,
  "isSoldOut": false,
  "planId": "03693324",
  "planTitle": "京都駅より1駅◆◆サラダ・フルーツたっぷり♪カラダの内側から元気になれる朝食ビュッフェ◆",
  "planLabels": [
    "ふるさと納税対象"
  ],
  "roomName": "３ベッド◆ファミリールーム◆＜禁煙＞",
  "roomTypeId": "0474541",
  "roomType": "トリプル",
  "roomLabels": [
    "ポイント2%",
    "禁煙ルーム",
    "部屋でインターネットOK"
  ],
  "mealPlan": "朝のみ",
  "meal": "breakfast",
  "isBreakfastIncluded": true,
  "isDinnerIncluded": false,
  "checkInFrom": "15:00",
  "checkOutUntil": "10:00",
  "bookingPeriod": null,
  "description": "【Cheerful Morning】カラダの内側から元気になれる朝食ビュッフェで、わくわくな朝を。",
  "pricePerPerson": 15200,
  "priceTotal": 30400,
  "currency": "JPY",
  "priceText": "合計(税込) 1泊 大人2名",
  "pricesIncludeTax": true,
  "pointsEarned": 608,
  "isPrepaid": false,
  "isOnlineCardOnly": false,
  "isCardAccepted": true,
  "roomsLeft": 3,
  "roomsLeftText": "あと3部屋",
  "nightly": [{ "date": "2026-11-02", "price": 26010, "roomsLeft": 2 }, { "date": "2026-11-03", "price": 26010, "roomsLeft": 7 }],
  "url": "https://www.jalan.net/uw/uwp3200/uww3201init.do?stayYear=202…",
  "previousPriceTotal": null,
  "priceChange": null,
  "priceChangePct": null,
  "previousScrapedAt": null,
  "scrapedAt": "2026-10-02T13:17:41.648Z"
}
```

`pricesIncludeTax` records the basis Jalan states for each price. It's true where the price is labelled tax-included, which was the case on each page measured, false if Jalan ever labels one tax-excluded, and empty where a row has no price. `priceText` is Jalan's own label for the price. A local accommodation tax or hot spring tax collected at the property is not in Jalan's prices and has no amount on the site.

**Plan details** (`includePlanDetails`, on by default; the same on every room of a plan):

| Field | What it holds |
|---|---|
| `freeCancellationUntil` | The last date the plan can be cancelled free; null when Jalan gives no date |
| `isFreeCancellation` | true while that date has not passed; false when the plan has a fee ladder and no free date; null when the plan states no policy |
| `cancellationPolicy` | The fee ladder as Jalan words it, a list of `{when, charge}`; null when there is none |
| `isDepositRequired` | true when the plan asks for a deposit; null when not stated |
| `planCheckInFrom` / `planCheckInUntil` / `planCheckOutUntil` | Check-in and check-out times set by the plan itself; null when it sets none |
| `salePeriod` | The plan's sale window as `{from, until}`; null when not stated |
| `pointRatePercent` | The points rate the plan earns, in percent |
| `priceNote` | The plan's own note about its price, as plain text; null when there is none |

**Room details** (`includeRoomDetails`, off by default): `isNonSmoking`, `hasPrivateBath` and `hasPrivateToilet` (null when Jalan does not say), `roomsLeftMin` (the fewest rooms left on any night of the stay), `pointsTotal` (points earned on the stay) and `priceBreakdown` (one entry per night: `night`, `total`, and per room the adults, price per adult, room charge and any children by category with their price). All are null when the option is off or the details could not be read.

With `priceCalendar` on, the calendar rows have `recordType: "calendarDay"` and one date each (`date`, `price`, `roomsLeft`, `roomsLeftText`, `isAvailable`, `points`) for a plan and room. Plan and room rows have no `recordType`.

A date with no availability returns a row marked sold out, which lets you tell a full hotel from an empty result. A date Jalan will not quote (too far ahead or in the past) returns a row with an `error` explaining why.

### How many rows per hotel, and how fast?

| Run | Results | Time |
|---|---|---|
| 1 hotel, 1 night, 2 adults, 5 plans | 5 rate rows | 4 s |
| 3 hotels across 3 stays (two 1-night, one 2-night), 2 adults | 363 rate rows over 9 hotel-stays | 5 s |
| 12 Kyoto hotels across the same 3 stays, 2 adults | 1,435 rows over 36 hotel-stays, 1,434 priced, 1 sold-out row | 5 s |
| 100 hotels across Japan × 3 stays, 5 plans each | 1,075 rows over 300 hotel-stays (235 priced, 65 sold out) | 34 to 37 s |

Hotel Granvia Kyoto alone returned 107 plan and room rows for a single night. Stays are limited to 9 nights, which is the site's own maximum.

On a large run you can expect about 400 to 500 hotel-stays a minute. The default one-hour run limit covers roughly 25,000 hotel-stays, and you can raise the run timeout for more.

### Rate watches and your own tools

A portfolio rate watch is the setup we'd suggest: schedule the actor in Apify with "Check-in days ahead" and a price store name, switch on "Only new or changed", and each run reports the plans whose total moved. A webhook, Slack or Google Sheets can take it from there, and Zapier, Make, Airbyte and GitHub connect the same way.

From code, `POST https://api.apify.com/v2/acts/boncross~jalan-room-rates/run-sync-get-dataset-items` returns the rows in a single call for small runs. Larger ones go through the asynchronous run endpoint. `apify-client` is on NPM and PyPI.

If you work through an AI agent, add the Apify MCP server (`mcp.apify.com`) to Claude, Cursor or ChatGPT. The actor shows up as a tool named `boncross/jalan-room-rates`, and the agent can price a specific Japanese hotel for a date and read each plan.

### FAQ

#### 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. A name costs one `hotel-resolved` lookup.

#### How do I tell sold out from a failed run?

A date with no availability returns a row with `isSoldOut` set. A date Jalan won't quote returns a row with an `error`. You never have to guess from an empty dataset.

#### Which plans take cards, and which are prepaid?

`isCardAccepted` is true on almost every plan, because nearly every Jalan plan takes online card payment. Don't filter on it. Use `isPrepaid` and `isOnlineCardOnly` to separate card-only plans from pay-at-hotel ones. The three flags are read from the plan's own payment labels. Where a plan shows no payment label at all they're null, not false: Jalan saying nothing about cards isn't Jalan saying the hotel refuses them.

#### What does "Refundable only" keep?

It drops plans labelled prepaid, non-refundable or online-card-only. A plan with no payment label is kept. For the actual terms, read `freeCancellationUntil` and `cancellationPolicy` on each row.

#### Are the prices tax-inclusive?

Totals include tax for the party you request, and each priced row says so in `pricesIncludeTax`. The per-person figure sits beside it. A local accommodation tax or hot spring tax collected at the property is not included.

#### Can I price several dates at once?

List them in "Multiple stays" as check-in and check-out pairs. Each hotel is priced for each stay, up to 366 stays a run.

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

Neither. Proxy usage is included in the price and there's nothing to configure. No login is used, which also means member-only prices aren't included.

#### What are the limits?

- Names and plan titles are Japanese only. English hotel names rarely resolve, so pass the Japanese name or the URL.
- `roomsLeft` is numeric only when the site gives a number. Otherwise its wording is in `roomsLeftText`.
- `nightly` lists each night of the stay with that night's price for the whole booking and its rooms left. It is empty for the rare plan Jalan does not list there.
- Stays are limited to 9 nights, the site's maximum.
- `bookingPeriod` fills only for plans that show a sale period, and it's often empty.

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

Scraping publicly available data is generally legal. This actor reads only what Jalan serves to any logged-out visitor. You're responsible for complying with Jalan's terms and applicable law in how you use the data.

### More from BonCross

- [Jalan.net Reviews Scraper (じゃらん クチコミ)](https://apify.com/boncross/jalan-reviews): Jalan (じゃらん クチコミ) hotel reviews, all or only new ones.
- [Jalan.net Hotel Search Scraper (じゃらん)](https://apify.com/boncross/jalan-search): Jalan (じゃらん) hotel search results for any area and your dates.
- [Marriott Hotel Details Scraper](https://apify.com/boncross/marriott-hotel-details): Everything a Marriott property publishes: address, coordinates, phones, brand, guest…
- [Marriott Hotel Search Scraper](https://apify.com/boncross/marriott-hotel-search): Every Marriott hotel for a destination and dates.
- [Marriott Room Rates Scraper](https://apify.com/boncross/marriott-room-rates): Every room and rate plan Marriott sells for a hotel and your dates.
- [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.

### Your feedback

If a plan on じゃらん is missing from your rows, or a total doesn't match the hotel's page, we want to know. Raise it on the Issues tab in Apify Console with the hotel number and date. BonCross answers each issue there.

# Changelog

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

# Actor input Schema

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

jalan.net hotel URLs, hotel ID numbers, or Japanese hotel names (English names rarely resolve, Jalan indexes Japanese 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.

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

Stop after this many priced hotel-stays across the run: one hotel and one stay, with all its plans. 0 means no limit. Sold-out, stale and unchanged stays are not counted.

## `maxRows` (type: `integer`):

Stop after this many plan rows. The last hotel-stay is cut to fit, keeping its cheapest plans, and billed as one stay. 0 means no limit; the run stops at whichever cap it reaches first.

## `maxPlansPerHotel` (type: `integer`):

0 = all.

## `checkIn` (type: `string`):

YYYY-MM-DD. Defaults to `checkinDaysAhead` days from today. Lowercase `checkin` also works.

## `checkOut` (type: `string`):

YYYY-MM-DD. Defaults to check-in + `nights`. Lowercase `checkout` also works.

## `checkInDaysAhead` (type: `integer`):

Used when `checkin` is empty. Lowercase `checkinDaysAhead` also works.

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

1–9 (Jalan's maximum). Used when `checkout` is empty.

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

1–9.

## `childrenAges` (type: `array`):

Ages 0–12. Jalan buckets children as 小学生 (6–11) and 幼児 (under 6, with meals and bedding).

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

1–10.

## `stays` (type: `array`):

Optional list of `{checkin, checkout}` (or `{checkin, nights}`) objects; overrides the single check-in/check-out above. Up to 366 stays a run.

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

Jalan's plan orderings.

## `mealType` (type: `string`):

Keep only plans that include this meal arrangement.

## `minPricePerPerson` (type: `integer`):

Per adult per night.

## `maxPricePerPerson` (type: `integer`):

Per adult per night. 0 = no limit.

## `refundableOnly` (type: `boolean`):

Drop plans marked 返金不可 / prepaid / online-card-only.

## `breakfastOnly` (type: `boolean`):

Keep plans with breakfast.

## `includePlanDetails` (type: `boolean`):

Add each plan's cancellation policy (free-cancellation date and fee ladder), deposit, the plan's own check-in and check-out, sale period and point rate. Turn off for the fastest run.

## `includeRoomDetails` (type: `boolean`):

Also add, for every room of every plan: non-smoking, private bath and toilet, the fewest rooms left over the stay, points earned and the per-night price breakdown by guest. Slower: the detail is read for every row rather than once per plan.

## `priceCalendar` (type: `boolean`):

Also return about two months of daily price and rooms left for the cheapest plans of each stay, one row per day (recordType "calendarDay"), billed per day.

## `calendarPlansPerStay` (type: `integer`):

How many of each stay's cheapest plans get a calendar.

## `priceStoreName` (type: `string`):

Named key-value store remembering each room × plan total per stay, so `previousPriceTotal` and `priceChange` are filled on later runs.

## `onlyNewOrChanged` (type: `boolean`):

With a price store: skip rate rows whose total is unchanged.

## `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": [],
  "maxItems": 0,
  "maxRows": 0,
  "maxPlansPerHotel": 0,
  "checkInDaysAhead": 30,
  "nights": 1,
  "adults": 2,
  "childrenAges": [],
  "rooms": 1,
  "stays": [],
  "sort": "recommended",
  "mealType": "any",
  "minPricePerPerson": 0,
  "maxPricePerPerson": 0,
  "refundableOnly": false,
  "breakfastOnly": false,
  "includePlanDetails": true,
  "includeRoomDetails": false,
  "priceCalendar": false,
  "calendarPlansPerStay": 3,
  "priceStoreName": "",
  "onlyNewOrChanged": false,
  "delayMs": 0,
  "maxConcurrency": 16
}
```

# Actor output Schema

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

Jalan.net Room Rates 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-room-rates").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-room-rates").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-room-rates --silent --output-dataset

```

## MCP server setup

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

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/ZrTlNSggXed7OXy8g/builds/dbaSDgNTJaWpxUp4m/openapi.json
