Jalan.net Room Rates Scraper (じゃらん) avatar

Jalan.net Room Rates Scraper (じゃらん)

Pricing

from $2.10 / 1,000 hotel-priceds

Go to Apify Store
Jalan.net Room Rates Scraper (じゃらん)

Jalan.net Room Rates Scraper (じゃらん)

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.

Pricing

from $2.10 / 1,000 hotel-priceds

Rating

0.0

(0)

Developer

BonCross API

BonCross API

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

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 URLPlan title, plan code and labels
🛏️ Room name, room code and room typeRoom labels
💴 Stay total, with a tax-included flagPrice per person per night
🍽️ Meal plan, with breakfast and dinner flagsJalan 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 staysCancellation 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 countAvailability and sold-out flags
📈 Previous price and price changePlan description

How much does it cost to price a Jalan hotel?

EventFree planStarterScaleBusiness
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.
  2. Open Jalan.net Room Rates Scraper.
  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 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

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

Several hotels, refundable plans with breakfast

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

Two stays for the same hotels

{
"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

{
"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.

{
"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": "3ベッド◆ファミリールーム◆<禁煙>",
"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):

FieldWhat it holds
freeCancellationUntilThe last date the plan can be cancelled free; null when Jalan gives no date
isFreeCancellationtrue 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
cancellationPolicyThe fee ladder as Jalan words it, a list of {when, charge}; null when there is none
isDepositRequiredtrue when the plan asks for a deposit; null when not stated
planCheckInFrom / planCheckInUntil / planCheckOutUntilCheck-in and check-out times set by the plan itself; null when it sets none
salePeriodThe plan's sale window as {from, until}; null when not stated
pointRatePercentThe points rate the plan earns, in percent
priceNoteThe 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?

RunResultsTime
1 hotel, 1 night, 2 adults, 5 plans5 rate rows4 s
3 hotels across 3 stays (two 1-night, one 2-night), 2 adults363 rate rows over 9 hotel-stays5 s
12 Kyoto hotels across the same 3 stays, 2 adults1,435 rows over 36 hotel-stays, 1,434 priced, 1 sold-out row5 s
100 hotels across Japan × 3 stays, 5 plans each1,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.

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

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.