Rakuten Travel Scraper at a glance
Rakuten Travel Scraper is a ready-to-run Apify actor from abotapi for collecting web data. Its documented output includes id, hotel no, rowtype, url and hotel, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.80 per 1,000 results on the Apify Free plan and from $1.20 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Web data
- Pricing
- $1.80 per 1,000 results (Free plan), from $1.20 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 33 options
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.
What Rakuten Travel Scraper: Japan Hotels, Rates & Reviews can do
- Around 40 fields per hotel. From the listing card through full detail and review pages
- Two modes, many ways in. 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
- Sorts and filters. 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
- Built for schedules. Resume and incremental modes for daily scheduled monitoring of the same scope, returning only what changed
- All 47 prefectures. Covers all 47 prefectures of the site's own area tree, with the declared result totals respected page by page
Choose what to collect
These inputs let you configure Rakuten Travel Scraper: Japan Hotels, Rates & Reviews. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | How to start the scrape. 'search' walks the site's own area listing pages for the prefectures you list, and runs the keyword searches you list. 'url' processes the Rakuten Travel URLs you paste: a hotel URL is fetched as a single hotel; an area, keyword-results or day-use listing URL is browsed like a search, its own path deciding the scope. |
locationsarray | One or more Japanese prefecture names or romaji spellings, for example '東京', '大阪', 'okinawa', '北海道'. Each word is matched against the 47 prefectures of the site's own area listing tree, and every matching prefecture is walked independently. Search mode ONLY: in URL mode the pasted URL decides its own scope. Sub-areas of a prefecture (for example a city page) can be scoped by pasting their URL in URL mode. |
keywordsarray | One or more search words, for example '新宿 ホテル' or '温泉 箱根'. Each keyword runs the site's own keyword search and follows the results pages the site's own pager declares (about 30 hotels per page). Search mode ONLY: in URL mode the pasted URLs decide their own scope. The keyword pages are served in the site's legacy text encoding, which the actor handles for you. |
urlsarray | Rakuten Travel URLs to process. A hotel URL (travel.rakuten.co.jp/HOTEL/...) or a plan-page URL (hotel.travel.rakuten.co.jp/hotelinfo/plan/...) returns one hotel. An area listing URL (/yado/... or search.travel.rakuten.co.jp/ds/yado/...), a keyword-results URL (kw.travel.rakuten.co.jp/keyword/Search.do) or a day-use prefecture URL (/dayuse/tokyo/) is paginated like a search, its own path deciding the scope. The day-use landing page (/dayuse/) is expanded into its prefecture listings, read in site order until Max items is reached. A URL that starts past page 1 (p2, f_next=2, index2.html) is a partial scope. URL mode only. |
sortBystring | The site's own server-side ordering of each prefecture walk: recommended (the site default), price low to high, price high to low, or review score high to low. Search mode ONLY and area walks only: in URL mode the pasted URL decides its own scope, and keyword results come in the site's own order. For reordering this run's collected rows after the read, use the ordering field under Output and limits. |
minPriceYeninteger | Only keep listing rows whose lowest rate is at least this many Japanese yen. Narrows listing rows in BOTH search mode and URL mode; a pasted hotel URL always returns its hotel. |
maxPriceYeninteger | Only keep listing rows whose lowest rate is at most this many Japanese yen. Narrows listing rows in BOTH search mode and URL mode; a pasted hotel URL always returns its hotel. |
Show 26 more inputs
| Input | What it controls |
|---|---|
minRatingstring | Only keep listing rows whose guest review score is at least this value, for example 4.0. Rows whose score the listing page does not show are dropped while this filter is set. Narrows listing rows in BOTH search mode and URL mode; a pasted hotel URL always returns its hotel. |
sortResultsBystring | Arranges the rows this run collected, after they are read, including pasted hotels. This is a local tidy up of one run's output, not a catalogue wide ordering. Applies in BOTH search mode and URL mode. |
fetchDetailsboolean | Read each hotel's own detail page for the complete record: address, phone, fax, access, check-in and check-out times, parking, room count, facilities, room amenities, credit cards, meal options, cancellation policies, description and photos. Leave it on for the full record; turn it off for cheap listing rows only (name, rating, review count, lowest price, catch copy, access, thumbnail). Turning it on adds the Hotel detail enrichment charge per hotel actually read this run. |
fetchReviewsboolean | Read each hotel's review page as well: the review summary (overall score, per-category averages, star histogram) and review text. The amount is controlled by Max reviews per hotel. Billed through the same Hotel detail enrichment event, per started block of 10 review rows returned; a review read that returns no review rows adds no charge. |
maxReviewsinteger | Maximum review rows to return for each hotel when Fetch reviews is on. The default is 20. Set 0 for all available reviews, up to 10,000 per hotel. One Hotel detail enrichment event is charged for each hotel whose own hotel page was read, and it covers the first started block of 10 review rows returned; each further started block of 10 review rows adds one more event (25 reviews bill 3 events for that hotel). With full hotel details off, only the started blocks of 10 returned review rows are charged. |
maxItemsinteger | The single cap on this run: stop after collecting this many records across all prefectures, keywords and URLs. Set 0 for unlimited. |
maxPagesinteger | Safety bound on how many listing pages to walk per prefecture, keyword or pasted area URL. Each page serves about 30 hotels. 0 means no page limit from this field: the run then stops at Max items, when the site's own pager runs out, or at the built-in hard cap of 10000 pages per source. |
checkInDatestring | Single stay date, YYYY-MM-DD (Japan time). When any of Check-in date, Start date, End date or Months ahead is set, each hotel row also carries rates[]: one entry per room and plan with prices, coupons, points, remaining rooms and cancellation steps. Needs Fetch full hotel details on. Leave empty for no rates. |
startDatestring | First check-in date of a range, YYYY-MM-DD. Empty with End date or Months ahead set means today (Japan time). |
endDatestring | Last check-in date of the range, YYYY-MM-DD. Empty means Start date plus Months ahead (or just the start date). |
monthsAheadinteger | Scan this many months of check-in dates from the start date (0 = off). Capped at 62 dates per hotel. |
nightsinteger | Length of stay per scanned check-in date. |
adultsinteger | Adults per room for the rate query. |
childreninteger | Children counted in the elementary-school upper band. Overridden by Child counts. |
childCountsobject | Object with any of elementaryUpper, elementaryLower, preschoolMealAndBedding, preschoolMealOnly, preschoolBeddingOnly, preschoolNeither. Overrides Children. |
roomsinteger | Rooms for the rate query. |
includeSoldOutboolean | Keep an entry for plans with no vacancy on a scanned date. Off by default: only bookable room and plan entries are returned. |
resumeFromRunIdstring | Paste a previous run ID or dataset ID to continue a large crawl without returning or charging for records already collected there. Use this after an interrupted or capped run. For recurring monitoring of the same search, use Incremental mode below instead. |
incrementalModeboolean | Turn this on for daily or weekly recurring monitoring of the same scope, for example a prefecture price watch. The first run returns everything matching as NEW. Later runs normally return only NEW, UPDATED and REAPPEARED records. A hotel counts as changed when any output field other than the bookkeeping ones moves (compared: name, rating, review count, prices, catchcopy, access, plans, reviews and detail fields; excluded by default at any depth: scrapedAt, detailCarriedForward, position, searchSource, capturedAt, leadTimeDays, ratesDatesScanned, sourceUrl). Rate and score moves ARE reported as UPDATED: on a booking site the rate is the signal, not noise. Use Ignore fields below to exclude more. Turn on Emit unchanged or Emit expired only when you also want those rows returned (and billed). State is kept separately per prefecture, keyword, URL and filter setup; use State key to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above. |
stateKeystring | Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently configured runs. Leave empty to let the actor derive a key automatically from the prefectures, keywords, URLs and filters, so two different scopes never mix state. |
emitUnchangedboolean | Off by default. Turn on to also return records that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you specifically want a full snapshot every run. |
emitExpiredboolean | Off by default. Turn on to also return records that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked scope: not when Max items capped it, not when Resume was used, and not when the run was refused. This returns, and bills, extra synthetic rows, so leave it off unless you need expiry tracking. |
ignoreFieldsForChangesarray | Optional. Field names that must not count as a change, matched at any depth (so plans and reviews entries too), for example ratingValue or reviewCount. Ignored fields stay in the output; they only stop triggering UPDATED and stop being listed in changedFields. Always ignored already, at any depth: scrapedAt, detailCarriedForward, position, searchSource, capturedAt, leadTimeDays, ratesDatesScanned, sourceUrl. Changing this list never re-reports unchanged hotels. |
mcpConnectorsarray | Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify, Settings, API & Integrations, then select it here. Notion gets a page per record; other connectors get a best-effort write or digest. Each connector receives a condensed summary per record, not the full record; the complete record always stays in the dataset. Leave empty to skip; this never changes the dataset output. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com). |
notionParentPageUrlstring | URL or id of the Notion page under which record pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on records written to each connector per run. Does not affect the dataset. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
recordIdID (text)hotelNoHotel No (text)rowTyperowTypeurlURL (link)nameHotel (text)thumbnailUrlImage (image)ratingValueRating (number)reviewCountReviews (number)minPriceYenLowest rate (JPY) (number)minPriceTaxIncludedYenLowest rate incl. tax (JPY) (number)catchcopyCatch copy (text)accessAccess (text)Show 56 more fields
positionPosition (number)searchSourceSource (text)areaMiddleArea (text)areaSmallareaSmalladdressAddress (text)phoneNumberPhone (text)faxNumberfaxNumbercheckInTimeCheck-in (text)checkOutTimeCheck-out (text)parkingparkingtotalRoomsRooms (number)facilitiesFacilities (array)roomAmenitiesroomAmenitiescreditCardscreditCardsmealsmealsprivilegesprivilegescancellationPolicyCancellation policy (text)planCancellationPolicyplanCancellationPolicydescriptionDescription (text)photoUrlsPhotos (array)ratingSummaryReview summary (text)reviewsTotalReviews total (number)reviewsReviews (array)plansplanschangeTypeChange type (incremental mode) (text)changedFieldsChanged fields (incremental mode) (array)firstSeenAtFirst seen (incremental mode) (date)lastSeenAtLast seen (incremental mode) (date)scrapedAtscrapedAtrates.roomNameroomNamerates.roomCategoryroomCategoryrates.planNameplanNamerates.mealPlanmealPlanrates.checkInDatecheckInDaterates.availabilityavailabilityrates.remainingRoomCountremainingRoomCountrates.basePricebasePricerates.sellingPricesellingPricerates.discountRatediscountRaterates.couponNamescouponNamesrates.pointAmountpointAmountrates.netPriceAfterPointsnetPriceAfterPointsreviewIdreviewIdtitletitlecommentcommentpostedAtpostedAtnicknamenicknamescorescorestayDatestayDatetravelPurposetravelPurposeplanNameplanNameroomNameroomNamehelpfulVoteshelpfulVotesplans.namenameplans.pricePerPersonYenpricePerPersonYenplans.urlurl (link)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"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"
}Ways to use this data
- 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.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does Rakuten Travel Scraper return?
The documented output for Rakuten Travel Scraper includes id, hotel no, rowtype, url, hotel, image, rating and reviews. Availability of each field depends on the source page and the selected mode.
How much does Rakuten Travel Scraper cost?
It costs $1.80 per 1,000 results on the Apify Free plan and from $1.20 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
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.
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.
