Mercari Japan Scraper — Listings & Sold Prices
Pricing
from $5.00 / 1,000 listing scrapeds
Mercari Japan Scraper — Listings & Sold Prices
Scrape Mercari Japan listings and sold prices by keyword or jp.mercari.com URL. Returns JPY price, status, seller, photos, timestamps, plus optional median sold-comp stats. HTTP-only and MCP-ready. $0.005/listing, $0.02/sold-comp report.
Pricing
from $5.00 / 1,000 listing scrapeds
Rating
0.0
(0)
Developer
Khadin Akbar
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
3 days ago
Last modified
Categories
Share
Mercari Japan listings and sold prices
Scrape public Mercari Japan (jp.mercari.com) listings and sold prices into one dataset. Pass a keyword or a search/item URL and get JPY price, status (on_sale / sold_out / trading), condition, seller, photos, timestamps, and optional median sold-comp stats. Built for Japan resale sourcing, brand price tracking, and AI agents that need structured comps without a Mercari login.
Use this Actor when you need Mercari Japan sold prices or live listings as structured JSON. For Mercari US or Buyee, start with a US Mercari or Buyee-specific Actor.
Best fit for this Actor
- You need sold prices (status
sold_out) to set a buy/sell band on Japan C2C. - You need live listings for a keyword, category search URL, or a single item URL.
- You want one MCP-ready tool that returns flat JSON plus a terminal
OUTPUT.outcome. - For US Mercari, Yahoo Auctions via Buyee, or eBay, use a different Actor in this portfolio.
Use case: Japan resale comps for a Switch accessory
A reseller is about to source nintendo switch stock from Japan. They run this Actor with status: "sold_out", maxItems: 30, and includeSoldStats: true. Each listing row has priceJpy, daysToSell, and itemUrl. The extra marketStats row gives median / IQR JPY and typical days-to-sell. They skip lots priced above the 75th percentile and keep the item URLs in the buying sheet.
Quick start input
{"keywords": ["nintendo switch"],"status": "sold_out","maxItems": 3,"includeSoldStats": true}
maxItems caps listing rows. A sold-comp report is an extra row and does not consume that cap.
Input reference
| Field | Type | What it controls |
|---|---|---|
keywords | array | Search phrases, English or Japanese, up to 50. Example: nintendo switch. |
startUrls | array | jp.mercari.com search or item URLs, up to 50. |
status | enum | all (default), on_sale, sold_out, or trading. Prefill sold_out. |
sort | enum | created_time (default), score, price, likes. |
order | enum | desc (default) or asc. |
priceMin / priceMax | integer | JPY band. Empty = no bound. |
maxItems | integer | Listing cap, 1–500. Default 50. Prefill 3. |
includeSoldStats | boolean | One marketStats row per keyword. Default false. Prefill true. |
soldStatsSampleSize | integer | Sold prices sampled for the report, 5–100. Default 30. |
fetchItemDetails | boolean | Adds description, seller name, likes. Default false. Item URLs always fetch detail. |
Provide at least one keyword or a valid Mercari Japan URL. Empty input returns INVALID_INPUT with zero listing charges.
What data you receive
One dataset item is either a listing or a sold-comp summary.
{"recordType": "listing","itemId": "m30214061125","itemUrl": "https://jp.mercari.com/item/m30214061125","title": "ドラゴンクエストⅣ","priceJpy": 600,"currency": "JPY","status": "sold_out","conditionName": "Poor","sellerId": "389403353","daysToSell": 5,"query": "nintendo switch","scrapedAt": "2026-09-15T07:00:00.000Z"}
marketStats rows add medianPriceJpy, p25PriceJpy, p75PriceJpy, minPriceJpy, maxPriceJpy, meanPriceJpy, medianDaysToSell, and sampleSize. Days-to-sell is the gap between Mercari created and updated on sold items — an approximation, not an official sold-at clock.
| Field | Type | Notes |
|---|---|---|
recordType | string | listing or marketStats |
itemId / itemUrl | string | Mercari id and jp.mercari.com/item/ page |
title | string | Public listing title |
priceJpy | integer | Listed or sold yen price |
status | string | on_sale, sold_out, or trading |
conditionName | string | New through Bad |
sellerId / sellerName | string | Public seller when Mercari exposes it |
daysToSell | number | Approximate created→updated gap on sold items |
medianPriceJpy | number | Sold-comp report only |
Real-world use cases
1. Sold comps for a keyword
{"keywords": ["nintendo switch"],"status": "sold_out","maxItems": 30,"includeSoldStats": true}
2. Live listings only
{"keywords": ["ナイキ ダンク"],"status": "on_sale","sort": "created_time","maxItems": 50}
3. Search URL with sold filter
{"startUrls": ["https://jp.mercari.com/search?keyword=watch&status=sold_out"],"maxItems": 20}
4. Single item URL
{"startUrls": ["https://jp.mercari.com/item/m30214061125"]}
5. Price band
{"keywords": ["iPhone 15"],"status": "sold_out","priceMin": 20000,"priceMax": 80000,"maxItems": 40}
6. Cheap-first live search
{"keywords": ["ポケモンカード"],"status": "on_sale","sort": "price","order": "asc","maxItems": 25}
7. Keyword plus item URL
{"keywords": ["airpods"],"startUrls": ["https://jp.mercari.com/item/m30214061125"],"status": "all","maxItems": 15}
8. Bounded agent call
{"keywords": ["casio g-shock"],"status": "sold_out","maxItems": 10,"includeSoldStats": true,"fetchItemDetails": false}
Why agents choose this Actor
- One tool for live listings and sold prices, not two SKUs.
- Predictable PPE:
$0.005per listing,$0.02per sold-comp report,$0.00005start, plus platform usage. maxItemsis a hard listing ceiling; empty searches finishVALID_EMPTYso you can change the query.- US Mercari URLs finish
INVALID_INPUTso the run stays onjp.mercari.com. - Flat fields (
priceJpy,status,itemUrl,daysToSell) stay inside a small token budget. - Terminal
OUTPUT.outcomevalues areCOMPLETE,PARTIAL,VALID_EMPTY,INVALID_INPUT, orUPSTREAM_FAILED.
Agent checklist
- Use
jp.mercari.comkeywords or URLs only. Mercari US and Buyee are out of scope. - Set
statustosold_outwhen you need comps;on_salewhen you need current asking prices. - Cap
maxItemsto the budget you can spend at$0.005per listing. - Turn on
includeSoldStatsonly when you need a median/IQR row ($0.02). - After the run, read
OUTPUT.outcome, then the dataset. Zero rows withVALID_EMPTYmeans the query matched nothing public. - Treat
daysToSellas approximate. Mercari does not publish an official sold-at timestamp in this public payload. - When
OUTPUT.outcomeisUPSTREAM_FAILED, retry with Apify Residential inproxyConfiguration.
Use through the API
curl "https://api.apify.com/v2/acts/khadinakbar~mercari-japan-scraper/runs?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"keywords": ["nintendo switch"],"status": "sold_out","maxItems": 3,"includeSoldStats": true}'
When the Actor completes, read dataset items from the default dataset and the OUTPUT record from the default key-value store.
Use with AI agents through Apify MCP
Scrape Mercari Japan sold prices for "nintendo switch". Return up to 10 rows with JPY price, status, item URL, and a sold-comp median. Keep the source on jp.mercari.com.
Point the MCP client at https://mcp.apify.com, call khadinakbar/mercari-japan-scraper, then read the dataset and OUTPUT.outcome.
Pricing
Pay per event plus platform usage (isPPEPlatformUsagePaidByUser: true):
| Event | When | Price |
|---|---|---|
apify-actor-start | Every run | $0.00005 |
listing-scraped | Each saved listing | $0.005 |
sold-comp-report | Each saved marketStats row | $0.02 |
A 3-listing sold sample with one report is about $0.035 in events plus compute/proxy. Invalid input and valid empty searches leave listing and report events unbilled.
Open the live Pricing tab for current event details. This Actor uses Pay per event plus Apify platform usage.
Best results
- Japanese keywords usually match Mercari's catalog better than English for JP-only goods.
created_time+sold_outis the usual comps window; raisemaxItemsif the median looks jumpy.fetchItemDetailsis slower; leave it off unless you need descriptions.- Direct HTTP works from many networks; switch
proxyConfigurationto Apify Residential when the public search asks for another route.
Builder's note
I built this as HTTP-only after I found Mercari Japan's search HTML has no usable __NEXT_DATA__. In my testing, POST https://api.mercari.jp/v2/entities:search with a fresh ES256 DPoP proof per request returns items[] and meta.nextPageToken, and GET https://api.mercari.jp/items/get?id= fills description and seller. My goal is a truthful sold-comp row, so a rotated DPoP requirement finishes UPSTREAM_FAILED rather than inventing prices.
Connect the workflow
When you need US auction sold comps instead of Mercari Japan, search eBay All-in-One Scraper then pass those listings into the same pricing sheet.
For US vehicle listings rather than Japan C2C, start with Autotrader Scraper after this Actor when the SKU is a car.
For handmade listing research, feed titles from this Actor into Etsy All-in-One Scraper when the next market is Etsy.
FAQ and responsible use
Is this affiliated with Mercari? No. Mercari is a trademark of its owner. This independent Actor is not endorsed by Mercari, Inc.
Is scraping allowed? You are responsible for complying with Mercari's terms, applicable law, and your own data-use policy. Keep collection to public listing fields.
Why was my run empty? A valid keyword with zero public matches finishes SUCCEEDED / VALID_EMPTY. A US URL or empty input finishes INVALID_INPUT. When every search route is unavailable the outcome is UPSTREAM_FAILED.
Does it return emails or phones? No. Public listing fields only.
Open the Actor Issues tab for bugs. This Actor is independent research tooling, not legal, investment, or sourcing advice.