Rakuten - Products, Variants & Reviews avatar

Rakuten - Products, Variants & Reviews

Pricing

from $1.60 / 1,000 product results

Go to Apify Store
Rakuten - Products, Variants & Reviews

Rakuten - Products, Variants & Reviews

Scrape Rakuten Ichiba (rakuten.co.jp): name, JPY price, reference price and discount, Rakuten points, shipping, stock, shop, genre, tags, images, size/colour variants with per-variant price, specs, and customer reviews with star breakdown and shop replies. Search or paste URLs; incremental mode.

Pricing

from $1.60 / 1,000 product results

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

0

Bookmarked

10

Total users

4

Monthly active users

13 days ago

Last modified

Categories

Share

Rakuten Japan Scraper: Products, Variants & Reviews

Rakuten Japan Scraper turns Rakuten Ichiba (楽天市場, rakuten.co.jp), Japan's largest online marketplace of independent shops, into clean structured rows. Search by keyword (optionally narrowed with a tag), genre or shop code the same way Rakuten's own filters do, or paste any product, review, category, shop or search link you already have. Every product comes back with price, the reference ("was") price and discount, Rakuten points, shipping and delivery, stock, the selling shop's own details, category, tags, images, size and colour variants, full specifications and, on request, individual customer reviews with the star breakdown and shop replies. Export to JSON, CSV or Excel, or pull results straight into your app through the API.

Why This Scraper?

  • Three ways to find products, plus a keyword refinement. Keyword (optionally narrowed further with a tag), genre or shop code searches built with Rakuten's own filters, or paste any Rakuten Ichiba link you already have: search, category, shop, product or review.
  • One flat record per product, about 95 named fields. Price, points, shipping, stock, shop, taxonomy, media, specs and reviews all in a single row, plus the pieces that only exist per size/colour variant.
  • Marketplace aware. Every product carries the id, name, rating and review count of the independent shop that actually sells it, not just Rakuten's own catalogue metadata.
  • The reference ("was") price and discount, where Rakuten actually publishes them. Only the product page carries the strike-through price, never invented from a search result card.
  • Rakuten's own signals carried through untouched. Point multipliers, the Super DEAL flag and the 39-shop free-shipping marker travel with the price, not just a generic "on sale" flag.
  • Reviews on demand. The star histogram, individual review text, shop replies and Rakuten's own AI review summary, only fetched (and charged) when you turn them on.
  • Built for monitoring. Incremental mode returns only new and changed products on a recurring run, and a refused run fails loudly instead of quietly returning an empty dataset.

Use Cases

  • Price and stock monitoring: track a keyword search, or a keyword search restricted to one shop ID, daily and get only the products that actually changed.
  • Assortment and catalogue research: map genres, tags and per-shop search results with price tiers, size and colour variants.
  • Review mining: collect ratings, review text and shop replies to analyse customer sentiment per product or per shop.
  • Marketplace and competitor tracking: compare price, points and shipping terms across different shops selling similar products.

Data You Get

Sample shape: values are illustrative placeholders, not from a live record.

FieldExample
id"412233_10000482"
itemCode"10000482"
url"https://item.rakuten.co.jp/paletuft-zakka/mug-classic-01/"
name"パレタフト ハンドメイド陶器マグカップ 300ml 北欧デザイン"
brand"PALETUFT"
shopId"412233"
shopName"パレタフト雑貨店"
shopUrlCode"paletuft-zakka"
price2160
currency"JPY"
originalPrice2880
discountPercent25.0
pointCount21
shippingFee0
isFreeShippingtrue
availability"InStock"
genrePath["生活雑貨・キッチン用品", "食器", "マグカップ"]
tags[{"id": "9001234", "name": "北欧雑貨", "groupName": "スタイル"}]
variants[{"variantId": "77021", "options": ["ネイビー"], "price": 2160, "originalPrice": 2880}]
rating4.39
reviewCount96
isSponsoredfalse
sourceUrl"https://search.rakuten.co.jp/search/mall/mug/?s=2"

Turning on Fetch product details adds description, salesDescription, catchCopy, the full attributes specification table, shippingCarriers, customizationOptions and shop breadcrumbs. Turning on Fetch reviews adds the individual reviews[] array (each row carrying reviewId, rating, title, body, a public display author nickname, postedAt, verifiedPurchase, helpfulCount, the variantInfo purchased and the shop's public shopReply), the 1 to 5 star ratingBreakdown and Rakuten's own aiReviewSummary and aiReviewTopics. Turning on Incremental mode adds changeType (NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED), changedFields, firstSeenAt and lastSeenAt to every row; these four fields are absent entirely when incremental mode is off.

For drop-in compatibility with other Rakuten scrapers, every row also carries six alias fields that repeat existing values: imageUrl (= thumbnail), productName (= name), reviewScore (= rating), shippingPrice (= shippingFee), categories (= genrePath) and rankingPosition (= genreRank). They never count as a change in incremental mode.

How to Use

  1. Pick a mode: search (build a search from keywords, genres, tags or shop codes) or url (paste Rakuten links you already have).
  2. Fill in the fields for that mode, and switch on Fetch product details and/or Fetch reviews if you want the reference price, specs, variants or individual reviews.
  3. Set Max products to control run size and cost, then click Start.
  4. Download the dataset as JSON, CSV or Excel, or read it through the API.

Search by keyword with Rakuten's own filters:

{
"mode": "search",
"queries": ["コーヒー豆"],
"genreIds": ["100316"],
"minPrice": 1000,
"maxPrice": 5000,
"minRating": "4",
"condition": "new",
"sortBy": "price-asc",
"maxItems": 200
}

Paste links you already have (a search page and a category page):

{
"mode": "url",
"urls": [
"https://search.rakuten.co.jp/search/mall/coffee/?s=2",
"https://www.rakuten.co.jp/category/100316/"
],
"maxItems": 100
}

Search one shop by its numeric shop ID, with details and reviews:

{
"mode": "search",
"queries": ["coffee"],
"shopId": 193811,
"fetchDetails": true,
"fetchReviews": true,
"maxReviewsPerItem": 20,
"maxItems": 50
}

Daily monitoring of the same search:

{
"mode": "search",
"queries": ["コーヒー豆"],
"incrementalMode": true,
"stateKey": "coffee-daily-watch",
"maxItems": 0
}

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/rakuten-ichiba-scraper").call(
run_input={"mode": "search", "queries": ["コーヒー豆"], "maxItems": 50}
)
for product in client.dataset(run["defaultDatasetId"]).iterate_items():
print(product["name"], product["price"], product["shopName"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/rakuten-ichiba-scraper').call({
mode: 'search', queries: ['コーヒー豆'], maxItems: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.

How far a search reaches

Rakuten caps how deep any single search can be walked: the result pages report the reachable slice themselves (often a few hundred products for a broad keyword, even when millions match), and the walk stops there. To go wider, split the search: add genres, tags, price bands or shop codes. Result pages carry about 45 products each. Result pages can also include a handful of paid placements even on a sorted run, so a price-sorted page is not perfectly monotonic; those rows are marked isSponsored: true so you can filter or keep them deliberately.

The URLs field is pre-filled with one example of each shape below; running url mode with the field untouched scrapes all of them (capped by Max products). Clear it to run only your own links.

ShapeExampleResult
Keyword searchsearch.rakuten.co.jp/search/mall/coffee/?s=2Product rows, walked page by page
Keyword in a genre.../search/mall/coffee/100316/Product rows
Genre only, paged.../search/mall/-/100316/?p=2Product rows
Tag (facet).../search/mall/<keyword>/-/tg1011693/Product rows
Shop-restricted / filtered...?sid=193811, ?min=500&max=2000&review=4&used=0&s=5Product rows
Genre pagewww.rakuten.co.jp/category/100316/Product rows
Legacy shop search.../search/inshop/ajinomoto/Rakuten redirects this to a keyword search for the shop code, not a full catalogue
Product pageitem.rakuten.co.jp/ajinomoto/nb38/One product row
Review pagereview.rakuten.co.jp/item/1/193811_10001806/2.1/Reviews for that product
Shop storefrontwww.rakuten.co.jp/ajinomoto/Skipped with a warning (not a listing)

Shop codes in shopUrlCodes behave the same way as the legacy shop search: each code runs as a keyword search, so results are products that mention the code, not a guaranteed whole-shop catalogue. The field is still accepted; use shopId for a strict per-shop walk.

Resume and recurring updates

  • Resume (resumeFromRunId) continues one specific interrupted run: paste its run or dataset ID and this run walks the same search or URLs again from the start, skipping every product id that run already collected as it re-encounters it, so you don't pay twice. A page that turns out to be entirely already-collected does not stop the walk early; it keeps going to the same natural end (or cap) a fresh run would reach. The run also saves its own progress as it goes, so a platform migration or a Resurrect of that same run continues on its own, without re-collecting or re-charging anything already pushed.
  • Incremental mode (incrementalMode) is for recurring monitoring: schedule the same search or URLs daily and later runs return only what changed. Each product is classified NEW, UPDATED (with changedFields naming exactly what moved, for example price or pointCount), UNCHANGED (suppressed and not billed unless emitUnchanged is on), REAPPEARED, or EXPIRED. REAPPEARED only fires for a product whose stored state was previously marked gone, which itself only happens once a prior run was allowed to mark it EXPIRED. EXPIRED itself is produced only when Emit expired is on and this run's scan of the tracked search was complete: nothing capped by Max products, nothing cut short of its natural end by Max pages, Resume not used, at least one product actually scanned, and no page refused. A partial or capped run never tombstones a product that simply wasn't reached yet. With incremental mode off, every row is the plain base record, with no changeType, changedFields, firstSeenAt or lastSeenAt at all.

What incremental mode compares

Compared (a change makes the row UPDATED): price, original price, discount, points, stock and sale flags, title, shop, images, variants (including per-variant price and stock), shipping, tags, and the rating and review counts. Never compared (they never trigger UPDATED, but stay in the output): scrape time, search query, source URL, result position and page, delivery estimate, genre ranking, the site-wide Super Sale window, the AI review summary and topics, and the review texts themselves. Whole numbers compare equal whether stored as 25 or 25.0.

Changes view

The dataset has a Changes (incremental) view listing the change type, the changed fields and the first and last seen times next to the product name, price and link, so recurring runs are easy to scan.

Ignore fields when detecting changes (incremental mode only)

ignoreFieldsForChanges is a list of extra field names (for example pointCount) that must never count as a change. They stay in the output but do not trigger UPDATED and are not listed in changedFields. Names match at any depth, including inside variants. The saved state is re-compared with the current list, so changing it never causes a one-time wave of UPDATED rows.

Send results into your apps (MCP connectors)

Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.

What gets written to the connector: a condensed, human-readable summary of each product, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.

  1. Authorize a connector once under Apify, Settings, Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
  3. For Notion, also set notionParentPageUrl to the page where products should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

Input Parameters

ParameterTypeDefaultDescription
modestringsearchsearch builds a search from keywords, genres, tags or shop codes; url takes Rakuten links you already have.
queriesarray(none)Search keywords (search mode only). Japanese and English both work; each keyword runs its own paginated search. Prefill: ["コーヒー"].
genreIdsarray(none)Rakuten genre (category) IDs to browse, or to narrow a keyword search to. Prefill: empty.
tagIdsarray(none)Brand and specification facet tag IDs. Needs at least one keyword; ignored if a genre is also set, since Rakuten can't apply both at once. Prefill: empty.
shopUrlCodesarray(none)Shop codes, each run as a keyword search for that code (matches products mentioning it; not a guaranteed whole-shop catalogue, use shopId for a strict per-shop walk). Prefill: empty.
shopIdinteger(none)Restrict a keyword or genre search to one numeric shop ID.
sortBystringstandardSearch mode only, and has no effect on a shop-code walk. Result ordering applied by Rakuten itself: standard (relevance), price, price plus shipping, newest, most reviewed, or highest rated.
minPriceinteger(none)Minimum price in yen (search mode only).
maxPriceinteger(none)Maximum price in yen (search mode only).
minRatingstring(empty; any rating)Search mode only, and has no effect on a shop-code walk. Only return products rated at least this highly: 3.5, 4 or 4.5.
conditionstringanyNew only, used only, or any (search mode only).
urlsarray(none)Rakuten URLs to walk or fetch directly (url mode only). Default and prefill: one example per supported URL shape (search, genre, tag, paged, shop-restricted, filtered, legacy shop search, category, product, review, plus a storefront page that is skipped with a warning); clear it to run your own. Legacy /search/inshop/<shop>/ URLs are redirected by Rakuten to a keyword search for the shop code, not a full catalogue; storefront pages are not listings.
maxItemsinteger50Cap on products returned across every keyword, genre, shop and URL combined. 0 = unlimited.
maxPagesinteger(none)Optional bound on result pages per scope. Prefill: 0 (no page limit).
fetchDetailsbooleanfalseAdds description, specs, images, every size/colour variant and the reference ("was") price and discount percent. Charges the enrichment surcharge.
fetchReviewsbooleanfalseAdds individual reviews, the star breakdown and Rakuten's own AI review summary. Charges the same surcharge, once per product, whether or not Fetch product details is also on.
maxReviewsPerIteminteger20Reviews to return per product when Fetch reviews is on. Default lowered from 30 to 20. 0 or any value above 1000 is capped at 1000 reviews per product.
resumeFromRunIdstring(none)Continue one specific interrupted run; products it already collected are skipped.
incrementalModebooleanfalseReturn only new and changed products by default on a recurring run over the same search or URLs (reappeared and expired products need Emit expired too, plus a complete scan).
ignoreFieldsForChangesarray[]Field names that never count as a change in incremental mode (they stay in the output but never trigger UPDATED or appear in changedFields).
stateKeystring(none)Name or deliberately share an incremental-mode monitoring campaign.
emitUnchangedbooleanfalseAlso return (and bill) products that have not changed since the last run.
emitExpiredbooleanfalseAlso return (and bill) products no longer found, once a run has fully scanned the tracked search.
proxyobject{"useApifyProxy": true}Connection settings. The default group serves paid plans; on a free plan the run continues on a backup connection.
mcpConnectorsarray(none)Optional: send a summary of each product to apps you authorized under Integrations.
notionParentPageUrlstring(none)Notion connector only: page under which product pages are created.
maxNotifyListingsinteger50Cap on products written to each connector per run.

Output Example

Sample shape: values are illustrative placeholders, not from a live record.

{
"id": "412233_10000482",
"itemCode": "10000482",
"manageNumber": "mug-classic-01",
"url": "https://item.rakuten.co.jp/paletuft-zakka/mug-classic-01/",
"itemUrl": "https://item.rakuten.co.jp/paletuft-zakka/mug-classic-01/",
"name": "パレタフト ハンドメイド陶器マグカップ 300ml 北欧デザイン",
"subtitle": "ギフト箱入り 2色展開",
"catchCopy": "手になじむシンプルなマグカップ",
"brand": "PALETUFT",
"shopId": "412233",
"shopName": "パレタフト雑貨店",
"shopUrlCode": "paletuft-zakka",
"shopUrl": "https://www.rakuten.co.jp/paletuft-zakka/",
"shopRating": 4.6,
"shopReviewCount": 3820,
"shopIsExcellent": true,
"shopIs39": true,
"price": 2160,
"currency": "JPY",
"priceMin": 2160,
"priceMax": 2160,
"hasPriceRange": false,
"originalPrice": 2880,
"originalPriceLabel": "メーカー希望価格",
"discountPercent": 25.0,
"pointCount": 21,
"isSponsored": false,
"isSoldOut": false,
"availability": "InStock",
"shippingFee": 0,
"isFreeShipping": true,
"genreId": "300258",
"genrePath": ["生活雑貨・キッチン用品", "食器", "マグカップ"],
"tags": [{ "id": "9001234", "name": "北欧雑貨", "groupId": "1000900", "groupName": "スタイル" }],
"variants": [
{ "variantId": "77021", "options": ["ネイビー"], "price": 2160, "originalPrice": 2880, "pointCount": 21 },
{ "variantId": "77022", "options": ["アイボリー"], "price": 2160, "originalPrice": 2880, "pointCount": 21 }
],
"hasMultipleVariants": true,
"description": "手になじむ丸みのあるフォルムのマグカップです。ギフト箱にお入れしてお届けします。",
"attributes": [{ "name": "素材", "value": "陶器" }, { "name": "容量", "value": "300 ml" }],
"images": ["https://tshop.r10s.jp/paletuft-zakka/cabinet/mug-classic-01/main.jpg"],
"imageCount": 1,
"rating": 4.39,
"reviewCount": 96,
"ratingBreakdown": [
{ "stars": 5, "count": 58 }, { "stars": 4, "count": 24 }, { "stars": 3, "count": 9 },
{ "stars": 2, "count": 3 }, { "stars": 1, "count": 2 }
],
"aiReviewSummary": "使いやすいサイズ感とデザインが好評です。",
"reviews": [
{
"reviewId": "a1b2c3d4-e5f6-4789-a0b1-c2d3e4f5a6b7",
"rating": 5,
"title": "とても気に入りました",
"body": "軽くて持ちやすく、毎日のコーヒーに使っています。",
"author": "コーヒー好きさん",
"postedAt": "2026/06/14",
"verifiedPurchase": true,
"helpfulCount": 4,
"variantInfo": "ネイビー",
"shopReply": "ご購入ありがとうございます。",
"images": []
}
],
"reviewsReturned": 1,
"detailFetched": true,
"reviewsFetched": true,
"scrapedAt": "2026-09-15T03:00:00+00:00",
"sourceUrl": "https://search.rakuten.co.jp/search/mall/mug/?s=2",
"resultPage": 1,
"resultPosition": 3
}

Plan Requirement

A datacenter connection is enough for Rakuten; no residential proxy is needed. On paid plans the default Apify proxy group serves it. The free plan has no Apify proxy, so on a free plan the run says so and continues on a backup connection:

  • Notice: "The selected connection is unavailable to this run. Apify free plans do not include residential proxies. Continuing on a backup connection; some pages may still be unavailable."
  • Notice: "Served over the backup connection (the default connection was unavailable)."
  • Failure, account has no proxy access: "The proxy connection was refused for this account, so no page could be read. Your Apify plan does not include proxy access; a paid plan is required." If you entered your own proxy URLs, check their credentials.
  • Failure, backup also failed: "No results: residential proxies are unavailable on this run ... and the backup connection could not load the requested Rakuten pages." Upgrade your plan or supply your own proxy URLs.
  • Failure, pages failed to load: "Could not load any results page (the requests failed), so nothing was collected. This is a connection problem, not an empty search."

Each page gets a 25 second budget (retries included); a page that cannot be read in that time is counted as failed. The run moves to a backup connection only when a connection is refused for your account. For large or frequent runs, the residential proxy group gives more headroom; pick it under Proxy & connection.

FAQ

How much does it cost?

You pay per product returned, plus a once-per-product surcharge when Fetch product details and/or Fetch reviews are on (a product enriched with both is still charged only once, not twice). A pasted product or review link's own page is read and included at no surcharge either way; only the other half (detail or reviews) is charged if its toggle is on. The Pricing tab shows the current rates. Use Max products to cap the cost of any run.

This actor collects only publicly available product and review data. You are responsible for how you use it: follow Rakuten's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Product names, prices and specifications are generally facts, but images, descriptions and shop-authored text may be subject to third-party rights.

Can I get only new or changed products on a schedule?

Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new and updated products by default, and unchanged ones are not billed. Turn on Emit expired too, once a run scans the whole scope end to end, to also get expired products and, on a later run, reappeared ones.

Does this cover Rakuten in other countries?

No. This actor covers rakuten.co.jp (Rakuten Ichiba, Japan) only. Rakuten's other country sites, including the cash-back and coupon portal at rakuten.com and the separate marketplaces in France and Taiwan, are different platforms with their own catalogues, currencies and URL grammar, not a mode of this actor.

Why did my run fail instead of returning an empty dataset?

If a run returns nothing and some pages could not be read, the run stops with a clear message so "nothing matched" is never confused with "nothing could be read". Run it again in a few minutes, or select a different proxy group (see Plan Requirement for the exact messages). A genuinely empty search where every page was actually read still finishes successfully with zero rows.

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 Travel Scraper
Scrape Rakuten Travel, Japan's largest domestic hotel-booking site, by prefecture...
👗 ZOZOTOWN
Scrape ZOZOTOWN (zozo.jp), Japan's largest fashion marketplace: name, brand, JPY price...
🧩 Isetan Mitsukoshi
Scrape the Isetan Mitsukoshi department store online shop (mistore.jp). Search by keyword...
🛒 Nitori Japan Furniture & Home Goods Scraper
Scrape Nitori Japan (nitori-net.jp) furniture and home goods by keyword, category or...
🛒 Mercari Japan Scraper
Scrape Mercari Japan listings, sellers and reviews at scale. Extract names, prices...
🧩 Suumo.jp Scraper
Scrape Suumo, Japan's largest property portal: rental rooms with rent, management fees...

👉 Browse all abotapi scrapers

💬 Support

  • 🐞 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 contact@abotapi.com.
  • ⭐ Enjoying it? A quick review on the actor page helps other users find it.