Rakuma Fril Japan Listings Scraper
Pricing
from $0.80 / 1,000 record scrapeds
Rakuma Fril Japan Listings Scraper
First full Rakuma (fril.jp) listings actor: keyword search plus item-detail enrichment (condition, seller, shipping payer, price-drop flag) unifying what three shallow single-purpose scripts do separately.
Pricing
from $0.80 / 1,000 record scrapeds
Rating
0.0
(0)
Developer
BowTiedRaccoon
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
12 hours
Issues response
16 days ago
Last modified
Categories
Share
Scrape listings from Rakuma (旧フリル / fril.jp) — Rakuten's C2C flea-market app, a top-3 Japanese resale surface behind Mercari. One schema unifies keyword search with item-detail enrichment (condition, seller, shipping payer, price-drop flag), replacing what three separate shallow single-purpose scripts do on Apify today.
What it does
- Searches Rakuma by keyword (Japanese search terms, e.g.
腕時計for watches) - Returns ~40 listings per search results page
- Follows every listing's detail page to enrich each record with condition, shipping payer, seller id/rating, and full category breadcrumb
- Paginates automatically until
maxItemsis reached - Sorts by price, recency or likes on Rakuma's side, so
maxItemstakes the top of the ordered list rather than a sample - Returns the seller's full item description with every record
Input
| Field | Type | Required | Description | Default |
|---|---|---|---|---|
query | string | Yes | Japanese search keyword (e.g. 腕時計) — free text, Rakuma's search accepts any term | 腕時計 |
maxItems | integer | Yes | Maximum number of listings to return | 10 |
sortBy | string | No | Result order, applied by Rakuma before maxItems is counted: relevance, price_asc, price_desc, newest, most_liked | relevance |
onSaleOnly | boolean | No | Leave sold listings out of the search before maxItems is counted | false |
listingOnly | boolean | No | Return only what the search results page shows, without opening each listing — see below | false |
requiredPhrase | string | No | Return only listings carrying this exact phrase — see below. Empty returns everything Rakuma matched | empty |
phraseScope | string | No | Where requiredPhrase must appear: title or title_or_description | title_or_description |
maxScanned | integer | No | Ceiling on how many search results are examined, matched or not. Empty means no ceiling | empty |
maxDetailRequests | integer | No | Ceiling on how many listings are opened to read their details. Empty lets maxItems decide | empty |
stopOnRestriction | boolean | No | End the run on the first access restriction instead of continuing — see below | false |
Output
Each record contains:
| Field | Description |
|---|---|
item_id | 32-hex item id from the item.fril.jp/<id> detail URL |
title | Listing title |
sub_name | Brand or variant sub-name line shown under the title (often blank) |
price_jpy | Listing price in Japanese yen |
item_status | on-sale or sold |
is_reduced | true if the listing shows a price-drop/reduction badge |
category_path | Breadcrumb category path, e.g. メンズ > 時計 > 腕時計(アナログ) |
condition | Item condition grade from the detail page (Japanese text, e.g. 目立った傷や汚れなし) |
seller_id | Seller shop/user slug from the detail page |
seller_rating | Percent positive seller reviews (good / (good+neutral+bad) * 100) |
shipping_payer | Shipping-cost label from the detail page (e.g. 送料込) |
description | Full item description as written by the seller, line breaks preserved |
item_url | Canonical item detail URL |
image_urls | Gallery image URLs from the item detail page |
posted_at | Listing post date, when exposed by the source (not present on most items — best-effort) |
region | Fixed JP |
Notes
- Both listing and detail records come back complete in one pass
- Sustains deep multi-page sweeps without thinning out partway through
- Sustained/deep crawling can trigger a rate-limit slide-puzzle challenge on Rakuma; a challenge page is detected and skipped rather than saved as a record. Set
stopOnRestrictionto end the run there instead posted_atis not exposed on the detail page for most listings (official-shop and many individual listings alike) — leftnullwhen absent rather than guessed
Getting the lowest-priced listings
Set sortBy: "price_asc" to have Rakuma order the whole result set by price before maxItems is counted. With maxItems: 10 the run returns the 10 lowest-priced results for the keyword, not 10 results sorted afterwards.
Rakuma keeps sold listings in its search results, and they sort alongside the ones still for sale. Add onSaleOnly: true to leave them out, so every slot goes to a listing you can still buy.
{"query": "腕時計","maxItems": 10,"sortBy": "price_asc","onSaleOnly": true}
With a sort other than relevance, the run follows exactly the first maxItems results in that order. If one of them is removed from Rakuma while the run is in progress, the run returns one record fewer instead of substituting a later-ranked listing. Records are written as each item page completes, so sort the dataset by price_jpy if you need it in strict order.
Requiring a phrase, so unrelated results don't fill your quota
Rakuma's own keyword search matches loosely — a search for one title routinely returns listings that share none of its words. Set requiredPhrase and only listings carrying that exact phrase are returned; the rest never count against maxItems.
{"query": "≠ME 排他的ファイター CD","maxItems": 20,"requiredPhrase": "排他的ファイター","phraseScope": "title_or_description","maxScanned": 200}
Matching ignores upper/lower case and full-width/half-width differences, so CD and CD are the same phrase.
phraseScope decides where the phrase has to appear:
title— judged from the search results page alone, so a listing whose title misses the phrase is never opened. Fastest.title_or_description(default) — each candidate is opened so the seller's description can be read too. A bundle that names the item only in its description still counts. Slower, because listings that turn out not to match are opened and then discarded.
maxScanned and maxDetailRequests bound that work independently of maxItems: maxScanned caps how many search results are looked at, maxDetailRequests caps how many are opened. Both are optional, and the run ends on whichever ceiling it reaches first — the run log names which one it was. A narrow phrase on a broad keyword is the case to set them for.
Discarded listings are not returned, so they are not billed as records.
Search results only
By default every listing is opened for its condition, seller, shipping payer and full description. Set listingOnly: true and the run returns just what the search results page itself shows, opening nothing:
{"query": "腕時計","maxItems": 500,"listingOnly": true}
Populated in this mode: item_id, title, sub_name, price_jpy, item_status, is_reduced, item_url, one thumbnail in image_urls, region.
Empty in this mode: condition, seller_id, seller_rating, shipping_payer, description, category_path, posted_at.
The record keeps the same shape either way, so a listing-only sweep and a later full run join on item_id with no reshaping. Measured on one page of 10: 1 request instead of 11, 3.8s instead of 19s.
requiredPhrase still works here, matched against the title — descriptions are only on the item page, which this mode does not open. The run log says so once when it narrows.
Billing is unchanged: the same per-run and per-record charges apply, so a listing-only row costs the same as an enriched one.
Stopping on the first access restriction
Set stopOnRestriction: true when you want a refusal from Rakuma to end the run. With it on:
- The run ends on the first HTTP 401, 403 or 429 from Rakuma, on a challenge or rate-limit page, and on any page that is neither the expected listing markup nor Rakuma's own "not found" page
- The request that met the restriction is not retried, and nothing queued behind it is requested
- Requests go out one at a time, and the run keeps the same network identity from start to finish — it never switches to another one after a refusal
- Records saved before the stop are kept and billed as usual; the run finishes
SUCCEEDEDwith the reason and the URL in its status message - A network error that never reached Rakuma is not a restriction; that request is tried again under the same identity
- A removed listing or a results page past the last one (Rakuma's 404) is not a restriction either
Resuming a large crawl
Every run accepts an optional resumeCursor input. If a previous run was stopped partway (manually, or by an Apify timeout), copy resumeCursor from that run's output into the next run's input to continue from where it left off — already-collected listings are not re-fetched or re-charged.
Example
Input:
{"query": "CD アルバム 初回限定盤","maxItems": 5,"sortBy": "price_asc","onSaleOnly": true}
Output (one record, gallery trimmed to its first image):
{"item_id": "e3167417524b1140ab452e17bc41b368","title": "JO1 鶴房汐恩 まとめ売り","sub_name": "JO1","price_jpy": 300,"item_status": "on-sale","is_reduced": false,"category_path": "JO1 > エンタメ/ホビー > タレントグッズ > アイドルグッズ","condition": "目立った傷や汚れなし","seller_id": "985169be93d175f2e4595f138d9c7edd","seller_rating": 100,"shipping_payer": "送料込","description": "1st ArenaTour KIZUNAトレカ 012\n\nJO1 JO1DER SHOW グッズ ラントレ トレカ セルカ 075 \n\n MIDNIGHT SUN 初回限定版B セルカ\n \nHandzInMyPocket FC盤 SHION盤 ソロジャケ \nCD(ケースにやや傷あり)\nステッカー 2枚\n\nhimp 通常盤 トレカ セルカ CD\nA盤 セルカ トレカ\n\nJO1 BEST ALBUM『BE CLASSIC』\nLAPOSTA 2025 タワレコオンライン 予約特典\nL判ハーフサイズ生写真 \n\nJO1 BE CLASSIC 初回限定盤B 鶴房汐恩 トレカ\n\n他JO1グッズ出品していますので、よろしければご覧下さい","item_url": "https://item.fril.jp/e3167417524b1140ab452e17bc41b368","image_urls": ["https://img.fril.jp/img/851783879/m/2943988013.jpg?1788701889"],"posted_at": null,"region": "JP"}