# Rakuten Travel Search Scraper (楽天トラベル) (`boncross/rakuten-travel-search`) Actor

Scrape Rakuten Travel (楽天トラベル) hotel search results for any area and your dates. Just add area names, codes or URLs and get up to three priced plans per hotel with the stay total, per-person price, meals, payment method, points, rating, review count, features and image. $1.50 per 1,000 hotels.

- **URL**: https://apify.com/boncross/rakuten-travel-search.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.05 / 1,000 property-listeds

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 Search Scraper (楽天トラベル)

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

Pick a prefecture and your dates, and Rakuten Travel Search Scraper lists the hotels 楽天トラベル has there, each priced for your whole stay with tax. Every hotel comes with up to three plans (プラン) and their room, meals and payment terms. Rakuten Travel is one of Japan's largest domestic travel sites and part of the Rakuten points ecosystem, and you don't need a Rakuten account or an API key to read it this way.

Why it's worth choosing:

- It covers the country in one run. All 47 prefectures at 60 hotels each returned 2,820 hotels in 21.5 seconds, every prefecture full.
- The price is the stay, not a first night. You get the total, the nightly and the per-person figure with tax, and the same stay before consumption tax beside them.
- Rakuten does the narrowing. Property type, luxury tier, 59 facilities and services, room type, nightly price and 10x points are applied by Rakuten itself, and a hotel your filters remove costs you nothing.
- A daily watch can return only the hotels whose price moved. The ones that didn't move aren't charged.
- $1.50 per 1,000 hotels on the Free plan and $1.05 on Business, plans included, with proxy usage and platform usage included.

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

- 47 of 47 live checks on its inputs and filters passed on 8 October 2026
- 6 areas run on 7 October 2026: 90 hotels, none empty
- Charges matched the rows

What else you can do with it:

- Search a whole prefecture, one of Rakuten's areas inside it, or a pasted Rakuten search URL
- Run a dated search for real availability, or an undated one for guide prices
- Keep only hotels above a review score or review count, inside a stay-total band, with breakfast or dinner, or with refundable plans
- Sort by Rakuten's recommendation, price, review score or room size
- Read Rakuten points and the points rate on each plan
- See Rakuten's luxury badge and which tier it is

People mostly use it to watch rates across a Japanese city, to compare their own stay totals with the domestic market, and to build supply lists by area and review score. It also shows how points campaigns and sale periods move prices, and how much of an area is still bookable on a date.

### What hotel data comes back?

| | |
|---|---|
| 🏨 Hotel name and Rakuten hotel number | 🔗 Hotel URL and plan list URL |
| 💴 Stay total, with and without tax | Price per night and per person |
| Up to three plans with names and ids | 🛏️ Room name, bed type and bath type |
| Smoking or non-smoking | 🍽️ Meals, with breakfast and dinner flags |
| 💳 Payment terms on each plan | Rakuten points and points rate on the plan |
| ⭐ Review score out of 5 | Review count |
| Rooms left, where the site shows it | 🚉 Access description |
| Headline and feature tags | 🖼️ Hotel image |
| Prefecture, area and sub-area codes | 📈 Previous price and price change |
| Undated guide price per night | Luxury badge and its tier |

### How to scrape Rakuten Travel search results

You fill in a form and download a spreadsheet. There's no code involved.

1. [Sign up for Apify](https://console.apify.com/sign-up), which is free, and open [Rakuten Travel Search Scraper](https://apify.com/boncross/rakuten-travel-search).
2. Type an area: a prefecture such as Kyoto, or a prefecture and one of Rakuten's areas such as "Kyoto 京都市". A pasted Rakuten search URL works too.
3. Set your dates, adults, children and rooms. If dates don't matter, switch on "Undated search".
4. Add filters or a sort, then press Start.
5. Download the hotels as Excel or CSV, or as JSON, XML or HTML.

### ⬇️ Input

Start with the area. You can write it four ways:

- a prefecture on its own: `"Kyoto"`, `"京都府"` or `"kyoto"`
- a prefecture followed by one of Rakuten's areas: `"Kyoto 京都市"` or `"kyoto/shi"`
- an object such as `{ "prefecture": "Kyoto", "area": "京都市" }`
- a pasted Rakuten search URL

Area names are matched against the Japanese names Rakuten uses. If you give one it doesn't know, you get a row listing the areas Rakuten has for that prefecture, which is usually the quickest way to find the right spelling.

You have two limits. "Max hotels per area" (1 to 5,000, default 100) applies to each area separately: ten areas at 50 each returns 500. "Maximum results for the whole run" caps the run as a whole, 0 means no cap, and nothing past it is fetched or charged for.

Dates work either way round. Give a check-in and check-out, or leave them empty and use "Check-in days ahead" (default 30) with "Nights" (default 1), which is what you want on a schedule.

#### Search a city for fixed dates

```json
{
  "areas": ["Kyoto 京都市"],
  "checkIn": "2026-11-17",
  "checkOut": "2026-11-19",
  "adults": 2,
  "sort": "price_low_to_high",
  "maxResultsPerArea": 100
}
```

#### Well-rated hotels with breakfast

```json
{
  "areas": [{ "prefecture": "Kyoto", "area": "京都市" }],
  "checkInDaysAhead": 30,
  "nights": 2,
  "minReviewScore": 4,
  "minReviewCount": 50,
  "breakfastOnly": true,
  "sort": "review_score"
}
```

#### Ryokan with an open-air bath and parking, under ¥40,000 a night

Property types are "any of", facilities are "all of", and the nightly price is per room, tax included.

```json
{
  "areas": ["Kyoto"],
  "checkInDaysAhead": 30,
  "nights": 1,
  "propertyTypes": ["ryokan", "minshuku"],
  "facilities": ["openAirBath", "parking"],
  "maxPricePerNight": 40000
}
```

#### Rakuten's top-tier luxury hotels with a twin room

```json
{
  "areas": ["Tokyo 東京２３区内"],
  "checkInDaysAhead": 45,
  "luxury": "highest",
  "roomTypes": ["twin"]
}
```

#### An undated survey of two metros

```json
{
  "areas": ["Osaka", "Tokyo 東京２３区内"],
  "undated": true,
  "sort": "review_score",
  "maxResultsPerArea": 100
}
```

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

```json
{
  "areas": ["kyoto/shi"],
  "checkInDaysAhead": 30,
  "nights": 1,
  "priceStoreName": "rakuten-prices",
  "onlyNewOrChanged": true
}
```

The filters the examples don't show:

- "Rooms" (default 1) and "Children" (default none). Children are counted per room in Rakuten's own child categories, for example `{ "lowerElementary": 1 }`.
- "Minimum stay total" and "Maximum stay total" (JPY, 0 turns them off). Dated searches only. They drop plans cheaper or dearer than this for the whole stay.
- "Minimum price per room per night" (JPY, 0 turns it off). Dated searches. This is Rakuten's own price floor, tax included, and the ceiling is the maximum shown above.
- "Dinner included only" keeps plans with dinner (夕食あり) on a dated search. "Breakfast included only" does the same for breakfast.
- "Refundable plans only" drops plans whose name carries 返金不可 (non-refundable), which is how Rakuten marks them.
- "Required features" takes feature labels as Rakuten prints them, all required: 大浴場, 露天風呂, 駐車場.
- "10x Rakuten points only" keeps properties offering ten times the usual points (ポイント10倍) on a dated search.

#### For developers

- `maxResultsPerArea` is the per-area limit and `maxItems` the run-wide one. Rows that report an area the actor couldn't resolve aren't counted against `maxItems`.
- When your filters keep few or none of the hotels, reading an area 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 `maxResultsPerArea` needs.
- `minReviewScore` at 4.0 or 4.5 uses Rakuten's own rating filter. Any other value is applied to the hotels the search returns, as are `minReviewCount`, the stay-total band, the meal flags, `refundableOnly` and `features`.
- `priceStoreName` names the store that remembers each hotel's lowest price per stay. From the second run on it fills `previousPriceTotal`, `priceChange`, `priceChangePct` and `previousScrapedAt`, and `onlyNewOrChanged` then skips hotels whose price hasn't moved.
- `extraParams` (default none) passes further Rakuten search filters through as they are, as name and value pairs copied from a Rakuten Travel search link.
- `maxConcurrency` (default 16, from 1 to 32) is how many requests run at once across the run. `delayMs` (default 0, up to 10,000) adds a pause before each one. We'd leave both alone unless a run reports errors.
- Lowercase `checkin`, `checkout` and `checkinDaysAhead` are accepted as well.

### ⬆️ Output

One record per hotel and stay, which you can read as a table or as JSON in the Output tab.

```json
{
  "area": "京都府",
  "prefecture": "Kyoto",
  "areaCodes": {
    "area": "kyoto",
    "subArea": null,
    "detailArea": null
  },
  "id": "782",
  "hotelId": 782,
  "name": "メルキュール京都宮津リゾート＆スパ",
  "url": "https://travel.rakuten.co.jp/HOTEL/782/782.html",
  "planListUrl": "https://hotel.travel.rakuten.co.jp/hotelinfo/plan/782?f_nen1…",
  "rating": 4.09,
  "ratingScale": 5,
  "reviewCount": 4532,
  "image": "https://trvimg.r10s.jp/share/image_up/782/origin/cd740544b01…",
  "headline": "楽天トラベル 日本の宿アワード 2025TOP47受賞／オールインクルーシブで、ビールも楽しめるラウンジアクセス付！",
  "access": "京都丹後鉄道「宮津駅」から車またはホテル送迎バスで約12分※9月15日より完全予約制／ 宮津天橋立ICから約15分",
  "features": [
    "露天風呂",
    "大浴場"
  ],
  "tags": [
    "温泉宿"
  ],
  "isPremium": false,
  "premiumTier": null,
  "providerUuid": "ce0633f2-6e07-4086-bc67-daf58411a585",
  "guidePricePerNightExcludingTax": null,
  "guidePricePerNight": null,
  "priceTotal": 21600,
  "pricePerNight": 21600,
  "pricePerPerson": 10800,
  "cheapestPlan": "【さき楽30】温泉と宿泊者限定ラウンジで寛ぐひととき シンプルステイ＜素泊まり・ラウンジ付＞ クラシックツイン【ラウンジアクセス付】",
  "pricesIncludeTax": true,
  "priceTotalExcludingTax": 19637,
  "pricePerNightExcludingTax": 19637,
  "plans": [
    {
      "planId": 6168648,
      "roomCode": "tfc",
      "planName": "【さき楽30】温泉と宿泊者限定ラウンジで寛ぐひととき シンプルステイ＜素泊まり・ラウンジ付＞ クラシックツイン【ラウンジアクセス付】",
      "planUrl": "https://hotel.travel.rakuten.co.jp/hotelinfo/plan/782?f_camp…",
      "bedType": "ツイン",
      "bath": "バス・トイレ付",
      "smoking": "non-smoking",
      "meals": "朝食なし 夕食なし",
      "isBreakfastIncluded": false,
      "isDinnerIncluded": false,
      "payment": "予約時オンラインカード決済・現地払い",
      "roomNote": "シングルベッド2台、ソファベッド1台、TV、Wi-Fi、ケトル、冷蔵庫を完備、セーフティボックスを完備、布団不要の未就学児は2人まで。",
      "priceTotal": 21600,
      "pricePerNight": 21600,
      "pricePerPerson": 10800,
      "currency": "JPY",
      "pricesIncludeTax": true,
      "priceTotalExcludingTax": 19637,
      "pricePerNightExcludingTax": 19637,
      "isNonRefundable": false,
      "points": 196,
      "pointRate": 1,
      "roomsLeft": null
    }
  ],
  "currency": "JPY",
  "checkIn": "2026-11-05",
  "checkOut": "2026-11-06",
  "nights": 1,
  "adults": 2,
  "rooms": 1,
  "previousPriceTotal": null,
  "previousGuidePricePerNight": null,
  "priceChange": null,
  "priceChangePct": null,
  "previousScrapedAt": null,
  "scrapedAt": "2026-10-02T13:17:41.622Z"
}
```

**Tax fields.** `pricesIncludeTax` is true, on the row and on each plan, where the price is Rakuten's tax-included total. It's empty where a row has no price. `priceTotalExcludingTax` and `pricePerNightExcludingTax` 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.

**Undated rows.** An undated search has no stay total. There the pair is `guidePricePerNight` (with tax) and `guidePricePerNightExcludingTax` (without), and `pricesIncludeTax` describes `guidePricePerNight`. Both guide fields stay empty on a dated search, which has no guide price.

**Luxury badge.** `isPremium` is true on hotels with Rakuten's luxury badge, and `premiumTier` says which: `highest` (最高級宿) or `high` (高級宿). The "Luxury properties" filter returns exactly these hotels.

### How many hotels can you get, and how fast?

| Run | Results | Time |
|---|---|---|
| Kyoto, Osaka and Okinawa prefectures, 5 to 6 November, 2 adults, 150 per area | 450 hotels | 6 s |
| Kyoto prefecture, 5 to 6 November, 8 hotels | 8 hotels | 4 s |
| Kyoto city and Osaka (pasted URL), 17 to 19 November, 2 adults, cheapest first, rating 4 or better, 100 per area | 188 hotels, 167 with a priced plan, 57 filtered | |
| Kyoto city, 2 nights, rating 4 or better | 60 hotels, 52 priced, out of 977 the site reported with vacancy in the area | |
| Undated Osaka and Tokyo 23 wards by rating | 80 hotels, 79 with a guide price | |
| All 47 prefectures, 12 to 13 November, 60 hotels each | 2,820 hotels, every prefecture at 60 | 21.5 s |
| Kyoto and Osaka, rating 4.5 or better, 50 each | 100 hotels, every one rated 4.5 or more | |

The 47-prefecture run was measured on Apify on 3 October 2026 and works out at about 9,000 hotels a minute. At that rate a list of every hotel in Japan fits well inside one run. Where Rakuten lists a prefecture area by area (Tokyo, Hokkaido), the actor walks the areas for you, and every prefecture returns hotels.

Rakuten's pages hold 50 hotels and the per-area limit goes up to 5,000. A dated search checks real availability. An undated one returns guide prices.

### How much does it cost?

| Event | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| `actor-start`, per run | $0.002 | $0.002 | $0.002 | $0.002 |
| `destination-resolved`, per area | $0.002 | $0.002 | $0.002 | $0.002 |
| `property-listed`, per hotel returned | $0.0015 | $0.00135 | $0.0012 | $0.00105 |

Enterprise plans pay the Business price.

**$1.50 per 1,000 hotels** on the Free plan, $1.05 on Business, with the plans on each hotel included. That's the whole price: proxy usage and platform usage are in it. Hotels your filters remove are free, and so are unchanged hotels in an only-changes run.

- One area, 100 hotels: `0.002 + 0.002 + 100 × 0.0015 = $0.154` ($0.109 on Business)
- Five areas, 500 hotels: `0.002 + 5 × 0.002 + 500 × 0.0015 = $0.762` ($0.537 on Business)

The $5 of credits in Apify's Free plan each month is about 32 searches the size of the first example, or roughly 3,200 hotels, before you pay anything.

### Limitations

- You get at most three plans per hotel, because that's what Rakuten's search shows. [Rakuten Travel Room Rates Scraper](https://apify.com/boncross/rakuten-travel-room-rates) returns the full plan and room grid.
- There's no structured refundability flag. Plans named 返金不可 are non-refundable and the rest follow the hotel's policy.
- Names and texts are Japanese as the site prints them. Rakuten Travel publishes no English version of them.
- Coordinates aren't on the search page. The Room Rates actor returns them with its hotel details.
- Areas follow the site's tree of prefecture, area and optional sub-area. A station name isn't an area.
- On a dated search, a hotel with nothing bookable for your dates is still listed, with `priceTotal` empty (11 of 50 rows in one measured run).
- `image` is one thumbnail per hotel, and Rakuten supplies it for about the first 30 of each 50 hotels it lists. The rest have it empty.
- "Price, high to low" is Rakuten's ranking by each hotel's dearest plans. The cheapest price shown on each row isn't in strict descending order.
- There's no hotel class or official star rating on the search page. `rating` is the guest review score.
- Room types, room features (views, bath and toilet, room size), the nightly price filter and 10x points apply to dated searches. An undated search ignores them.
- The property type a hotel matched isn't printed on its card, and rows don't have it. Filter by it instead.

### FAQ

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

None of them. Proxy usage is included in the price and there's nothing to set up.

#### Why did my area return a list of area names?

The name didn't match one of Rakuten's areas for that prefecture, and the row lists the ones it has. Copy the Japanese name from that row into your input, after the prefecture: `"Kyoto 京都市"`. Station names won't match, because Rakuten's tree stops at areas and sub-areas.

#### Is the price for the whole stay, and is tax in it?

It's the total for your whole stay and party, tax included, with the per-night and per-person figures beside it. If you need the figure before consumption tax, read `priceTotalExcludingTax`.

#### When should I use an undated search?

When you want a survey and exact dates don't matter. It lists hotels with Rakuten's guide minimum price per night and doesn't check availability. For a price someone could actually book, give dates.

#### Why do some hotels have no price on a dated search?

Rakuten still lists a hotel that has nothing bookable for your dates. Those rows have `priceTotal` empty and no plans. Counting them against the priced ones is a quick read on how full an area is.

#### How do I get only the hotels whose price changed?

Give "Price memory store" a name, switch on "Only new or changed", and put the run on an Apify Schedule with "Check-in days ahead". From the second run you get only what moved, with the previous price and the change on each row.

#### Can I get every plan for a hotel, or its reviews?

Search stops at three plans. For the rest, pass the hotel numbers from this dataset to [Rakuten Travel Room Rates Scraper](https://apify.com/boncross/rakuten-travel-room-rates). Guest reviews with eight category scores come from [Rakuten Travel Reviews Scraper](https://apify.com/boncross/rakuten-travel-reviews).

#### 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 how you use the data.

### Schedules, the API and AI agents

A rolling price watch is the setup we'd suggest: an Apify Schedule, "Check-in days ahead" in place of fixed dates, and a price memory store. A webhook can fire when a run ends, and the hotels can go on to Google Sheets, Slack, Zapier, Make or Airbyte through Apify's integrations.

From code, `POST https://api.apify.com/v2/acts/boncross~rakuten-travel-search/run-sync-get-dataset-items` with the input JSON returns the hotels in one call for small runs. Use the asynchronous run endpoint for larger ones. There are `apify-client` packages on NPM and PyPI.

For an AI agent, add the Apify MCP server (`mcp.apify.com`) to Claude, Cursor, ChatGPT or another MCP client. The actor appears as a tool named `boncross/rakuten-travel-search`, and the agent can look up Japanese hotels for given dates.

### More from BonCross

- [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.
- [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

Is an area not resolving, or a price that doesn't match what 楽天トラベル shows? Open an issue on the Issues tab in Apify Console. We read every one and reply there.

# Changelog

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

# Actor input Schema

## `areas` (type: `array`):

Areas to search. A prefecture ("Kyoto", "京都府", "kyoto"), a prefecture plus one of Rakuten's areas ("Kyoto 天橋立", "京都 京都市", "kyoto/shi"), an object {"prefecture": "Kyoto", "area": "京都市"}, or a pasted search.travel.rakuten.co.jp / travel.rakuten.co.jp/yado URL. Unknown area names are reported with the list of areas Rakuten has for that prefecture.

## `maxResultsPerArea` (type: `integer`):

50 hotels per page; the actor stops when it has this many.

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

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

## `undated` (type: `boolean`):

Ignore dates and list every hotel in the area with Rakuten's guide minimum price (最安値の目安) instead of live availability. More hotels, no stay totals.

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

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

Rakuten's own orderings. Cheapest first follows the price on each row. Dearest first is Rakuten's own ranking by a hotel's highest-priced plans, so it brings the expensive hotels forward but does not follow the cheapest price shown on each row.

## `minReviewScore` (type: `number`):

Rakuten's guest rating. 4.0 and 4.5 use Rakuten's own rating filter, so the search is narrowed before any page is read; any other value is applied to the results the search returns.

## `minReviewCount` (type: `integer`):

Post-filter, free.

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

Dated searches only: drop plans cheaper than this for the whole stay.

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

Dated searches only: drop plans dearer than this for the whole stay.

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

Dated searches: keep only plans with breakfast (朝食あり).

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

Dated searches: keep only plans with dinner (夕食あり).

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

Drop plans whose name carries 返金不可 (non-refundable). Rakuten has no structured refundability flag; this is how the site itself marks them.

## `features` (type: `array`):

Feature labels as Rakuten prints them, all required: e.g. 大浴場, 露天風呂, 駐車場, 送迎サービス.

## `propertyTypes` (type: `array`):

Keep only these kinds of property, applied by Rakuten before any page is read. Any of the chosen types matches.

## `luxury` (type: `string`):

Keep only Rakuten's luxury selection: all of it, the top tier (最高級宿) or the high tier (高級宿). Rows carry isPremium.

## `facilities` (type: `array`):

Keep only properties with ALL of these, applied by Rakuten before any page is read. Room features (views, bath and toilet, room size) apply to dated searches only.

## `roomTypes` (type: `array`):

Dated searches: keep only properties with a room of one of these types available.

## `minPricePerNight` (type: `integer`):

Dated searches: Rakuten's own price filter, tax included, per room per night. Plans below it are not listed.

## `maxPricePerNight` (type: `integer`):

Dated searches: Rakuten's own price filter, tax included, per room per night. Plans above it are not listed.

## `tenTimesPointsOnly` (type: `boolean`):

Dated searches: keep only properties offering ten times the usual Rakuten points (ポイント10倍).

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

Name of a key-value store that remembers each hotel's lowest price per stay, so previousPrice / priceChange are filled on later runs.

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

With a price store: skip hotels whose price is unchanged since the last run.

## `extraParams` (type: `object`):

Advanced: any further Rakuten Travel search filter this form does not offer, as name and value pairs copied from a Rakuten Travel search link (e.g. {"f_setubi": "..."}).

## `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
{
  "areas": [
    "Kyoto",
    "Tokyo 東京２３区内"
  ],
  "maxResultsPerArea": 100,
  "maxItems": 0,
  "checkIn": "",
  "checkOut": "",
  "checkInDaysAhead": 30,
  "nights": 1,
  "undated": false,
  "adults": 2,
  "rooms": 1,
  "children": {},
  "sort": "recommended",
  "minReviewScore": 0,
  "minReviewCount": 0,
  "minTotalForStay": 0,
  "maxTotalForStay": 0,
  "breakfastOnly": false,
  "dinnerOnly": false,
  "refundableOnly": false,
  "features": [],
  "propertyTypes": [],
  "luxury": "",
  "facilities": [],
  "roomTypes": [],
  "minPricePerNight": 0,
  "maxPricePerNight": 0,
  "tenTimesPointsOnly": false,
  "priceStoreName": "",
  "onlyNewOrChanged": false,
  "extraParams": {},
  "delayMs": 0,
  "maxConcurrency": 16
}
```

# Actor output Schema

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

Rakuten Travel search results: 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 = {
    "areas": [
        "Kyoto",
        "Tokyo 東京２３区内"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("boncross/rakuten-travel-search").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 = { "areas": [
        "Kyoto",
        "Tokyo 東京２３区内",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("boncross/rakuten-travel-search").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 '{
  "areas": [
    "Kyoto",
    "Tokyo 東京２３区内"
  ]
}' |
apify call boncross/rakuten-travel-search --silent --output-dataset

```

## MCP server setup

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

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/1y5HvZpxZduQitJ2L/builds/hBT5XTNgKSqVhFxvl/openapi.json
