Rakuten Japan Products, Prices & Reviews Scraper
Pricing
from $1.50 / 1,000 search products
Rakuten Japan Products, Prices & Reviews Scraper
Search Rakuten Japan (Rakuten Ichiba) and collect products with prices, SKU options, stock, shop and rating data - plus customer reviews when you want them. No browser and no API key needed. Detail and review collection are optional, and you pay per result (pay-per-event).
Pricing
from $1.50 / 1,000 search products
Rating
0.0
(0)
Developer
OrbitData Labs
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
Search Rakuten Ichiba (楽天市場) by keyword, search URL or genre — or hand it product URLs directly — and get back clean, flat rows: product name, price, reference price, stock, SKU options, shop, rating, shipping, Rakuten points and search rank, plus customer reviews when you ask for them. It runs over plain HTTP with no browser and no API key, and you pay per result.
What you can collect
| Input | What you get |
|---|---|
searchQueries | Keyword search results, de-duplicated across keywords |
searchUrls | Any Rakuten search or category URL, filters preserved |
genreIds | A whole genre (category) listing |
productUrls | Specific product pages, no search needed |
All four can be combined in one run. Products are de-duplicated globally on
shopId + itemId, and every place a product was found is kept in foundIn.
Quick start
Search only — the cheapest mode:
{"searchQueries": ["イヤホン"],"maxItems": 100}
Search, then enrich each product with its detail page:
{"searchQueries": ["ワイヤレスイヤホン"],"maxItems": 50,"includeDetails": true}
Search → detail → reviews:
{"searchQueries": ["イヤホン"],"maxItems": 20,"includeDetails": true,"includeReviews": true,"maxReviewsPerProduct": 30}
A search URL you already have, cheapest under ¥5,000, newest first:
{"searchUrls": ["https://search.rakuten.co.jp/search/mall/イヤホン/"],"maxPrice": 5000,"sort": "newest","maxItems": 100}
Specific products, no search:
{"productUrls": ["https://item.rakuten.co.jp/jblstore/wave-beam2/"],"includeReviews": true,"maxReviewsPerProduct": 50}
Output
One dataset holds four record types, told apart by type. The Console shows
four ready-made views: Products, Reviews, Failures and
Run statistics. Views pick which columns to show, so filter on type when
you export if you want one type per file.
product
{"type": "product","detailIncluded": true,"itemId": 10000198,"shopId": 398768,"manageNumber": "wave-beam2","shopUrlCode": "jblstore","shopName": "JBL・AKG公式ストア","url": "https://item.rakuten.co.jp/jblstore/wave-beam2/","shopUrl": "https://www.rakuten.co.jp/jblstore/","name": "\楽天1位/【公式限定】JBL ワイヤレスイヤホン WAVE BEAM 2 …","currency": "JPY","price": 8030,"referencePrice": 8030,"referencePriceLabel": "当店通常価格","taxIncluded": true,"taxRate": 0.1,"isSoldOut": false,"isPurchasable": true,"stockQuantity": 332,"freeShipping": true,"shippingPrice": 0,"points": 1460,"pointRate": 20,"pointCampaignStart": "2026-08-24T11:00:00.000Z","pointCampaignEnd": "2026-08-27T00:59:59.000Z","reviewCount": 526,"reviewAverage": 4.39,"brand": "JBL","genreId": 502835,"categoryPath": ["TV・オーディオ・カメラ", "オーディオ", "ヘッドホン・イヤホン"],"variantSelectors": [{ "label": "カラー", "values": ["ブラック", "ホワイト", "ブルー", "ピンク"] }],"skus": [{"variantId": "JBLWBEAM2PIK","selectorValues": ["ピンク"],"price": 8030,"points": 1606,"stockQuantity": 71,"articleNumber": "4968929222629","freeShipping": true}],"images": ["https://thumbnail.image.rakuten.co.jp/…"],"hasVariants": true,"isAd": true,"searchQuery": "イヤホン","searchRank": 12,"searchPage": 1,"searchPosition": 17,"sourceSearchUrl": "https://search.rakuten.co.jp/search/mall/…","foundIn": [{ "searchQuery": "イヤホン", "searchRank": 12, "searchPage": 1, "searchPosition": 17,"sourceSearchUrl": "https://search.rakuten.co.jp/search/mall/…", "isAd": true }],"scrapedAt": "2026-08-31T08:18:11Z"}
Without includeDetails, the same record arrives with detailIncluded: false
and without the detail-only fields (skus, stockQuantity, taxRate,
referencePriceLabel, pointCampaign*, brand, variantSelectors).
review
{"type": "review","reviewId": "7nrx-i9awf-fxgqwu_1","itemId": 10000198,"shopId": 398768,"rating": 5,"title": null,"body": "…","postDate": "2025/11/30","orderDate": "2025/11/25","purchasedOption": "カラー:ホワイト","helpfulCount": 0,"reviewUrl": "https://review.rakuten.co.jp/item/1/398768_10000198/1.1/","page": 1,"scrapedAt": "2026-08-31T08:19:24Z"}
title is null on the many Rakuten reviews that have no title — it is never
invented from the review body.
failure and run-stats
{"type": "failure","url": "https://example.com/not-a-rakuten-url/","stage": "input","reason": "invalid_product_url","detail": "unsupported product url","scrapedAt": "2026-08-31T07:42:54Z"}
stage is input, search, product or review. One run-stats row closes
every run with request counts, stored counts, partial successes and the amount
charged; the same numbers go to the RUN_STATS key-value record.
Pricing
You pay per stored result. There is no charge for starting a run.
| Event | Price | Charged when |
|---|---|---|
search-product | $0.0015 | A product found by search is stored |
product-detail | $0.0035 | A product's detail page is collected and stored |
review | $0.0015 | A review is stored |
- Search only →
search-productper product. - Search + detail → both events for the same product, $0.0050 together.
- Product URLs →
product-detailonly ($0.0035), no search charge. - Reviews → one
reviewper stored review, on top of the product.
| Example run | Charge |
|---|---|
| 100 products, search only | $0.15 |
| 100 products, with detail | $0.50 |
| 100 products, detail + 10 reviews each | $2.00 |
| 1,000 products, search only | $1.50 |
| 1,000 products, with detail | $5.00 |
| 1,000 product URLs, detail only | $3.50 |
| 10,000 reviews | $15.00 |
You are never charged for failure records, a product whose detail request
failed (you pay search-product only), duplicates found under several keywords,
duplicate reviews, empty review pages, searches that return nothing, retries, the
run-stats row, or sponsored rows you excluded.
Every run logs its worst case before doing any work, and what it actually charged at the end:
worst case charge: search-product 2 x $0.0015 = $0.0030worst case charge: product-detail 2 x $0.0035 = $0.0070worst case charge: review 4 x $0.0015 = $0.0060worst case total: $0.0160...charged total: $0.0160
To cap a run, set Apify's maximum total charge on it. The Actor honours it,
stops storing chargeable results at the limit and reports budgetExhausted.
Input reference
| Field | Type | Default | Notes |
|---|---|---|---|
searchQueries | array | — | Keywords, e.g. イヤホン. |
searchUrls | array | — | Rakuten search/category URLs. Filters kept; a page number in the URL is ignored. |
genreIds | array | — | Genre IDs, e.g. 502835. |
productUrls | array | — | Product pages to collect directly. |
maxItems | integer | 100 | Stop after this many unique products. Main cost control. |
maxPagesPerQuery | integer | 5 | Depth per starting point; capped at 150. |
includeDetails | boolean | false | Fetch each product's detail page (+$0.0035 each). |
includeReviews | boolean | false | Collect reviews (+$0.0015 each). Requires includeDetails. |
maxReviewsPerProduct | integer | 100 | Per product. Rakuten returns 30 reviews per request. |
sort | string | standard | price_asc, price_desc, newest, review_count, review_average, total_price_asc, total_price_desc. |
minPrice / maxPrice | integer | — | Price bounds in JPY. |
includeSoldOut | boolean | false | Rakuten hides sold-out products from search by default. |
includeAds | boolean | true | Keep sponsored rows. false collects organic results only. |
requestDelaySecs | integer | 2 | Below 1.5 is raised to 1.5. |
maxConcurrency | integer | 1 | Reserved; this version always runs sequentially. |
proxyConfiguration | object | disabled | Optional; the Actor works from plain datacenter IPs. |
Unusable URLs and keywords never stop a run — each becomes a failure record.
Sponsored products
Rakuten shows up to five sponsored rows per search page. They are kept by
default and flagged isAd: true, because that is what a shopper sees. A
product that is also an organic result keeps its organic searchRank. Set
includeAds: false to drop rows that appear only as ads — they then use
neither your maxItems budget nor any charge.
Failures and partial success
Problems are isolated per product, so a run keeps everything it did collect:
- a product whose detail request failed is still stored with its search data,
detailIncludedstaysfalse, and its reviews are not requested; - a product whose reviews failed is still stored with its detail data;
- a failing search page ends that keyword's paging only; other keywords continue.
Each is counted in partialSuccesses.
Privacy
- Only public product and review pages are read. The Actor never logs in and never touches private or account data.
- Reviewer identity is not collected: no nickname, age band, sex, reviewer ranking or reviewer-uploaded photos. Rating, review text, dates, purchased option and helpful count are collected.
- Values missing from the page are reported as
null— never guessed. - You are responsible for using the collected data in line with applicable law and Rakuten's terms. This is not legal advice.
- This Actor is an independent tool and is not affiliated with, endorsed by, or operated by Rakuten. "Rakuten" and "楽天市場" are used only to describe the public data source.
Request behaviour
Defaults follow what was measured against Rakuten (200 sequential requests from one datacenter IP produced no blocks):
| Setting | Value |
|---|---|
| Concurrency | 1 |
| Delay between requests | 1.6s (floor 1.5s) |
| Retries | 2, transient failures only |
| Backoff | 5s, then 15s |
| Browser | not used |
| Proxy | off by default |
An HTTP 200 carrying an Akamai stub is treated as a block, not a success, and is retried. 404s, unexpected page formats and empty-but-valid pages are never retried. If the embedded page data changes shape, the run records a structured failure and logs it — it never reports a silent zero-result.
Not supported in this version
- The Rakuten Web Service API mode (bring-your-own application ID)
- Whole-shop crawling and ranking pages
- Comparing every seller's price for one product
- Price history
- Anything requiring a login, a browser or CAPTCHA solving
Known limitations
- Sold-out detection on detail pages is not verified against a live sold-out
item; that fixture is derived. The search field
isSoldOutcomes straight from Rakuten and is reliable. - Legacy non-SKU detail pages were not found while sampling; that path is covered by a derived fixture only.
maxConcurrencyabove 1 is not implemented — only concurrency 1 was validated.- Sustained volume beyond 200 requests has not been measured.
- Rakuten serves at most 6,750 results (150 pages) per search; deeper paging is not possible, and the Actor stops rather than looping.
Reporting a problem
Please include: the run ID, the input you used, the failure rows from the
dataset, and the RUN_STATS record. Never paste cookies, tokens or account
credentials.
Development
python -m pytest tests -q # fixture-based tests, no networkpython -m mypy src # strictpython tools/scan_sensitive.py # secret and personal-data scanapify run # local run - no PPE pricing, so nothing is charged
To exercise the billing code locally without creating a real charge, run with Apify's test flag and the committed prices:
ACTOR_TEST_PAY_PER_EVENT=true \APIFY_ACTOR_PRICING_INFO="$(python -c 'import json;d=json.load(open(".actor/pricing.json"));d.pop("_comment",None);print(json.dumps(d))')" \APIFY_CHARGED_ACTOR_EVENT_COUNTS='{"search-product":0,"product-detail":0,"review":0}' \apify run
Charges then go to storage/datasets/charging-log/ instead of being billed.
.actor/pricing.json is the configuration to enter in the Apify Console;
tests/unit/test_pricing_config.py keeps it in step with the code.
Fixtures under tests/fixtures/ are captured from real public responses and
sanitised — see tests/fixtures/PROVENANCE.md. Tests, fixtures, tooling and the
phase-1 probe stay in the repository but are excluded from the Actor upload by
.actorignore.