# Rakuten Travel Room Rates Scraper (楽天トラベル) (`boncross/rakuten-travel-room-rates`) Actor

Scrape every plan and room Rakuten Travel (楽天トラベル) prices for a hotel and your dates. Just add hotel numbers, URLs or Japanese names and get stay totals with and without tax, per-night and per-person prices, meals, payment, points, rooms left and hotel details. $3.50 per 1,000 priced hotel-stays.

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

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

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

One Kyoto hotel, two nights in November: 74 bookable plan and room combinations, the cheapest at ¥121,500 for the stay. That's the kind of answer Rakuten Travel Room Rates Scraper gives you. Hand it hotel numbers, hotel URLs or Japanese hotel names with your dates, and it returns everything 楽天トラベル is selling at that hotel, plan (プラン) by plan and room by room, priced for the whole stay.

What a search page won't give you, and this does:

- The whole grid. A run across 400 hotels returned 16,690 offers, up to 39 plans at a single hotel, and rooms a hotel sells without a named plan are priced as well.
- Meal terms you can filter on. Each offer says whether breakfast and dinner are included, in Rakuten's wording and as two true-or-false columns.
- Both sides of the tax line. You get the stay total with tax and before consumption tax, plus per-night and per-person prices.
- An answer for a sold-out stay. It comes back as its own row, and you pay $0.0005 for it, not the full price.
- $3.50 per 1,000 priced hotel-stays on the Free plan and $2.60 on Business, however many plans and rooms each stay has.

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

- 39 of 39 live checks on its inputs and filters passed on 7 October 2026
- 5 hotels run the same day on 2 stays each: 7 stays priced, 3 sold out
- Charges matched the rows
- A sold-out stay gets its own row, and so does one your filters empty

It also lets you:

- Price several date ranges for the same hotels in one run
- Read payment terms, room capacity, Rakuten points and rooms left on each offer
- Add the hotel's address, coordinates, access, check-in times, parking and FAQ
- Choose one record per hotel-stay, or one row per offer for a spreadsheet
- Keep only refundable plans, plans with breakfast or dinner, or offers inside a budget
- Track the lowest price between runs and get back only the stays that moved

### How much does it cost to scrape Rakuten Travel room rates?

| 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 Rakuten Travel answered, priced or not: a sold-out stay, a stay your filters emptied, an unchanged stay in an only-new run and a hotel number with no hotel are charged this alone | $0.0005 | $0.0005 | $0.0005 | $0.0005 |
| `hotel-priced`, per hotel and stay returned, every plan and room included, hotel details included | $0.003 | $0.0027 | $0.0024 | $0.0021 |

Enterprise plans pay the Business price.

**$3.50 per 1,000 hotel-stays** on the Free plan, $2.60 on Business. You pay per stay, not per row: a hotel with 100 offers costs the same as one with five. Proxy usage and platform usage are included, and there's nothing else on the bill.

What a stay costs when there's nothing to price:

- Sold out for your dates: one row with `isSoldOut: true`, charged `hotel-checked` ($0.0005) and nothing more.
- Answered, but your filters removed every offer: one row with the reason in `error` and the number of offers Rakuten had in `ratesFound`, and the same $0.0005.
- Unchanged since the last run, in an only-changes run: no row, $0.0005.
- A hotel number Rakuten doesn't know: $0.0005.
- A stay Rakuten Travel didn't answer at all: a row that says why, and no charge.

Two worked examples:

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

Apify's Free plan gives you $5 of credits a month. At the size of the first example that's about 135 runs, or roughly 1,350 priced hotel-stays.

### What data is in each offer?

| | |
|---|---|
| 🏨 Hotel name, Rakuten number and URL | 🔗 Plan list URL |
| Plan name, plan id and plan URL | 🛏️ Room name, code and type (bed, size, bath) |
| 💴 Stay total, with and without tax | Per-night and per-person prices |
| 🍽️ Meals, with breakfast and dinner flags | 👥 Room capacity |
| Room notes and plan description | 💳 Payment terms |
| Rakuten points, point rate and member discount | Availability and rooms left per offer |
| Plan count, room rows and available offers | Lowest total and lowest refundable total, with plan and room |
| 📍 Address and coordinates | 🚉 Access and parking |
| 🕒 Check-in and check-out times | Hotel FAQ entries |
| 📈 Previous lowest price and change | 🖼️ Hotel, plan and room images |
| 📅 Plan sale period | Discount name and amount |

### How to scrape Rakuten Travel room rates

1. [Create a free Apify account](https://console.apify.com/sign-up).
2. Open [Rakuten Travel Room Rates Scraper](https://apify.com/boncross/rakuten-travel-room-rates).
3. List your hotels. A Rakuten hotel number, a hotel URL or the hotel's name in Japanese all work.
4. Set the dates, adults, children and rooms.
5. Switch on hotel details or a plan filter if you want them, and press Start.
6. Download the result as Excel, CSV, JSON, XML or HTML.

Don't have hotel numbers yet? [Rakuten Travel Search Scraper](https://apify.com/boncross/rakuten-travel-search) lists the hotels in an area, and its `hotelId` column is what goes in here.

### ⬇️ Input

Paste hotels into "Hotels" as numbers (`1369`), URLs or Japanese names. Numbers and URLs cost nothing to resolve. A name is looked up on Rakuten and costs one `hotel-resolved`. English hotel names aren't in Rakuten's index and won't resolve.

Have a long list of links? "Start URLs" loads them in bulk from a file, a Google Sheet or a remote list, and is combined with whatever is in "Hotels".

To price more than one date range, fill in "Multiple stays". Every hotel is priced for every stay, up to 366 stays a run.

Two caps keep a run in hand, and it stops at whichever it reaches first. "Maximum hotel-stays for the whole run" counts priced **hotel-stays**. "Maximum rows for the whole run" counts **rows**. If the row cap lands partway through a stay, you get that stay's cheapest offers and it's billed as one stay. Nothing past a cap is fetched or charged for.

#### Every plan for one hotel

```json
{
  "hotels": ["1369"],
  "checkIn": "2026-11-17",
  "checkOut": "2026-11-19",
  "adults": 2,
  "includeHotelDetails": true
}
```

#### Several hotels, refundable plans with breakfast under a budget

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

#### Two stays, one row per offer

```json
{
  "hotels": ["1369", "178586"],
  "stays": [
    { "checkIn": "2026-11-17", "checkOut": "2026-11-19" },
    { "checkIn": "2026-12-24", "checkOut": "2026-12-26" }
  ],
  "flattenRooms": true
}
```

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

```json
{
  "hotels": ["1369", "7365"],
  "checkInDaysAhead": 30,
  "nights": 1,
  "priceStoreName": "rakuten-grid",
  "onlyNewOrChanged": true
}
```

Settings the examples leave out:

- "Rooms" (default 1) and "Children" (default none). Children are counted per room in Rakuten's own child categories, for example `{ "lowerElementary": 1 }`.
- "Available rooms only" (on by default) drops plan and room rows Rakuten shows without a price, because they're sold out for your dates or outside the plan's capacity.
- "Dinner included only" keeps plans with dinner (夕食あり). "Breakfast included only" does the same for breakfast.
- "Minimum stay total" (JPY, 0 turns it off) drops offers below this tax-inclusive total. The ceiling is "Maximum stay total".
- "Include plan descriptions" is on by default. Plan text can be long, and switching it off keeps records small.

#### For developers

- `maxItems` caps priced hotel-stays and `maxRows` caps rows. Sold-out and unchanged stays aren't counted by `maxItems`.
- With `flattenRooms`, `maxRowsPerStay` (default 300, which is also the maximum) keeps each stay's cheapest offers. A stay is billed once however many rows it has.
- A hotel's plan list is read up to 100 plans a stay, or 60 when nothing on its first page is bookable.
- `stays` takes `{ "checkIn", "checkOut" }` pairs and overrides the single dates. Lowercase `checkin`, `checkout` and `checkinDaysAhead` are accepted too.
- `priceStoreName` names the store that remembers each hotel-stay's lowest total. Later runs fill `previousLowestTotal`, `priceChange`, `priceChangePct` and `previousScrapedAt`, and `onlyNewOrChanged` skips stays whose lowest total hasn't moved.
- `maxConcurrency` (default 16, from 1 to 32) sets how many requests run at once. `delayMs` (default 0, up to 10,000) adds a pause before each request. Lower the first only if a run reports errors.
- A run cut off by its timeout keeps every stay it had already returned.

### ⬆️ Output

By default you get one record per hotel and stay, with all its offers in an `offers` list. With "One row per plan × room" switched on, each offer is a row of its own with the hotel-stay fields beside it.

```json
{
  "input": "171941",
  "id": "171941-2026-11-05-2026-11-06",
  "hotelId": 171941,
  "hotelName": "リッチモンドホテルプレミア京都駅前",
  "url": "https://travel.rakuten.co.jp/HOTEL/171941/171941.html",
  "planListUrl": "https://hotel.travel.rakuten.co.jp/hotelinfo/plan/171941?f_t…",
  "checkIn": "2026-11-05",
  "checkOut": "2026-11-06",
  "nights": 1,
  "adults": 2,
  "rooms": 1,
  "children": {},
  "currency": "JPY",
  "pricesIncludeTax": true,
  "planCount": 10,
  "roomRowCount": 128,
  "availableCount": 49,
  "offerCount": 49,
  "isAvailable": true,
  "lowestTotal": 45600,
  "lowestPerNight": 45600,
  "lowestTotalExcludingTax": 41455,
  "lowestPerNightExcludingTax": 41455,
  "lowestPerPerson": 22800,
  "lowestPlan": "【特別限定料金】20％OFF -素泊まり-",
  "lowestRoom": "スタンダードダブル −アウトサイド−【禁煙】",
  "lowestRefundableTotal": 45600,
  "previousLowestTotal": null,
  "priceChange": null,
  "priceChangePct": null,
  "previousScrapedAt": null,
  "scrapedAt": "2026-10-02T13:17:41.594Z",
  "offers": [
    {
      "planId": 6209028,
      "planName": "【特別限定料金】20％OFF -素泊まり-",
      "isNonRefundable": false,
      "planUrl": "https://hotel.travel.rakuten.co.jp/hotelinfo/plan/171941?f_camp_id=6209028&f_flg=PLAN",
      "planPeriod": "2025年04月10日〜2026年12月31日",
      "planDescription": "京都 ふたつのプレミアラウンジ 〜それぞれの時を楽しみ、空間を楽しむ〜\n京都に2店舗あるリッチモンドホテル『プレミア京都…",
      "roomCode": "stod",
      "roomName": "スタンダードダブル −アウトサイド−【禁煙】",
      "roomType": "ダブル 19m²/バス・トイレ付",
      "roomRemark": "【客室情報】・シモンズ社製ベッド(140cm幅1台）・WiFi接続無料・45型TV設置・ユニットバス・ズボンプレッサー、アイロン設置",
      "meals": "朝食なし 夕食なし",
      "isBreakfastIncluded": false,
      "isDinnerIncluded": false,
      "capacity": "2人〜3人 子供料金設定有り",
      "payment": "予約時オンラインカード決済・現地払い",
      "isAvailable": true,
      "priceTotal": 45600,
      "priceTotalExcludingTax": 41455,
      "pricePerNight": 45600,
      "pricePerNightExcludingTax": 41455,
      "pricesIncludeTax": true,
      "pricePerPerson": 22800,
      "currency": "JPY",
      "points": 414,
      "pointRate": 1,
      "discountTotal": 0,
      "discountName": null,
      "memberDiscount": 0,
      "roomsLeft": 1,
      "roomsLeftText": "残り1部屋",
      "images": [
        "https://trvimg.r10s.jp/share/image_up/171941/LARGE/2d21ec53b…",
        "https://trvimg.r10s.jp/share/image_up/171941/LARGE/a4a161558…"
      ]
    }
  ]
}
```

With "Include hotel details" on, each record also has a `hotel` block with the address, coordinates (`lat`, `lng`), check-in times, access, parking and FAQ. This one is hotel 1369:

```json
"hotel": {
  "name": "京都センチュリーホテル",
  "address": "〒600-8216京都府京都市下京区東塩小路町680",
  "checkInFrom": "15:00",
  "checkInUntil": "24:00",
  "checkOutUntil": "12:00",
  "access": "JR京都駅中央口＜ニデック京都タワー＞より徒歩約2分。",
  "parking": "1泊￥2000(15：00-翌日12：00)(収容台数50台まで・予約不可)",
  "faq": [ … ],
  …
}
```

**Tax fields.** `pricesIncludeTax` is true where the price is Rakuten's tax-included total, on each offer and on the hotel-stay row (where it describes the lowest offer). It's empty where a row has no price, a sold-out stay included. `priceTotalExcludingTax` and `pricePerNightExcludingTax` on an offer, and `lowestTotalExcludingTax` and `lowestPerNightExcludingTax` on the row, give the same stay before consumption tax, as Rakuten states it. A local accommodation tax or hot spring tax the property collects on arrival isn't in either figure and has no amount on the site.

**A sold-out stay** is one row with `isSoldOut: true` and an empty `offers` list.

A few more columns: `hotelUrl` is the hotel's Rakuten Travel page, the same address as `url`. On each offer, `consecutiveNote` is the plan's note on how many nights it can be booked for, in Japanese (for example 「※このプランは1泊限定で予約可能となります。」), and null when the plan has none. `planImages` lists up to eight of the plan's own photo URLs and is empty when it has none.

### How big is a grid, and how long does a run take?

| Hotel | Given as | Offers | Lowest total |
|---|---|---|---|
| おやど 古都の夢 | URL | 7 | ¥154,000 |
| 京都センチュリーホテル | number 1369 | 74 | ¥121,500 |
| ホテルグランヴィア京都 | Japanese name | 52 | ¥82,800 |

Those three came from one run for 17 to 19 November with hotel details on, each with coordinates and check-in times. A single hotel can list more than a hundred plan and room rows, and the bookable ones are the ones with a price.

| Run | Records | Time |
|---|---|---|
| One hotel, one stay | 1 | 4.3 s |
| Four hotels × three stays | 12 hotel-stays | 4.1 s |
| 400 hotels across Japan, one stay (3 October 2026) | 400 hotel-stays, 16,690 offers, up to 39 plans a hotel | 179 s |

The two small runs were measured on Apify on 1 October 2026. The large one works out at about 136 hotel-stays a minute, which puts roughly 8,000 hotel-stays inside the default one-hour run limit. Split a longer list over several runs. However many pages Rakuten spreads a hotel's plans over, you get them all, and a room sold without a named plan appears with plan id 0.

### Scheduled grid watches, the API and AI agents

For rate monitoring, put the run on an Apify Schedule with "Check-in days ahead" and a price memory store, and switch on "Only new or changed". Each run then reports the hotel-stays whose lowest total moved, and the unchanged ones cost $0.0005 each. Slack, Google Sheets, Zapier, Make and Airbyte connect through Apify's integrations, and a webhook can fire when a run ends.

From your own code, `POST https://api.apify.com/v2/acts/boncross~rakuten-travel-room-rates/run-sync-get-dataset-items` with the input JSON as the body returns the dataset in a single call for small runs. Larger ones go through the asynchronous run endpoint. The `apify-client` packages on NPM and PyPI wrap both.

An agent in Claude, Cursor, ChatGPT or another MCP client can use the actor through the Apify MCP server at `mcp.apify.com`, where it shows up as a tool named `boncross/rakuten-travel-room-rates`. Asking it to price a Japanese hotel for given dates and read out the plans with dinner is a fair first test.

### FAQ

#### How do I know if a plan is refundable?

Rakuten marks a non-refundable plan in its name, with 返金不可. Those offers have `isNonRefundable: true`, and "Refundable plans only" drops them. On one Kyoto hotel, 18 of 71 room offers had the mark. Many hotels sell no such plan, and there the filter removes nothing. Everything else follows the hotel's own cancellation policy, which is on the hotel page and on the plan page linked from each offer.

#### Why do some offers have no price?

That plan and room combination isn't bookable for your dates or party. With "Available rooms only" on, which is the default, you never see them. Turn it off and they're returned with `isAvailable` false.

#### What do I get, and pay, when a hotel is sold out?

One row for that hotel and stay with `isSoldOut: true`, at $0.0005. If Rakuten Travel doesn't answer for a stay at all, the row says why and it's free.

#### Is the price for the whole stay?

It is, for the party and rooms you asked for, with tax. Per-night and per-person figures are beside it, and the before-tax total is in `priceTotalExcludingTax`.

#### Can I use an English hotel name?

Not here. Rakuten's hotel lookup knows the Japanese names only. Use the hotel number or URL, or the name as Rakuten writes it (ホテルグランヴィア京都).

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

No to all three. Proxy usage is part of the price, and nothing needs configuring.

#### What are the limits?

- Per-plan cancellation terms aren't returned, and `cancellation` is empty. Refundability comes from the plan name alone.
- Member-only rates and coupons need a login and aren't included. `memberDiscount` is the advertised member amount where Rakuten shows one.
- Names and texts are Japanese.
- One run prices about 8,000 hotel-stays inside the default one-hour limit (measured 3 October 2026, about 136 a minute).

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

Scraping publicly available data is generally legal. 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 in your use of the data.

### More from BonCross

- [Rakuten Travel Search Scraper (楽天トラベル)](https://apify.com/boncross/rakuten-travel-search): Rakuten Travel (楽天トラベル) hotel search results for any area and your dates.
- [Trip.com Hotel Details Scraper](https://apify.com/boncross/tripcom-hotel-details): The full Trip.com record for any hotel, with its guest reviews.
- [Trip.com Hotel Search Scraper](https://apify.com/boncross/tripcom-hotel-search): Every hotel Trip.com lists for a destination and your dates.
- [Trip.com Room Rates Scraper](https://apify.com/boncross/tripcom-room-rates): Every room and rate plan Trip.com is selling for a hotel and your dates.
- [Accor Hotel Details Scraper](https://apify.com/boncross/accor-hotel-details): Full Accor hotel records.
- [Accor Hotel Search Scraper](https://apify.com/boncross/accor-search): Accor hotel prices for any destination and dates.

### Your feedback

If a plan is missing from a grid, or a total differs from what Rakuten shows for the same dates and party, tell us on the Issues tab in Apify Console and include the hotel number and dates. BonCross reads every issue and answers there.

# Changelog

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

# Actor input Schema

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

Rakuten hotel numbers (7365), any travel.rakuten.co.jp / hotel.travel.rakuten.co.jp / review.travel.rakuten.co.jp URL, or Japanese hotel names (resolved through Rakuten's keyword search; English names are not indexed there).

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

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

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

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

Stop after this many rows (one per plan and room when rows are flattened, one per stay otherwise). The last hotel-stay is cut to fit, keeping its cheapest offers, and billed as one stay. 0 means no limit; the run stops at whichever cap it reaches first.

## `maxRowsPerStay` (type: `integer`):

With flattened rows, keep at most this many offers per hotel-stay, cheapest first (up to 300). A stay is billed once however many rows it has.

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

Leave empty to use checkinDaysAhead. Lowercase `checkin` also works.

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

Leave empty to use nights. Lowercase `checkout` also works.

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

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

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

Used when checkout is empty.

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

Optional list of {"checkin", "checkout"} pairs; every hotel is priced for every stay (overrides the single dates). Up to 366 stays a run.

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

1–10.

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

1–10.

## `children` (type: `object`):

Rakuten's child categories per room: upperElementary (小学生高学年), lowerElementary (小学生低学年), infantMealBed (幼児 食事・布団付), infantMeal (幼児 食事のみ), infantBed (幼児 布団のみ), infantNone (幼児 食事・布団不要). Counts, e.g. {"lowerElementary": 1}.

## `availableOnly` (type: `boolean`):

Drop plan × room rows Rakuten shows without a price (sold out for these dates or outside the plan's capacity).

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

Drop plans named 返金不可 (non-refundable).

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

Keep rows with 朝食あり.

## `dinnerOnly` (type: `boolean`):

Keep rows with 夕食あり.

## `minTotalForStay` (type: `integer`):

Post-filter on the tax-inclusive stay total.

## `maxTotalForStay` (type: `integer`):

Post-filter on the tax-inclusive stay total.

## `includeHotelDetails` (type: `boolean`):

Also return the hotel's address, check-in and check-out times, access, parking, FAQ and coordinates. Included in the hotel-priced price.

## `includeDescriptions` (type: `boolean`):

Plan text can be long; switch off to keep records small.

## `flattenRooms` (type: `boolean`):

Instead of one record per hotel × stay with an offers array.

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

Key-value store name remembering each hotel-stay's lowest total, so previousLowestTotal / priceChange are filled on later runs.

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

With a price store: skip hotel-stays whose lowest 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://travel.rakuten.co.jp/HOTEL/7365/7365.html",
    "1369",
    "ホテルグランヴィア京都"
  ],
  "startUrls": [],
  "maxItems": 0,
  "maxRows": 0,
  "maxRowsPerStay": 300,
  "checkIn": "",
  "checkOut": "",
  "checkInDaysAhead": 30,
  "nights": 1,
  "stays": [],
  "adults": 2,
  "rooms": 1,
  "children": {},
  "availableOnly": true,
  "refundableOnly": false,
  "breakfastOnly": false,
  "dinnerOnly": false,
  "minTotalForStay": 0,
  "maxTotalForStay": 0,
  "includeHotelDetails": false,
  "includeDescriptions": true,
  "flattenRooms": false,
  "priceStoreName": "",
  "onlyNewOrChanged": false,
  "delayMs": 0,
  "maxConcurrency": 16
}
```

# Actor output Schema

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

Rakuten Travel room rates: 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://travel.rakuten.co.jp/HOTEL/7365/7365.html",
        "1369",
        "ホテルグランヴィア京都"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("boncross/rakuten-travel-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://travel.rakuten.co.jp/HOTEL/7365/7365.html",
        "1369",
        "ホテルグランヴィア京都",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("boncross/rakuten-travel-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://travel.rakuten.co.jp/HOTEL/7365/7365.html",
    "1369",
    "ホテルグランヴィア京都"
  ]
}' |
apify call boncross/rakuten-travel-room-rates --silent --output-dataset

```

## MCP server setup

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