# Jalan.net Hotel Search Scraper (じゃらん) (`boncross/jalan-search`) Actor

Scrape Jalan (じゃらん) hotel search results for any area and your dates. Just add area names in English or Japanese and get cheapest plan total and per-person price, rating, review count, inline plans with rooms left, meals and prepaid flags, with Jalan's own facility filters. $1.50 per 1,000 hotels.

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

## Jalan.net Hotel Search Scraper (じゃらん)

### What is Jalan.net Hotel Search Scraper (じゃらん)?

Jalan.net (じゃらん) is one of Japan's largest domestic accommodation sites: business hotels, city hotels, ryokan and pensions across the country. Jalan.net Hotel Search Scraper gives you the properties Jalan lists for an area, priced for your dates and party, with the plans on each card and the hotel's address, coordinates and check-in times in the same row. Type `Kyoto / Kyoto Station` in English or Japanese and press Start.

Why it's worth your run:

- You can cover the country in seconds. 720 hotels across 12 areas (Shinjuku, Umeda, Sapporo, Naha, Hakone and more) took 6 seconds, all priced.
- Jalan does the narrowing. All 39 of its facility filters are here, with meal type and property type, and the site applies them before you pay for a row.
- A row is more than a price. You get up to 3 plans per hotel with the meal, points earned, prepaid flag and rooms left, plus coordinates and accepted card brands.
- A scheduled price watch returns only the hotels whose price moved. The unchanged ones aren't returned or charged.
- $1.50 per 1,000 hotels on the Free plan, $1.05 on Business, inline plans included. Proxy usage and platform usage are in that price.

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

- 43 of 43 live checks on its inputs and filters passed on 7 October 2026
- 6 destinations run the same day, 3 prefectures and 3 areas: 90 hotels, none empty
- Charges matched the rows

What you can do with it:

- Get the cheapest total and per-person price Jalan quotes for your dates, adults and rooms
- Read the plans shown on each card, with meals, points, prepaid flags and rooms left
- Search by prefecture, area or sub-area name, a Jalan area code or a Jalan search URL
- Set a price band, a minimum rating and a minimum review count
- Keep only the hotels in an area whose name, description or plans mention a keyword
- Sort by Jalan's recommendation, price or area
- Flag sponsored cards, or leave them out
- Search with no dates and see each hotel's lowest catalogue price

People run it to watch nightly rates across an area, to compare their own rates with the Japanese domestic market for the same dates, and to build supply datasets by area, type and price band. It also suits shortlisting properties for a client by facilities, meals or rating, tracking seasonal pricing in Kyoto, Niseko or Hakone, and watching who buys sponsored placement in an area.

### What hotel data do you get from Jalan?

| | |
|---|---|
| 🏨 Property name and Jalan number | 🔗 Property URL |
| 💴 Cheapest stay total, with a tax-included flag | Price per person |
| Plans on the card: title, room type and labels | 🍽️ Meal plan on each plan |
| Jalan points earned | Prepaid and online-card-only flags on each plan |
| Rooms left, as a number or the site's wording | ⭐ Guest rating out of 5 |
| Review count and highly rated aspects | 🗾 Prefecture and area |
| Catchphrase and description | 🚉 Access text |
| 📮 Postal address, postcode and city | 📍 Map coordinates (lat, lng) |
| 🕒 Check-in and check-out times | 💳 Card brands the hotel accepts |
| Kana reading of the name | Total number of plans the hotel sells |
| Labels and high-class flag | Sponsored flag |
| 🖼️ Property images | 📈 Previous price and price change |
| Property type (hotel, ryokan, pension, public lodging, villa) | Jalan's own property label (ホテル, 旅館, 民宿, ユースホステル, コンドミニアム…) |

### How to scrape Jalan.net search results

You don't need to read Japanese to run it, and there's nothing to code.

1. [Sign up for Apify](https://console.apify.com/sign-up), which is free, and open [Jalan.net Hotel Search Scraper](https://apify.com/boncross/jalan-search).
2. Add your destinations as `Prefecture` or `Prefecture / Area`. Jalan area codes and pasted Jalan search URLs work too.
3. Set your dates, adults, children and rooms.
4. Add filters or a sort if you want them, then click Start.
5. Download the hotels as Excel or CSV, or as JSON, XML or HTML.

### ⬇️ Input

Give it one or more destinations. Each can be a prefecture on its own (`Osaka`), a `Prefecture / Area` pair (`Tokyo / Shinjuku`, `京都府 / 祇園・東山・北白川周辺`), a Jalan area code or a Jalan search URL. A whole prefecture is expanded into its large areas for you. An area name needs its prefecture in front of it.

You have two limits. "Max hotels per destination" (default 100, up to 3,000) applies to each destination separately: ten destinations at 50 each returns 500. "Maximum results for the whole run" caps the total, and you aren't charged for anything past it.

**Dates and guests.** Set a check-in and check-out date (YYYY-MM-DD), or leave them empty and use "Check-in days ahead" (default 30) with "Nights" (1 to 9, default 1). "Adults per room" defaults to 2 and "Rooms" to 1. "Children ages" takes one age per child, 0 to 12. Jalan prices primary-school children and infants separately. Switch on "Date undecided" and you search with no dates at all: each hotel then shows its lowest catalogue price in place of dated availability.

**Filters and sorting.** Jalan applies the sort, the meal type, the facility filters (a hotel must have all the ones you pick) and the property types. "Min price per person" and "Max price per person" set a band in JPY per adult per night, and 0 means no limit. "Min rating", "Min review count", "High class only" (hotels Jalan labels ハイクラス) and "Exclude sponsored" drop hotels from your results at no charge.

**Keyword.** Keeps only the hotels whose own text contains each term you give: the name, description, access notes and the plans on the card.

**What each row includes.** "Include inline plans" is on by default and keeps the up to 3 plans shown on each result card, with plan title, room type, per-person and total price and rooms left. "Include hotel details" is on by default too. It adds map coordinates, check-in and check-out times, the kana name, accepted card brands and the total number of plans.

#### Search an area for fixed dates

```json
{
  "destinations": ["Kyoto / Kyoto Station"],
  "checkIn": "2026-11-07",
  "checkOut": "2026-11-08",
  "adults": 2,
  "maxResultsPerDestination": 60
}
```

#### A whole prefecture, cheapest first, with facilities

```json
{
  "destinations": ["Osaka", "Hokkaido / Niseko"],
  "checkInDaysAhead": 30,
  "nights": 1,
  "sort": "price_low_to_high",
  "facilities": ["nonSmoking", "onsen"],
  "maxResultsPerDestination": 150
}
```

#### Rated ryokan with dinner, in a price band

```json
{
  "destinations": ["Kyoto"],
  "checkInDaysAhead": 45,
  "nights": 1,
  "mealType": "both",
  "minRating": 4,
  "minReviewCount": 20,
  "maxPricePerPerson": 30000,
  "excludeSponsored": true
}
```

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

```json
{
  "destinations": ["Kyoto / Kyoto Station", "Tokyo / Shinjuku"],
  "checkInDaysAhead": 30,
  "nights": 1,
  "priceStoreName": "jalan-prices",
  "onlyNewOrChanged": true
}
```

#### For developers

- `maxResultsPerDestination` is the per-destination limit and `maxItems` the run-wide one. Nothing past `maxItems` is fetched or charged for. A row that reports a destination the actor couldn't resolve doesn't count toward it.
- When your filters keep few or none of the hotels, reading a destination 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 `maxResultsPerDestination` needs.
- `keyword` matches against the name, catchphrase, description, access notes, area, labels and inline plans of each hotel, and all terms must be present.
- `checkIn` and `checkOut` win over `checkInDaysAhead` and `nights` when both are given.
- `minPricePerPerson` and `maxPricePerPerson` are checked on each row against the hotel's listed price per adult per night.
- `priceStoreName` names the storage that remembers each hotel's lowest total per stay. It fills `previousPriceTotal`, `priceChange`, `priceChangePct` and `previousScrapedAt` on later runs. Add `onlyNewOrChanged` to skip the hotels that haven't moved.
- `maxConcurrency` (Parallel requests, default 16, 1 to 32) sets how many requests run at once. The default is the fastest level we measured clean, and a run that reports errors is the one reason to lower it.
- `delayMs` (default 0, up to 15000) adds a pause in milliseconds before each call. We'd leave it at 0.
- If the platform restarts a run part-way, it carries on where it stopped. Hotels already delivered aren't delivered or charged a second time.

### ⬆️ Output

You get one record per property and stay. Open the Output tab to see it as a table or as JSON.

```json
{
  "destination": "京都府 > 京都駅周辺",
  "prefectureCode": "260000",
  "areaCode": "260500",
  "subAreaCode": null,
  "checkIn": "2026-11-05",
  "checkOut": "2026-11-06",
  "nights": 1,
  "adults": 2,
  "rooms": 1,
  "id": "343998",
  "hotelId": 343998,
  "name": "京都センチュリーホテル",
  "url": "https://www.jalan.net/yad343998/",
  "area": "京都府 > 京都駅前",
  "prefecture": "京都府",
  "catchPhrase": "京都駅中央口から徒歩約2分！駅の喧騒を忘れさせる開放的な空間。",
  "description": "京都の交通の中心である京都駅から徒歩2分。各所にスムーズに足を運ぶ事ができます。\n著名な観光地はもちろん、ちょっと\"通\"な京都まで、ホテルスタッフへお気軽にお尋ねください。",
  "access": "JR京都駅中央口＜ニデック京都タワー側＞を出て右手方向にお進みください。京都駅ビルに沿って徒歩２分。",
  "address": "京都府京都市下京区東洞院通七条下ル東塩小路町６８０番地",
  "postcode": "600-8216",
  "city": "京都市下京区",
  "lat": 34.986065,
  "lng": 135.761775,
  "checkInFrom": "15:00",
  "checkOutUntil": "12:00",
  "nameKana": "きょうとせんちゅりーほてる",
  "creditCards": ["American Express", "DC", "Diners Club", "JCB", "Mastercard", "NICOS", "UC", "UFJ", "VISA"],
  "totalPlans": 282,
  "labels": [
    "ハイクラス",
    "フォトギャラリー"
  ],
  "isHighClass": true,
  "isSponsored": false,
  "rating": 4.5,
  "ratingScale": 5,
  "reviewCount": 5912,
  "highlyRated": [
    "朝食",
    "接客"
  ],
  "images": [
    "https://cdn.jalan.jp/jalan/images/pictL/Y8/Y343998/Y343998Ba6.jpg",
    "https://cdn.jalan.jp/jalan/images/pictM/Y8/Y343998/Y343998Be7.jpg"
  ],
  "priceTotal": 51000,
  "pricePerPerson": 25500,
  "priceText": "1泊 大人2名 合計(税込)",
  "currency": "JPY",
  "pricesIncludeTax": true,
  "planCount": 3,
  "plans": [
    {
      "title": "【スタンダードプラン】京都駅中央口から徒歩約2分でアクセス便利 -食事なし-",
      "planId": "01202441",
      "roomTypeId": "0335221",
      "roomType": "ツイン",
      "labels": [
        "ふるさと納税対象",
        "ポイント2%"
      ],
      "pricePerPerson": 28000,
      "priceTotal": 56000,
      "currency": "JPY",
      "pointsEarned": 1120,
      "isPrepaid": true,
      "isOnlineCardOnly": true,
      "roomsLeft": 2,
      "roomsLeftText": "あと2部屋",
      "meal": "none",
      "isBreakfastIncluded": false,
      "isDinnerIncluded": false,
      "url": "https://www.jalan.net/uw/uwp3200/uww3201init.do?adultNum=2&s…",
      "pricesIncludeTax": true
    }
  ],
  "previousPriceTotal": null,
  "priceChange": null,
  "priceChangePct": null,
  "previousScrapedAt": null,
  "scrapedAt": "2026-10-02T13:17:42.052Z"
}
```

A few columns to know before you build on them:

- Prices are Jalan's totals with tax for the party you asked for. `pricesIncludeTax` records the basis Jalan states for each price, on the row and on each plan. 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 isn't in Jalan's prices and has no amount on the site.
- `meal` on a plan is `none`, `breakfast`, `dinner` or `breakfast+dinner`, and the two include-flags follow it. Both are empty where Jalan says nothing about meals.
- `subAreaCode` fills when you paste a Jalan search link that names a sub-area. A destination given by name is searched at area level.

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

| Run | Results | Time |
|---|---|---|
| Kyoto Station area, 1 night, 2 adults, 8 hotels | 8 hotels, all priced | 5 s |
| Kyoto prefecture and Osaka / Umeda, 1 night, 2 adults, 60 each | 120 hotels, all priced | 9 s |
| 12 areas across Japan (Shinjuku, Umeda, Namba, Sapporo, Naha, Hakone, Hakata and more), cheapest first, 60 each | 720 hotels, all priced | 6 s |
| 16 areas across Japan, cheapest first, 100 each | 1,600 hotels, all priced | 12 to 26 s |

Jalan returns 30 hotels per page and reports the area total, which was 241 for the Kyoto Station area on that date. Stays are limited to 9 nights, Jalan's own maximum.

On large runs you can expect 2,500 to 8,000 hotels a minute, depending on how busy Jalan is. That's well inside the default one-hour run limit. When Jalan answers that it's too busy, the page is asked for again and your area isn't cut short.

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

| Event | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| `actor-start`, per run | $0.002 | $0.002 | $0.002 | $0.002 |
| `destination-resolved`, per destination name resolved to Jalan codes | $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, inline plans included. That's the whole price: proxy usage and platform usage are part of it. Hotels your filters drop 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)

Apify's Free plan comes with $5 of credits a month, which is about 32 searches of 100 hotels each. That's roughly 3,200 priced hotels before you pay anything.

### Price watches, the API and AI agents

For a rolling price watch, put the actor on an Apify Schedule with "Check-in days ahead" and a price store name. Each run then compares against the last one, and a webhook or the Slack and Google Sheets integrations can pass on the hotels that moved. Zapier, Make, Airbyte and GitHub connect the same way.

From your own code, `POST https://api.apify.com/v2/acts/boncross~jalan-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. The `apify-client` packages on NPM and PyPI wrap both.

An agent in Claude, Cursor or ChatGPT can look up hotels in a Japanese area for given dates: add the Apify MCP server (`mcp.apify.com`) and the actor appears as a tool named `boncross/jalan-search`.

### FAQ

#### Can I search in English?

You can type destinations in English or Japanese. The data itself is in Japanese, because Jalan publishes no English content: property names, plan titles and areas all arrive as the site writes them.

#### How do I write a destination?

As `Prefecture`, `Prefecture / Area`, a Jalan area code, or a Jalan search URL. A bare prefecture is expanded into its large areas. An area on its own, without its prefecture, isn't enough.

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

#### Are the prices tax-inclusive?

Jalan quotes totals with tax for the party you request, and each priced row and plan says so in `pricesIncludeTax`. You also get the per-person figure. A local accommodation tax or hot spring tax collected at the property is not included.

#### Which facilities can I filter on?

All 39 of Jalan's own facility filters: non-smoking, onsen, open-air bath, a private bath for hire, suites and detached rooms, pets, parking, ski and snowboard rental and the rest. Jalan applies them, and a hotel must have all the ones you choose.

#### Can I search only ryokan, or only hotels?

Set "Property types" to any of `hotel`, `ryokan`, `pension`, `publicLodging` and `villa`, which is Jalan's own classification. Results then arrive type by type in the order you list them. Whether or not you filter, each result has its type in `propertyType` and Jalan's finer label (民宿 or ユースホステル within pensions, for example) in `propertyTypeLabel`.

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

Give "Price store name" a name, switch on "Only new or changed", and schedule the run. From the second run on you get, and pay for, only the properties whose price moved.

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

The plans in a search row are the up to three Jalan shows on the card. For the full list of plans and rooms for a hotel and date, use [Jalan.net Room Rates Scraper](https://apify.com/boncross/jalan-room-rates). For クチコミ with six category scores, use [Jalan.net Reviews Scraper](https://apify.com/boncross/jalan-reviews).

#### What are the limits?

- `roomsLeft` is a number only when Jalan gives one. Otherwise its wording is in `roomsLeftText`.
- Sponsored cards are flagged, and removed only if you exclude them. A sponsored card's address is filled only when the same hotel is also listed on the page.
- Stays are limited to 9 nights, the site's maximum.
- The keyword filter looks at each hotel's own listing text. It isn't a site-wide search.
- Price bounds are per adult per night and are enforced on the results. A hotel with no listed price is dropped when you set a bound.
- A destination the actor can't resolve returns a row that says why.

#### 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 Room Rates Scraper (じゃらん)](https://apify.com/boncross/jalan-room-rates): Every plan and room Jalan (じゃらん) lists for a hotel on a date.
- [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

Is there a Jalan filter we haven't exposed, or a hotel whose price doesn't match what you see on じゃらん? Open an issue on the actor's Issues tab in Apify Console and tell us the area and dates. We read each report and answer it there.

# Changelog

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

# Actor input Schema

## `destinations` (type: `array`):

A prefecture on its own, or a `Prefecture / Area` pair, in English or Japanese (`Kyoto`, `Kyoto / Kyoto Station`, `京都府 / 祇園・東山・北白川周辺`, `Tokyo / Shinjuku`). Also Jalan area codes (`260000` prefecture, `260500` large area) or pasted jalan.net search URLs. An area name on its own (`Shinjuku`) is not enough: Jalan nests areas under prefectures, so name the prefecture too.

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

Keep only hotels whose own text carries every term you give: the name, catchphrase, description, access notes, area, labels and the plans on the card. Leave empty for the whole area.

## `maxResultsPerDestination` (type: `integer`):

Jalan returns 30 hotels per page.

## `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`):

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.

## `dateUndecided` (type: `boolean`):

Search without dates: Jalan then shows each hotel's lowest catalogue price instead of dated availability.

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

Jalan's own orderings.

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

Keep only hotels with a plan that includes this meal arrangement, as Jalan's own search filters them.

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

Per adult per night. Asked of Jalan and also enforced on the results, because Jalan honours only its own price bands.

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

Per adult per night, checked against each hotel's listed price. 0 = no limit.

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

Jalan's own facility filters (こだわり), applied by the site. Several combine: a hotel must have all of them.

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

Only these kinds of property, as Jalan classifies them (ホテル, 旅館, ペンション・民宿・ロッジ, 公共の宿, 貸別荘・コンドミニアム). Each result carries its type in `propertyType`. Leave empty for every kind.

## `minRating` (type: `number`):

Drop hotels rated below this (0–5, Jalan's 5-point クチコミ scale; hotels without a rating are dropped when set). Post-filter, free. Ratings are decimal, so 4.5 is a valid bound.

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

Post-filter, free.

## `highClassOnly` (type: `boolean`):

Keep only hotels Jalan labels ハイクラス.

## `excludeSponsored` (type: `boolean`):

Drop the PR (advertised) cards.

## `includePlans` (type: `boolean`):

Keep the up-to-3 plan rows Jalan shows on each result card (plan title, room type, per-person and total price, rooms left).

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

Add each hotel's map coordinates (lat, lng), check-in and check-out times, kana name, accepted card brands and total number of plans to its row.

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

Named key-value store remembering each hotel's lowest total per stay, so `previousPriceTotal` and `priceChange` are filled on later runs.

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

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

## `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
{
  "destinations": [
    "Kyoto / Kyoto Station"
  ],
  "keyword": "",
  "maxResultsPerDestination": 100,
  "maxItems": 0,
  "checkInDaysAhead": 30,
  "nights": 1,
  "adults": 2,
  "childrenAges": [],
  "rooms": 1,
  "dateUndecided": false,
  "sort": "recommended",
  "mealType": "any",
  "minPricePerPerson": 0,
  "maxPricePerPerson": 0,
  "facilities": [],
  "propertyTypes": [],
  "minRating": 0,
  "minReviewCount": 0,
  "highClassOnly": false,
  "excludeSponsored": false,
  "includePlans": true,
  "includeHotelDetails": true,
  "priceStoreName": "",
  "onlyNewOrChanged": false,
  "delayMs": 0,
  "maxConcurrency": 16
}
```

# Actor output Schema

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

Jalan.net Hotel Search 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 = {
    "destinations": [
        "Kyoto / Kyoto Station"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("boncross/jalan-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 = { "destinations": ["Kyoto / Kyoto Station"] }

# Run the Actor and wait for it to finish
run = client.actor("boncross/jalan-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 '{
  "destinations": [
    "Kyoto / Kyoto Station"
  ]
}' |
apify call boncross/jalan-search --silent --output-dataset

```

## MCP server setup

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