Japan's resale market as JSON, including what things actually sold for
The Mercari Japan API returns Japan's largest consumer-to-consumer resale marketplace as clean JSON, in two actions: search and product/detail.
2 active endpoints. Every call is 1 credit.
- POST/mercari/v1/search
- POST/mercari/v1/product/detail
What Mercari Japan endpoints does ReefAPI ship?
2 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.
Mercari Japan API
2 of 2 endpoints, ready to run
The Mercari feed: item id and URL, title, the price as a number in yen, whether it is on sale or already sold, the condition grade, the category id, the seller and the images — filtered by category, brand, seller, price, condition, status, colour, shipping terms and prefecture.
{ "ok": true, "meta": { "api": "mercari", "endpoint": "search", "mode": "live", "latency_ms": 3053.1, "record_count": 20, "cache_hit": false }, "data": { "items": [ { "item_id": "m75456007294", "title": "new balance 9060 26.5cm", "url": "https://jp.mercari.com/item/m75456007294", "price": 5500, "price_display": null, "currency": "JPY", "status": "sold_out", "condition": "good", "condition_id": 3, "listing_type": "c2c", "category_id": 345, "category": null, "brand": null, "size": null, "shop": null, "shipping_payer": "seller", "rating": null, "review_count": null, "rating_scale": null, "image": "https://static.mercdn.net/item/detail/webp/photos/m75456007294_1.jpg?1788578253", "thumbnail": "https://static.mercdn.net/thumb/item/webp/m75456007294_1.jpg?1788578253", "listed_at": "2026-09-05T03:17:33Z", "updated_at": "2026-09-06T08:51:37Z" }, { "item_id": "m72903716787", "title": "adidas YEEZY BOOST 350 V2 CMPCTブラックスニーカー", "url": "https://jp.mercari.com/item/m72903716787", "price": 5600, "price_display": null, "currency": "JPY", "status": "sold_out", "condition": "good", "condition_id": 3, "listing_type": "c2c", "category_id": 345, "category": null, "brand": null, "size": null, "shop": null, "shipping_payer": "seller", "rating": null, "review_count": null, "rating_scale": null, "image": "https://static.mercdn.net/item/detail/webp/photos/m72903716787_1.jpg?1788422153", "thumbnail": "https://static.mercdn.net/thumb/item/webp/m72903716787_1.jpg?1788422153", "listed_at": "2026-09-03T07:55:53Z", "updated_at": "2026-09-06T04:47:09Z" }, { "item_id": "2JU63Nzt4xjhVWMxaRHb8K", "title": "アディダス adidas アディマティック スニーカー シューズ スエード US9.5 27.5cm ピンク 黒 ブラック GY2092 /AN", "url": "https://jp.mercari.com/shops/product/2JU63Nzt4xjhVWMxaRHb8K", "price": 5000, "price_display": null, "currency": "JPY", "status": "sold_out", "condition": "good", "condition_id": 3, "listing_type": "shops", "category_id": 345, "category": null, "brand": null, "size": null, "shop": { "id": "GqU4Yahsuz6LW3NZZR53T8", "name": null }, "shipping_payer": null, "rating": null, "review_count": null, "rating_scale": null, "image": "https://assets.mercari-shops-static.com/-/large/plain/2JWRQ3A6JmdyjF7gHqtrGF.jpg@webp", "thumbnail": "https://assets.mercari-shops-static.com/-/small/plain/2JWRQ3A6JmdyjF7gHqtrGF.jpg@webp", "listed_at": "2026-07-17T03:45:53Z", "updated_at": "2026-09-06T15:56:07Z" } ], "count": 20, "next_page_token": "v1:1", "total_results": 15000, "total_results_is_estimate": true, "total_results_capped_at": 15000, "filters": { "query": "スニーカー", "sort": "relevance", "page_size": 20, "status": [ "sold_out" ] } } }
How the Mercari Japan API works
Mercari Japan is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.
No OAuth app, no request signing, no per-site account. One key covers all 192 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.
Price a second-hand item on what it SOLD for, not on what people are asking
A live listing tells you what a seller hopes to get. A sold listing tells you what a buyer paid. Mercari publishes both, and the difference between them is the whole point of resale pricing.
{"query": "ポケモンカード", "status": "sold_out", "sort": "price_desc", "page_size": 20}One flat credit. Every row is a completed sale carrying the price it sold at, the condition grade and the category id. Around 3.7 KB an item.
{"query": "ポケモンカード", "status": "on_sale", "sort": "price_asc"}The same query on live inventory, cheapest first. The gap between this head and the sold band is the spread you are actually trading.
{"item_id": "m36530816878"}One flat credit for the full listing, including the seller's rating count and good/normal/bad breakdown — the only reputation Mercari publishes, because the items themselves have no reviews.
Three flat credits for a sold-price comparable set, the live asks against it, and the seller behind the listing you care about.
curl -X POST https://api.reefapi.com/mercari/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"ポケモンカード"}'{
"ok": true,
"data": { … },
"meta": {
"api": "mercari",
"endpoint": "search",
"mode": "live",
"latency_ms": …,
"record_count": …
},
"error": null
}What one search call actually costs and fills - ten categories, 200 items, measured by value
Ten keywords across ten Mercari categories were pulled on 2026-09-06 and every field was counted by VALUE, not by key presence. Item id, title, URL, price, currency, status, condition, category id, seller id, seller URL, image and listing timestamp came back 20 of 20 on every single one of the ten searches.
| Category searched | Items | Bytes | Latency | Price range in the page returned |
|---|---|---|---|---|
| Smartphones | 20 | 13,803 | 1,511 ms | 300 - 1,666 JPY |
| Sneakers | 20 | 14,321 | 1,527 ms | 1,400 - 7,500 JPY |
| Trading cards | 20 | 14,455 | 2,382 ms | 300 - 12,000 JPY |
| Luxury bags | 20 | 14,645 | 1,348 ms | 1,300 - 175,000 JPY |
| Cosmetics | 20 | 14,239 | 1,907 ms | 400 - 3,800 JPY |
| Baby clothes | 20 | 14,159 | 1,491 ms | 300 - 3,200 JPY |
| Watches | 20 | 14,239 | 1,419 ms | 1,100 - 57,000 JPY |
| Musical instruments | 20 | 14,334 | 1,328 ms | 300 - 20,000 JPY |
| Golf | 20 | 14,361 | 1,435 ms | 4,000 - 35,000 JPY |
| Bicycles | 20 | 14,301 | 1,591 ms | 900 - 62,000 JPY |
Over 40 consecutive live calls on the same day - 27 searches and 13 product/detail - success was 40 of 40, with a minimum of 722 ms, a median of 1,288 ms, a p90 of 1,804 ms and a worst case of 2,651 ms. product/detail on one item from each of those ten searches returned a real price, a full root-to-leaf category path and a seller with a rating on 10 of 10; the only nulls in the whole grid were brand name on 2 of 10, where the seller had not tagged a brand.
Which country, which ids, which currency, and why the result total always says 15000
jp.mercari.com only — one country, one currency, two id spaces, and no account of yours anywhere in the path. Measured on 2026-09-06 across ten categories, 200 items, 40 consecutive live calls and the calls behind this page. Four of these lines go against us.
This engine reads jp.mercari.com, Japan's largest consumer-to-consumer resale marketplace. There is no country parameter because there is no other storefront. What you send is a ReefAPI key; there is no Mercari account of yours anywhere in the call, so there is no account of yours that can be rate-limited or suspended, and no cookie of yours to leak. Prices are JPY as whole integers.
A 20-item search is 13,803 bytes — about 3.7 KB an item — at a median 1.29 seconds. Across ten categories the range was 13.8 to 14.6 KB for the same 20 rows, and product/detail is 3.4 to 11.7 KB. Over 40 consecutive live calls on the measurement day: 40 successes, minimum 722 ms, median 1,288 ms, p90 1,804 ms, worst case 2,651 ms. Both actions are flat-rated at one credit, and both are one upstream request.
Item id, title, URL, price, currency, status, condition, category id, seller id, seller profile URL, image and listing timestamp came back 20 of 20 on every one of the ten category searches — smartphones, sneakers, trading cards, luxury bags, cosmetics, baby clothes, watches, musical instruments, golf and bicycles. product/detail on one item from each returned a real price, a full root-to-leaf category path and a seller with a rating on 10 of 10; the only nulls in the whole grid were brand name on 2 of 10, where the seller had simply not tagged a brand.
Set the status filter to sold_out and every row is a completed sale carrying the price it sold at. Verified 20 of 20 sold on the filtered page against an unfiltered control, and it composes with everything else — a category id, a brand id, a condition grade and a price band all narrow the comparable set the same way. That is the difference between knowing what a used lens is listed at and knowing what one actually changed hands for last week.
A private listing id is the letter m followed by 11 digits and lives at jp.mercari.com/item/<id>. A Mercari Shops product — a business seller — is 22 characters and lives at jp.mercari.com/shops/product/<id>, on a completely different endpoint. A default search returned 0 to 3 Shops rows in every 60 measured, so anyone iterating their own results will meet one. The engine reads the id shape and routes accordingly, and both kinds come back with the SAME key set so nothing downstream has to branch; the fields Mercari does not publish for a Shops product come back as explicit nulls. A listing_type filter restricts a search to one kind if you would rather not mix them.
Any keyword with real supply reports exactly 15,000, because that is Mercari's ceiling rather than a count — it only moves when the result set is genuinely small, and a narrow price band brought it down to 12,901 on one measured query. It is never presented as a count: the response marks it an estimate on every call and flags when it is sitting on the cap. To actually walk a result set, page with the cursor the response returns.
Checked by comparing id sets rather than by trusting the cursor: pages 1 through 4 each returned 20 new ids with 0 repeats, and 100 rows over five pages gave 97 distinct ids. The small overlap that appears later is Mercari's live index re-ordering under the cursor — new listings pushing rows across a page boundary — not a page being served twice; the first two pages never overlap at all. With the maximum page size it pages cleanly to at least 960 rows. The cursor is Mercari's own opaque token and must be passed back as given rather than constructed.
Every Mercari listing is a unique second-hand object, so nothing has a review or a star rating of its own — those fields come back null rather than invented. The reputation that does exist belongs to the SELLER, and product/detail returns it: a numeric average that is genuinely an average (measured 0 with no ratings, 4.5 over 13, 5 over 2,505), the number of ratings behind it, and the good/normal/bad split, which is the part that actually discriminates because Mercari feedback is overwhelmingly good. Like and comment counts are published under their own names and are deliberately not dressed up as reviews.
An out-of-range condition id did not error — it came back with a normal-looking page whose rows carried four different conditions, the filter simply dropped. That is the worst failure shape there is: a plausible answer to a question you did not ask. So every enum here is rejected up front with the accepted set spelled out, and re-checked in the response. The same class one level up: a buyer-pays shipping filter is not clean on its own, because Mercari backfills the page with Shops rows that carry no shipping-payer at all — 9 matching plus 11 unfiltered in a page of 20 — and adding the private-listing filter makes it 20 of 20. That is written on the parameter itself.
Every filter offered was verified to actually bite: a condition grade returned 20 of 20 of that grade, a price band 20 of 20 in range, a leaf category 20 of 20 in that category, the price sorts were strictly monotone over 20 rows, and the newest sort cut the median listing age from about 290,000 seconds to about 11,000. Three of Mercari's own filters were left out and it is worth knowing why: a coupon flag returned 9 of the same 10 rows as the unfiltered control, a size filter had nothing to verify against because the size field was null on every row in every category we tried, and a shipping-method filter answers in an id space that is not the one items report back. A parameter that is accepted and ignored is worse than no parameter.
No formatted price string — only a bare integer of yen, so the display field is null and the currency is a documented constant. No rating scale anywhere in the payload, so it stays null rather than being assumed to be 5. No stock quantity and no competing-offer table, because a listing is one object from one seller — there is nothing to compare. No seller name and no category name on a search ROW, only their ids; product/detail names both and returns the full category path. And no category directory endpoint exists at all, so category ids are discovered from search rows and from product/detail rather than from a lookup table.
What people build with Mercari Japan
The jobs this data is most often used for.
endpoints
credit per call
Resale pricing tools search with status=sold_out to build comparables from what items ACTUALLY sold for, not from what sellers are asking.
Sourcing and arbitrage teams sweep a category or brand id with no keyword at all and page through with the cursor, at about 3.7 KB an item.
Brand-protection teams watch a brand id for counterfeit or grey-market listings and pull the seller's reputation with product/detail.
Proxy-buying and cross-border storefronts call product/detail for the full listing - description, condition grade in Mercari's own wording, photo gallery, shipping method and prefecture, and the seller's rating breakdown.
What Mercari Japan data costs
The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.
Full pricing →- 1,000 free credits on signup, no card
- One key, all 192 APIs, one credit pool
- Failed and blocked calls are never charged
- Credits roll over and never expire
Call it in two lines
Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.
curl -X POST https://api.reefapi.com/mercari/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"ポケモンカード"}'import requests
r = requests.post(
"https://api.reefapi.com/mercari/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "ポケモンカード"
},
)
print(r.json()["data"])Have a question? We got answers.
The questions people actually ask before wiring up Mercari Japan.
Get a free key →Can I see what an item actually SOLD for, not just what it is listed at?▾
Yes - that is the most useful thing this API does for resale pricing. Set status to sold_out and every row you get back is a completed sale carrying the price it sold at, which is what a resale comparable actually is; a live listing only tells you what somebody hopes to get. Measured live on 2026-09-06: a Japanese trading-card keyword with status sold_out returned rows that were 20 of 20 sold_out, and with a price_desc sort the same query came back in 10.5 KB and 1.63 s. Combine it with a category id or a brand id to build a comparables set for one exact kind of item.
How many results are there really? total_results says 15000 on everything.▾
Because 15,000 is Mercari's cap, not a count. Mercari returns exactly that number for any keyword with real supply, and it only moves when the result set is genuinely small - a 10,000 to 12,000 yen price band brought it down to 12,901, and a junk keyword returns 0. The response never hides this: total_results comes with total_results_is_estimate set to true on every call, and total_results_capped_at set to 15000 whenever it is sitting on the cap. To actually walk a result set, use next_page_token instead.
Does paging give me new items or the same page again?▾
New items. It was checked by comparing id sets rather than by trusting the token: pages 1 through 4 returned 20 new ids each with 0 repeats, and 100 rows over five pages gave 97 distinct ids. The small overlap that appears deeper in the stream is Mercari's live index re-ordering under the cursor - new listings pushing rows across a page boundary - not the engine repeating a page; the first two pages never overlap at all. With page_size 120 it pages cleanly to at least 960 rows. The token is Mercari's own opaque cursor and must be passed back as given, not constructed. page_size itself is a hint, not a promise - a 20-row request came back with 14 on one live sold-listing call - so read count.
Are there product reviews or a rating on a listing?▾
No, and there cannot be - every Mercari listing is a unique second-hand object, so there is nothing to review. rating, review_count and rating_scale on the item are all null rather than invented. The reputation that DOES exist is on the seller, and product/detail returns it: a numeric star rating that is a real average (measured 0 with no ratings, 4.5 over 13 ratings, 5 over 2,505), the number of ratings behind it, and a good/normal/bad breakdown - which is the part that actually discriminates, because Mercari feedback is overwhelmingly good. Like count and comment count are published under their own names and are deliberately not dressed up as reviews.
Why do some ids look completely different from the others?▾
Because Mercari runs two id spaces and both are served. A private C2C listing is the letter m followed by 11 digits and lives at jp.mercari.com/item/<id>; a Mercari Shops product, sold by a business, is 22 base62 characters and lives at jp.mercari.com/shops/product/<id> behind a different endpoint entirely. Feeding a Shops id to the private-listing endpoint is a hard 400, so anyone iterating their own search results would hit it: a default search returned 0 to 3 Shops rows in every 60 measured. product/detail reads the id shape and routes accordingly, and both kinds come back with the same key set so nothing downstream has to branch - the fields Mercari does not publish for Shops products come back as explicit nulls. Set listing_type to c2c or shops if you want only one kind.
Do the filters actually filter, or are they accepted and ignored?▾
Every published filter was proved to bite, and the ones that could not be proved were not published. Verified: condition new returned 20 of 20 new; a 50,000 to 60,000 yen band returned 20 of 20 in range; a leaf category id returned 20 of 20 in that category; sold_out returned 20 of 20 sold; price_asc and price_desc were strictly monotone across 20 rows; newest cut the median listing age from 289,545 seconds to 11,084. Filters left out include a coupon flag that returned 9 of the same 10 rows as the control, a size filter with nothing to verify against, and a shipping-method filter whose id space is not the one items report back. This matters because Mercari SILENTLY IGNORES an out-of-range value rather than erroring - an invalid condition id came back with a normal-looking mixed page - so every enum here is rejected up front and re-checked in the response.
Is shipping_payer=buyer a clean filter?▾
Not on its own, and the API says so in the parameter's own description. Buyer-pays is rare on Mercari, and when the filter runs short of rows Mercari backfills the page with Mercari Shops listings, which carry no shipping-payer value at all and were never filtered - measured at 9 matching plus 11 unfiltered in a page of 20. Adding listing_type=c2c makes it 20 of 20. It is the same class of problem as the ignored enum above: a plausible answer to a question you did not ask.
What does Mercari NOT publish?▾
A formatted price string - only a bare integer of yen, so price_display is null and currency is the documented constant JPY. No rating scale: a scan of the whole payload finds no maximum-rating key anywhere, so rating_scale is null rather than an assumed 5. No stock quantity and no competing-offer table, because a C2C listing is one object from one seller - there is nothing to compare. No seller name and no category name on a search ROW, only the ids; product/detail names both. No size - the size field was null on every row measured, in every category tried. And no category directory: there is no endpoint that lists Mercari's categories, so ids are discovered from search rows and from product/detail, which returns the full named path.
What is the Mercari Japan API?▾
Mercari Japan API is a ReefAPI endpoint group for japan's c2c resale marketplace: live and sold listings, prices in yen, seller reputation. It returns live JSON through POST requests under /mercari/v1.
Is the Mercari Japan API free to try?▾
Yes. ReefAPI starts with 1,000 free credits, no card required. Mercari Japan calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Mercari Japan login or account?▾
No login to Mercari Japan is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Mercari Japan data?▾
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Mercari Japan API use?▾
Mercari Japan actions currently cost 1 credit per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.
Can I call Mercari Japan from an AI assistant or MCP client?▾
Yes. Connect ReefAPI once through MCP and your assistant can call mercari actions with the same key, credit pool and JSON envelope used by normal REST requests.
43 E-commerce & Marketplaces APIs on the same key
One key, one credit pool, one response envelope. If you are pulling Mercari Japan, you are one call away from the rest of the category — no second contract, no second integration.
Need something this API does not do?
Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.
Try it on your own data before you pay anything
The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 191 APIs, and the same envelope everywhere.
Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-09-06.