Rakuten Travel Scraper: Japan Hotels, Rates & Reviews
Pricing
from $1.20 / 1,000 hotel records
Rakuten Travel Scraper: Japan Hotels, Rates & Reviews
Scrape Rakuten Travel, Japan's largest domestic hotel-booking site, by prefecture, keyword or URL. Every row carries name, rating, review count, lowest price and access, with optional details: address, phone, facilities, policies, photos and reviews. No API key needed.
Pricing
from $1.20 / 1,000 hotel records
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
1
Bookmarked
1
Total users
1
Monthly active users
15 days ago
Last modified
Categories
Share
Scrape Rakuten Travel (travel.rakuten.co.jp), Japan's largest domestic hotel-booking site, into clean structured rows. Search by prefecture, run the site's own keyword search, or paste hotel, area, keyword-results or day-use listing URLs you already have. Every row carries name, rating, review count, lowest price, catch copy and access, and can be enriched from the hotel's own pages: address, phone, check-in times, facilities, credit cards, cancellation policies, photos, the review summary and individual review texts.
Built for price monitoring, market research, inventory tracking and review mining across all 47 prefectures. No API key, no application registration, no account needed: the actor reads the site's own public pages directly.
Why This Scraper?
- Around 40 fields per hotel, from the listing card through full detail and review pages
- Two modes, three ways to start: search mode runs a prefecture walk and/or a keyword search together, url mode processes any pasted hotel, area, keyword-results or day-use listing URL
- The site's own server-side price and review sorts, plus client-side price bounds and a minimum rating filter
- Review mining: overall score, per-category averages (room, service, location, meals, bath), star histogram and review texts
- Resume and incremental modes for daily scheduled monitoring of the same scope, returning only what changed
- Covers all 47 prefectures of the site's own area tree, with the declared result totals respected page by page
- Bilingual input: Japanese prefecture names (東京, 北海道) and romaji (tokyo, hokkaido) both work
Use Cases
- Revenue managers and OTAs: watch a prefecture's or a hotel group's own lowest rates on a schedule and react to competitor price moves the same day.
- Travel bloggers and itinerary apps: pull hotel names, ratings, catch copy and access details for a region or a keyword search into your own site or app.
- Hospitality market research: compare a property's price and review score against every other hotel in the same prefecture or search result.
- Review and reputation analysis: collect review text, per-category scores and the star histogram to track guest sentiment over time.
- Data science and ML datasets: build labeled datasets of Japanese domestic lodging prices, ratings and facilities for forecasting or recommendation models.
Data You Get
Sample shape: values are illustrative placeholders, not from a live hotel.
| Field | Example value |
|---|---|
hotelNo | 0000000 |
name | Sample Seaside Hotel |
url | https://travel.rakuten.co.jp/HOTEL/0000000/0000000.html |
ratingValue | 4.2 |
reviewCount | 1200 |
minPriceYen | 8000 |
minPriceTaxIncludedYen | 8800 |
catchcopy | A sample one line catch copy from the listing card |
access | Sample station: 5 min on foot |
thumbnailUrl | https://trvimg.r10s.jp/share/image_up/0000000/sample.jpg |
address | 〒000-0000 Sample prefecture Sample city 1-2-3 |
phoneNumber | 000-000-0000 |
checkInTime | 15:00〜19:00 |
checkOutTime | 10:00 |
parking | Available, 50 cars |
facilities | ["Restaurant", "Large bath", "Non-smoking rooms"] |
cancellationPolicy | Cancellation terms as printed on the page |
description | Full property description text when details are on |
ratingSummary | {"overallScore": 4.2, "reviewCount": 1200, "categoryAverages": {"ROOM": 4.1}} |
reviews | [{"title": "Sample review title", "comment": "Sample review text", "score": 5}] |
reviewsTotal | 1200 |
changeType | NEW (incremental mode only) |
changedFields | ["minPriceYen"] (incremental mode only, on UPDATED rows) |
Every row also carries recordId, rowType (always hotel), its position
in the source page, plansUrl and plans (inline plan boxes from keyword
and day-use results), searchSource, sub-area names (areaMiddle /
areaSmall), faxNumber, totalRooms, roomAmenities, creditCards,
meals, privileges, planCancellationPolicy, photoUrls, scrapedAt,
and, in incremental mode, firstSeenAt / lastSeenAt plus a
detailCarriedForward flag when a detail field was repaired from a prior
run's snapshot instead of freshly read this run.
How to Use
- Pick a mode:
searchwalks the prefectures and runs the keyword searches you list;urlprocesses the hotel, area, keyword-results or day-use links you paste. - Add price and rating filters if you want narrower rows; they apply in both modes.
- Turn Fetch full hotel details and Fetch reviews on or off, and set Max items to control run size and cost.
- Click Start, then download the dataset as JSON, CSV or Excel, or read it through the API.
Search one prefecture, with full details (default):
{"mode": "search","locations": ["東京"],"maxItems": 20}
Prefecture walk with the site's own price sort, keyword searches and price bounds:
{"mode": "search","locations": ["大阪", "kyoto"],"keywords": ["温泉 箱根"],"sortBy": "price_low","minPriceYen": 6000,"maxPriceYen": 25000,"minRating": "3.5","maxItems": 60}
Paste hotel URLs for exact fetches (reviews included):
{"mode": "url","urls": ["https://travel.rakuten.co.jp/HOTEL/0000000/0000000.html","https://travel.rakuten.co.jp/HOTEL/0000001/0000001.html"],"fetchReviews": true,"maxItems": 10}
Daily price watch of one prefecture (incremental mode returns only changes after the first run):
{"mode": "search","locations": ["沖縄"],"maxItems": 0,"incrementalMode": true,"stateKey": "okinawa-watch"}
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/rakuten-travel-scraper").call(run_input={"mode": "search", "locations": ["東京"], "maxItems": 20,})for hotel in client.dataset(run["defaultDatasetId"]).iterate_items():print(hotel["name"], hotel["minPriceYen"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/rakuten-travel-scraper').call({mode: 'search', locations: ['東京'], maxItems: 20,});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
How maxItems and maxPages shape a run
maxItems is the single cap on the whole run, split evenly across every
prefecture, keyword and pasted URL you list. maxPages additionally bounds
how many listing pages each source walks (each page serves about 30 hotels);
leave it at 0 to let a source stop only at maxItems or the site's own
end of results. Cards a source reads but does not keep, because the price
or rating filters excluded them or the per-source budget was already spent,
are still counted as scanned internally, so a later scheduled run's
incremental EXPIRED check is never fooled into thinking a hotel that simply
missed this run's cap or filters has disappeared from the site.
Resume and recurring updates
- Resume (
resumeFromRunId) continues one interrupted or capped run: paste its run or dataset ID and the actor skips every hotel that run already collected, so you don't pay twice. - Incremental mode (
incrementalMode) is for scheduled runs over the same scope. Each hotel is classifiedNEW,UPDATED(withchangedFields, a price or rating move counts as a change),UNCHANGED(suppressed and not billed unlessemitUnchangedis on),REAPPEAREDorEXPIRED(only after a run that scanned the whole scope end to end, and only withemitExpired).stateKeynames or shares the stored state. With incremental mode off, output is exactly as before.
Tip: run overlapping searches as separate runs. Each source (a prefecture, a keyword, or a pasted area, keyword-results or day-use URL) treats a page as a restarted list and ends its walk when, after an earlier page of that same walk already brought new hotels, a later page brings back only hotels this run already has. That includes hotels an earlier source in the same run collected, and hotels the run you resume from collected. So if one run combines sources whose hotel lists overlap (for example a prefecture together with a keyword that matches hotels in that same prefecture, or two adjacent prefectures that list the same property), a later source can stop before the site's own pager ends and silently skip the pages after it, even when those pages hold hotels nothing else collected. A resumed run can hit the same stop if the site reordered its list since the original run. The run still finishes successfully. The incremental EXPIRED check refuses to run after a stop like this, so no hotel is wrongly marked gone. The skipped hotels are simply not returned that run. To avoid this, run searches you expect to overlap as separate actor runs.
Send results into your apps (MCP connectors)
Optionally pipe this actor's results into the apps you already use with MCP
connectors: authorize one under Apify, Settings, API & Integrations, then
select it in the mcpConnectors input and set notionParentPageUrl for
Notion. Each connector receives a condensed summary per record (a title plus
key fields flattened to text, maxNotifyListings per run), not the full
record; the complete record always stays in the Apify dataset. Leave the
inputs empty and nothing changes: the export never runs and the dataset
output is identical.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | select | search | search walks prefecture area pages and keyword results; url processes pasted URLs. |
locations | array | ["東京"] | Prefecture words (Japanese or romaji) matched against the site's 47-prefecture area tree. Search mode only. |
keywords | array | [] | Keyword searches run on the site's own search, following the site's own results pager (about 30 hotels per page). Search mode only. |
urls | array | sample | Hotel URLs (one hotel each), or area /yado/, /ds/yado/, keyword-results and day-use listing URLs (walked like a search). URL mode only. |
sortBy | select | recommended | The site's server-side order of each prefecture walk: recommended, price low/high, review score. Search mode, area walks only. |
minPriceYen | integer | - | Keep rows at or above this price in yen. Both modes. |
maxPriceYen | integer | - | Keep rows at or below this price in yen. Both modes. |
minRating | string | - | Keep rows whose review score is at least this (for example 4.0). Both modes. |
sortResultsBy | select | site_order | Reorder this run's collected rows after the read. Both modes. |
fetchDetails | boolean | true | Read each hotel's own page for address, phone, check-in times, facilities, policies and photos. Adds the per-hotel detail enrichment charge. |
fetchReviews | boolean | false | Also read the review page: summary, per-category averages and review text. Covered by the same enrichment charge. |
maxReviews | integer | 20 | Maximum review rows per hotel when fetchReviews is on. 0 = all available reviews. The enrichment event is charged once for each started block of 10 returned review rows. |
maxItems | integer | 20 | The single output cap across all sources. 0 = unlimited. |
maxPages | integer | 0 | Safety bound on listing pages per source. 0 = no page limit. |
resumeFromRunId | string | - | Continue one interrupted run: skip records that run already collected. |
incrementalMode | boolean | false | Scheduled monitoring: return only NEW, UPDATED and REAPPEARED records against the previous run of the same scope. |
stateKey | string | - | Optional name for an incremental monitoring campaign. |
emitUnchanged | boolean | false | Also return UNCHANGED rows (billed). |
emitExpired | boolean | false | Also return EXPIRED rows after a complete scan (billed). |
mcpConnectors | array | (none) | Optional MCP connector IDs for the condensed result export. |
notionParentPageUrl | string | - | Optional Notion parent page URL for the MCP export. |
maxNotifyListings | integer | 50 | Maximum condensed records sent to MCP connectors per run. |
proxy | object | Apify Proxy | The default standard Apify proxy serves every page this actor reads. |
Output Example
Sample shape: values are illustrative placeholders, not from a live hotel.
{"recordId": "0000000","hotelNo": "0000000","rowType": "hotel","url": "https://travel.rakuten.co.jp/HOTEL/0000000/0000000.html","name": "Sample Seaside Hotel","ratingValue": 4.2,"reviewCount": 1200,"minPriceYen": 8000,"minPriceTaxIncludedYen": 8800,"catchcopy": "A sample one line catch copy from the listing card","access": "Sample station: 5 min on foot","thumbnailUrl": "https://trvimg.r10s.jp/share/image_up/0000000/sample.jpg","position": 3,"searchSource": "東京","address": "〒000-0000 Sample prefecture Sample city 1-2-3","phoneNumber": "000-000-0000","faxNumber": "000-000-0001","checkInTime": "15:00〜19:00","checkOutTime": "10:00","parking": "Available, 50 cars","totalRooms": 120,"facilities": ["Restaurant", "Large bath", "Non-smoking rooms"],"roomAmenities": ["TV", "Refrigerator", "Hair dryer"],"creditCards": ["VISA", "Master Card"],"meals": ["[Breakfast] Restaurant"],"cancellationPolicy": "Sample cancellation terms from the hotel page","description": "Sample full property description.","photoUrls": ["https://trvimg.r10s.jp/share/image_up/0000000/sample.jpg"],"ratingSummary": {"overallScore": 4.2,"reviewCount": 1200,"categoryAverages": {"ROOM": 4.1, "BREAKFAST": 4.3},"starHistogram": {"FIVE": 500, "FOUR": 400}},"reviews": [{"reviewId": "000000","title": "Sample review title","comment": "Sample review text.","postedAt": "2026-01-01T00:00:00Z","score": 5,"nickname": "SampleNick","stayDate": "2026-01-01","planName": "Sample plan name"}],"reviewsTotal": 1200,"scrapedAt": "2026-01-01T00:00:00Z","changeType": "NEW","changedFields": [],"firstSeenAt": "2026-01-01T00:00:00Z","lastSeenAt": "2026-01-01T00:00:00Z"}
Plan Requirement
The default Apify Proxy setting works out of the box: it was probed live and serves every page this actor reads, with a fallback connection tier engaged only after repeated failures on the primary lane. Per-event pricing (actor start, hotel record, hotel detail enrichment) is shown on the actor's Pricing tab before a run.
- Prices are the site's publicly displayed lowest rates for its default availability window, in Japanese yen; a rate move between scheduled runs classifies as UPDATED in incremental mode.
- Keyword searches and prefecture area walks each follow the site's own results pager, about 30 hotels per page.
- The keyword results page is served in the site's own legacy Japanese text encoding; the actor encodes your keywords and decodes the page for you.
- A run needs no account and no API registration on any surface it reads.
FAQ
How much does it cost?
You pay per hotel record returned, plus a separate detail enrichment charge only when a hotel's own pages were actually read (details, and reviews in blocks of 10). The Pricing tab shows the current rates. Use Max items to cap the cost of any run.
Is it legal to scrape Rakuten Travel?
This actor collects only publicly available hotel and pricing data. You are responsible for how you use it: follow Rakuten Travel's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Hotel names, prices and availability are generally facts, but photos and guest review text may be subject to third-party rights.
Can I get only new or changed hotels on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Later runs then return only NEW, UPDATED and REAPPEARED hotels; unchanged ones are suppressed and not billed unless you turn on Emit unchanged. A price or review score move is reported as UPDATED, since on a booking site the rate is the signal being watched, not noise.
What's the difference between Resume and Incremental mode?
Resume (resumeFromRunId) continues ONE specific interrupted or capped
run: paste its run or dataset ID and this run skips every hotel that run
already collected, so you never pay twice for the same page. Incremental
mode is for scheduling the SAME search again and again (daily, weekly)
and getting back only what changed since the last scheduled run. Use Resume
to finish a single large crawl; use Incremental mode for ongoing
monitoring.
Why did my run return fewer hotels than I expected?
Three reasons cover almost every case. Max items or Max listing
pages capped the run before the site's own pager ran out (raise them, or
set Max items to 0 for the full scope). The price or rating filters
narrowed the rows this run kept. Or, if this run combined several
prefectures, keywords or pasted URLs whose hotel lists overlap, one of those
sources may have ended its own walk early: after bringing new hotels, it
reached a page made up only of hotels another source had already collected,
and it skipped the pages after it (see the tip under How to Use). Running
overlapping searches as separate runs avoids this.
Why did my run fail instead of returning an empty dataset?
If every source this run started was refused or could not be read, the run stops with a clear message so "no hotels matched" is never confused with "nothing could be read". Run it again in a few minutes, or check the Connection setting. If some sources served pages while others were refused, the run still succeeds quietly and the status message names the refused count.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.
🔗 Want more Rakuten data?
Pair this actor with these related scrapers from the same team:
| 🧩 Rakuten Scrape Rakuten Ichiba (rakuten.co.jp): name, JPY price, reference price and discount... | 🏨 Yanolja Scraper Scrape Yanolja (NOL), Korea's largest accommodations marketplace, by region or URL. Every... |
| 🏨 Trip.com Hotels, Rooms & Reviews Scraper Pull structured hotel listings from trip.com with prices, room types, amenities... | 🏨 Wego Scraper Scrape Wego hotels by city or search URL. Get rates, providers, booking links... |
| 🏨 Klook Scraper Scrape Klook activities, tours, attractions and travel experiences from search pages or... | 🏨 LoopNet From $1.2/1K. Scrape LoopNet across the US including office, retail, industrial... |
💬 Support & custom scrapers
- 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- 🛠️ Need another site, extra fields or a private build? Email abotapi@proton.me or message Telegram @abotapi.
- ⭐ Enjoying it? A quick review on the actor page helps other users find it.