Mercari Japan API

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.

no credit card1,000 free credits · instant API key · pay by card or crypto
Missing a Mercari Japan endpoint, or need a source we don't have yet?Contact us real people · same-day reply.
M
/mercari/v1

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.

2 endpoints

search

1 cr

Search Mercari Japan by keyword and by any combination of category, brand, seller, price rang…

required
optional
query, exclude, category_id, brand_id, seller_id, price_min, price_max, condition, status, shipping_payer, color, shipping_from, listing_type, sort, page_size, page_token, max_rotations

product/detail

1 cr

One Mercari Japan listing in full, by id or url.

required
item_id
optional
max_rotations

Every parameter, every allowed value →

Mercari Japan API

2 of 2 endpoints, ready to run

View docs ↗

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.

1 credit1 required · 4 optional
POST/mercari/v1/search
ok3053 ms · 20 records · sample
{
  "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"
      ]
    }
  }
}
Real response, fetched from the live endpoint with the parameters on the left — trimmed to the first few rows, with seller names left out. Press Try it for the untrimmed response.

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.

01
Authenticate
x-api-key header

No OAuth app, no request signing, no per-site account. One key covers all 192 engines.

02
Call
POST /mercari/v1/…

Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.

03
Pay
1 credit per call

Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.

04
Read
{ ok, data, meta, error }

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.

01search
POST/mercari/v1/search
{"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.

02search
POST/mercari/v1/search
{"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.

03detail
POST/mercari/v1/product/detail
{"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.

request
curl -X POST https://api.reefapi.com/mercari/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"query":"ポケモンカード"}'
response envelope
{
  "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 searchedItemsBytesLatencyPrice range in the page returned
Smartphones2013,8031,511 ms300 - 1,666 JPY
Sneakers2014,3211,527 ms1,400 - 7,500 JPY
Trading cards2014,4552,382 ms300 - 12,000 JPY
Luxury bags2014,6451,348 ms1,300 - 175,000 JPY
Cosmetics2014,2391,907 ms400 - 3,800 JPY
Baby clothes2014,1591,491 ms300 - 3,200 JPY
Watches2014,2391,419 ms1,100 - 57,000 JPY
Musical instruments2014,3341,328 ms300 - 20,000 JPY
Golf2014,3611,435 ms4,000 - 35,000 JPY
Bicycles2014,3011,591 ms900 - 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.

One market: Japan, prices in yen, and no login of yours in the path

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.

It is the cheapest surface we serve, by bytes per record

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.

Every field on a search row was counted by value, on all ten categories

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.

Sold listings are the reason to use this rather than a listings feed

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.

Two id spaces, and feeding the wrong one to the wrong endpoint is a hard error upstream

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.

Against us: the result total is an estimate, and it is capped at 15,000

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.

Paging returns new items, with a small honest caveat deep in the stream

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.

Against us: there are no item reviews, and there cannot be

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.

Against us: Mercari silently ignores a filter value it does not like

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.

Filters we could not prove are not published at all

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.

What Mercari does not publish

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.

2

endpoints

1

credit per call

01

Resale pricing tools search with status=sold_out to build comparables from what items ACTUALLY sold for, not from what sellers are asking.

02

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.

03

Brand-protection teams watch a brand id for counterfeit or grey-market listings and pull the seller's reputation with product/detail.

04

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 →
$0.67–$1.50 / 1,000 credits
  • 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
curl -X POST https://api.reefapi.com/mercari/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"query":"ポケモンカード"}'
python
import requests

r = requests.post(
    "https://api.reefapi.com/mercari/v1/search",
    headers={"x-api-key": REEF_KEY},
    json={
  "query": "ポケモンカード"
},
)
print(r.json()["data"])
FAQ

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.

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.

0/4000

No account needed · we reply from [email protected]

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.