Rakuten Japan Products, Prices & Reviews Scraper avatar

Rakuten Japan Products, Prices & Reviews Scraper

Pricing

from $1.50 / 1,000 search products

Go to Apify Store
Rakuten Japan Products, Prices & Reviews Scraper

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

OrbitData Labs

Maintained by Community

Actor 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

InputWhat you get
searchQueriesKeyword search results, de-duplicated across keywords
searchUrlsAny Rakuten search or category URL, filters preserved
genreIdsA whole genre (category) listing
productUrlsSpecific 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.

EventPriceCharged when
search-product$0.0015A product found by search is stored
product-detail$0.0035A product's detail page is collected and stored
review$0.0015A review is stored
  • Search only → search-product per product.
  • Search + detail → both events for the same product, $0.0050 together.
  • Product URLs → product-detail only ($0.0035), no search charge.
  • Reviews → one review per stored review, on top of the product.
Example runCharge
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.0030
worst case charge: product-detail 2 x $0.0035 = $0.0070
worst case charge: review 4 x $0.0015 = $0.0060
worst 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

FieldTypeDefaultNotes
searchQueriesarrayKeywords, e.g. イヤホン.
searchUrlsarrayRakuten search/category URLs. Filters kept; a page number in the URL is ignored.
genreIdsarrayGenre IDs, e.g. 502835.
productUrlsarrayProduct pages to collect directly.
maxItemsinteger100Stop after this many unique products. Main cost control.
maxPagesPerQueryinteger5Depth per starting point; capped at 150.
includeDetailsbooleanfalseFetch each product's detail page (+$0.0035 each).
includeReviewsbooleanfalseCollect reviews (+$0.0015 each). Requires includeDetails.
maxReviewsPerProductinteger100Per product. Rakuten returns 30 reviews per request.
sortstringstandardprice_asc, price_desc, newest, review_count, review_average, total_price_asc, total_price_desc.
minPrice / maxPriceintegerPrice bounds in JPY.
includeSoldOutbooleanfalseRakuten hides sold-out products from search by default.
includeAdsbooleantrueKeep sponsored rows. false collects organic results only.
requestDelaySecsinteger2Below 1.5 is raised to 1.5.
maxConcurrencyinteger1Reserved; this version always runs sequentially.
proxyConfigurationobjectdisabledOptional; the Actor works from plain datacenter IPs.

Unusable URLs and keywords never stop a run — each becomes a failure record.

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, detailIncluded stays false, 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):

SettingValue
Concurrency1
Delay between requests1.6s (floor 1.5s)
Retries2, transient failures only
Backoff5s, then 15s
Browsernot used
Proxyoff 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 isSoldOut comes 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.
  • maxConcurrency above 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 network
python -m mypy src # strict
python tools/scan_sensitive.py # secret and personal-data scan
apify 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.