Mercari Japan Scraper – Listings & Sold Prices (メルカリ) avatar

Mercari Japan Scraper – Listings & Sold Prices (メルカリ)

Pricing

from $4.00 / 1,000 results

Go to Apify Store
Mercari Japan Scraper – Listings & Sold Prices (メルカリ)

Mercari Japan Scraper – Listings & Sold Prices (メルカリ)

Scrape Mercari Japan (jp.mercari.com, メルカリ): search by keyword, category, brand, seller, price, condition and status — including SOLD items for price history. Normalized JSON (price JPY, size, condition rank, images), optional item details. No browser, no login. JP Data Works series.

Pricing

from $4.00 / 1,000 results

Rating

5.0

(1)

Developer

JP Data Works

JP Data Works

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

Scrape Mercari Japan (jp.mercari.com, メルカリ) — Japan's largest C2C marketplace — by keyword, category, brand, seller, price range, condition and status, and get clean JSON / CSV: price in JPY, normalized size, condition rank, images, timestamps and, with status: "sold", sold listings for price history. Optionally fetch each item's detail (description, shipping, seller ratings, attributes). No browser, no login, no proxy needed under normal use — the Actor talks to the same API the Mercari web app uses. Part of the JP Data Works series of Japanese marketplace scrapers (Trefac, KOMEHYO, Yahoo! Auctions …).

Keywords: Mercari scraper · メルカリ スクレイピング · Mercari Japan API · Mercari sold items / sold prices · Japanese secondhand market data · vintage clothing, sneakers, Pokémon cards, figures, cameras, watches · resale sourcing (eBay, Grailed, Depop, StockX) · price monitoring · new-listing alerts.

What you get

One row per listing:

  • itemId, url, title, brand, brandId, categoryId
  • priceJpy (integer), status (on_sale | trading | sold), soldAt (sold / trading items: last update time)
  • sizeRaw as written and sizeNorm / size normalized (W32, L, JP3, 26.5cm, FREE)
  • conditionRank 6 (新品、未使用) … 1 (全体的に状態が悪い), conditionLabel, Mercari's conditionId
  • itemType (mercari C2C listing | shops Mercari Shops product), shopName, sellerId, shippingPayerId
  • imageUrl (full size) and imageUrls, createdAt, updatedAt, fetchedAt, keyword, search (the resolved search parameters)

With Enrich with item details (C2C items):

  • description, categoryPath (メンズ > パンツ > デニム/ジーンズ), color, hashTags, attributes (素材, 季節感 …)
  • shippingPayer, shippingMethod, shippingFromArea, shippingDuration
  • likes, comments, seller { id, name, numSellItems, ratingGood, ratingNormal, ratingBad }, all photos, detailFetchedAt

Example item

{
"source": "mercari",
"itemId": "m11111111111",
"url": "https://jp.mercari.com/item/m11111111111",
"title": "KAPITAL キャピタル センチュリーデニム 5P モンキーシスコ W32",
"brand": "KAPITAL",
"brandId": 9174,
"priceJpy": 28000,
"status": "sold",
"sizeRaw": "W32",
"sizeNorm": { "kind": "waist", "value": 32 },
"size": "W32",
"conditionRank": 4,
"conditionLabel": "目立った傷や汚れなし",
"conditionId": 3,
"categoryId": 1191,
"itemType": "mercari",
"sellerId": "222",
"shippingPayerId": 2,
"imageUrl": "https://static.mercdn.net/item/detail/orig/photos/m11111111111_1.jpg",
"imageUrls": ["https://static.mercdn.net/item/detail/orig/photos/m11111111111_1.jpg", "https://static.mercdn.net/item/detail/orig/photos/m11111111111_2.jpg"],
"createdAt": "2026-09-21T13:33:20.000Z",
"updatedAt": "2026-10-14T17:46:40.000Z",
"soldAt": "2026-10-14T17:46:40.000Z",
"fetchedAt": "2026-11-02T00:00:00.000Z",
"keyword": "KAPITAL デニム",
"search": { "label": "KAPITAL デニム sold newest", "keyword": "KAPITAL デニム", "status": "sold", "sort": "newest", "priceMinJpy": 5000, "priceMaxJpy": null, "conditionIds": [], "createdAfter": null, "clientSideFilters": [] }
}

Without enrichment the detail fields are null / {} / [], so the dataset always has the same columns.

Output modes — listings or a market summary

outputMode chooses what the dataset contains:

  • items (default) — one row per listing, as above.
  • summary — one market-summary row per search instead of the listings. The Actor still walks the search pages (up to maxItemsPerSearch listings, with enrichDetail if set), but stores only the aggregate — so a run that answers "what does X go for on Mercari?" costs one summary event per search rather than hundreds of result events.
  • both — the listings plus the summary row.

A summary row (recordType: "summary") has the same shape in every JP Data Works Actor, so you can put several sites side by side:

{
"recordType": "summary",
"source": "mercari",
"search": { "label": "…", "url": "…", "…": "the resolved search parameters" },
"fetchedAt": "2026-11-02T03:00:00.000Z",
"sampleSize": 180, "totalOnSite": 1243, "scanned": 190, "filteredOut": 10, "withDetail": 0,
"status": { "on_sale": 180, "sold": 0, "unknown": 0 },
"price": { "count": 180, "min": 3300, "p25": 9800, "median": 16500, "mean": 19840, "p75": 25300, "max": 128000, "stddev": 15210 },
"priceOnSale": { "…": "same statistics for on-sale listings" }, "priceSold": { "…": "and for sold ones (sites that list them)" },
"priceHistogram": { "bucketJpy": 10000, "buckets": [ { "fromJpy": 0, "toJpy": 10000, "count": 46 }, "…" ] },
"conditionRank": { "6": 12, "5": 40, "4": 71, "3": 30, "unknown": 27 }, "conditionLabels": { "…": "the site's own labels" },
"sizes": { "M": 48, "L": 41, "W32": 12, "…": 0 }, "sizeKinds": { "alpha": 120, "waist": 30, "numeric": 20, "unknown": 10 },
"brands": { "KAPITAL": 180 }, "categories": { "メンズ > ジャケット/アウター": 95, "…": 0 }, "gender": { "mens": 170, "unknown": 10 },
"listed": { "last24h": 9, "last7d": 41, "last30d": 120 }, "sold": null,
"cheapest": [ { "itemId": "…", "title": "…", "url": "…", "priceJpy": 3300, "conditionRank": 4, "size": "M", "status": "on_sale" }, "…" ],
"cheapestGoodCondition": [ "… cheapest with condition rank ≥ 4 …" ],
"newest": [ "… most recently listed (sites that expose listing times) …" ]
}

Mercari exposes listing and sold times and lists sold items (status: sold / all), so the summary gives priceOnSale vs priceSold, listed (new listings in the last 24 h / 7 d / 30 d), sold (sales in the last 7 d / 30 d) and newest — the closest thing to a sell-through signal on a single run.

Input

Two ways to describe what to search, which can be combined in one run:

  • keywords — one search per keyword (KAPITAL デニム, visvim, ポケモンカード リザードン …).
  • searches — structured: objects with any of keyword, excludeKeyword, status, categoryId, brandId, sizeId, sellerId, priceMinJpy, priceMaxJpy, conditionMin / conditionIds, shippingPayer, sort, createdAfter, createdBefore, excludeWords, itemType.

Top-level status, sort, priceMinJpy, priceMaxJpy, conditionMin, createdAfter, excludeWords, itemType are defaults for every keyword and search; a value inside a search wins.

FieldTypeDefaultNotes
keywordsstring[]—One search per keyword. Optional when searches is given.
outputModeitems | summary | bothitemsListings, one market-summary row per search, or both (see "Output modes").
searchesobject[]—Structured searches (table below). Each needs a keyword, categoryId, brandId or sellerId.
statuson_sale | sold | trading | allon_salesold = sold out + in trading → price history.
sortrelevance | newest | priceAsc | priceDesc | likesrelevance
priceMinJpy / priceMaxJpyintegernone
conditionMin1–6none6 新品、未使用, 5 未使用に近い, 4 目立った傷や汚れなし, 3 やや傷や汚れあり, 2 傷や汚れあり.
createdAfterISO date / epochnoneOnly items listed after this. Schedule + createdAfter = incremental collection.
excludeWordsstring[][]Client-side title filter (レプリカ, 偽物, ジャンク …).
itemTypeany | mercari | shopsanyC2C listings only / Mercari Shops only.
maxItemsPerSearchinteger120Per keyword / search. 120 hits per API page.
maxTotalItemsintegernoneHard cap per run.
dedupeAcrossSearchesbooleantrue
enrichDetailbooleanfalseOne extra request + one detail-page event per C2C item.
maxDetailPagesinteger100Cap on detail requests per run.
requestDelayMsinteger2000Minimum pause between requests (≥ 500).
pageSizeinteger120Hits per API page (max 120).
proxyConfigurationobjectnoneOptional Apify Proxy / own proxies.
outputFieldsstring[]allKeep only these fields (itemId, url always kept).

Fields of one searches entry (all optional):

FieldExampleHow it is applied
keyword / excludeKeyword"KAPITAL デニム" / "レプリカ"Site search / site exclude.
status"sold"on_sale, sold (sold out + trading), trading, all.
categoryId[1191]Mercari category id(s). Find them in the site URL after filtering (category_id=).
brandId[9174]Mercari brand id(s) (brand_id=). 9174 = KAPITAL.
sizeId[55]Mercari size id(s).
sellerId[123456]List one seller's items (user id from the profile URL).
priceMinJpy / priceMaxJpy5000 / 30000Site price filter, re-checked on the client.
conditionMin / conditionIds4 / [1, 2, 3]Site condition filter; conditionIds are Mercari's ids 1 (new) … 6 (poor).
shippingPayer"seller"seller 送料込み, buyer 着払い, any.
sort"newest"relevance おすすめ順, newest 新しい順, priceAsc, priceDesc, likes いいね順.
createdAfter / createdBefore"2026-11-01"ISO date/time or epoch seconds.
excludeWords["レプリカ", "偽物"]Client-side: drop items whose title contains any of these.
itemType"mercari"Client-side: mercari C2C only, shops Mercari Shops only, any.

Examples

Sold prices for one brand, last 30 days (price history / comps):

{
"searches": [{ "keyword": "KAPITAL デニム", "status": "sold", "priceMinJpy": 5000, "sort": "newest", "createdAfter": "2026-10-01" }],
"maxItemsPerSearch": 240
}

New listings for a category under ¥20,000, run on a schedule (diff itemId against the previous run, or set createdAfter to the previous run time):

{
"searches": [{ "categoryId": [1191], "priceMaxJpy": 20000, "conditionMin": 4, "sort": "newest", "excludeWords": ["レプリカ", "偽物"] }],
"maxItemsPerSearch": 120
}

Several keywords with details:

{ "keywords": ["visvim FBT", "visvim Christo"], "status": "on_sale", "enrichDetail": true, "maxDetailPages": 50 }

Requests are sequential: one API call per 120 hits plus, with enrichDetail, one per item. 240 sold items without detail ≈ 2 requests ≈ 5 seconds; with detail ≈ 242 requests ≈ 8 minutes at the default delay.

FAQ

Can I get sold prices / price history? Yes — set status: "sold". Mercari keeps sold listings searchable; each row has priceJpy and soldAt (the listing's last update, which is the sale or completion time). Use createdAfter and a schedule to collect new sales incrementally.

Do I need a proxy or a browser? No. The Actor calls Mercari's public search API with the same request signature the web app generates (a per-session DPoP key), so it runs on Apify's datacenter IPs at the default 2-second delay. proxyConfiguration (e.g. Apify residential proxy, country JP) is there in case you see 403 / 429 at higher volumes.

How are sizes and conditions normalized? sizeRaw keeps the tag text; sizeNorm interprets it (waist inches for W32, alpha for S/M/L/LL→XL, numeric for JP sizes, cm for shoes, free). conditionRank uses 6 = best … 1 = worst, the same scale as our Trefac and KOMEHYO scrapers, so results from several Actors can be merged; conditionId is Mercari's own 1 (new) … 6 (poor).

Where do I find category / brand / size ids? Filter on jp.mercari.com and copy them from the URL: category_id=1191, brand_id=9174, size_id=55. A seller id is the number in a profile URL (/user/profile/123456).

What about Mercari Shops? Products from Mercari Shops (business sellers) are returned with itemType: "shops", shopName and the product URL. Item detail enrichment is only available for C2C listings (itemType: "mercari"); set itemType: "mercari" to exclude Shops products.

Is this legal? The Actor collects publicly visible listing data only — no login, no personal data beyond the public seller name / ratings on the listing, no purchases or messages — at a polite rate and with a browser-like signature only so the public API accepts the request. How you use the data is your responsibility; respect Mercari's terms of use, keep runs small and scheduled, and do not republish photos or descriptions as your own.

How do I call it from code or from an AI agent? Any Apify client works. With the JavaScript client:

import { ApifyClient } from "apify-client";
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor("tokyo-select-jp/mercari-search-scraper").call({
searches: [{ keyword: "KAPITAL デニム", status: "sold", sort: "newest", priceMinJpy: 5000 }],
maxItemsPerSearch: 120,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

or with plain HTTP (run-sync-get-dataset-items returns the results directly):

POST https://api.apify.com/v2/acts/tokyo-select-jp~mercari-search-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN
Content-Type: application/json
{ "keywords": ["visvim"], "status": "sold", "maxItemsPerSearch": 60 }

The Actor is also exposed through Apify's MCP server (https://mcp.apify.com), so Claude, ChatGPT, Cursor and other MCP-capable assistants can search Mercari by calling this Actor as a tool.

Pricing (pay per event)

EventCharged whenPrice
Result (apify-default-dataset-item, charged automatically by Apify)one listing is saved to the dataset$0.002
Item detail (detail-page)that listing was enriched with its detail$0.005 (in addition to the result)
Market summary (summary)one summary row is saved (outputMode summary / both)$0.03 per search
Actor start (apify-actor-start)each run starts$0.00005

Example: 240 sold listings without detail = $0.48; 100 listings with detail = $0.70. A summary-only run over 3 searches ≈ 3 × $0.03 = $0.09, whatever the number of listings sampled. Set Max total charge on the run to cap spending — the Actor stops cleanly at the limit and you keep everything collected so far.

Roadmap — JP Data Works

Scrapers for Japanese secondhand and auction marketplaces with one normalized shape (priceJpy, sizeNorm, conditionRank, imageUrls) so results can be merged:

  • Trefac (トレファク) — published
  • Mercari (メルカリ) — this Actor
  • KOMEHYO (コメ兵), Yahoo! Auctions (ヤフオク!) incl. sold listings, 2nd STREET, RAGTAG — coming
  • A cross-site aggregator (one query → all stores)

Requests and bug reports: the Issues tab of this Actor.


日本語

メルカリ(jp.mercari.com)をキーワード・カテゴリ・ブランド・出品者・価格帯・コンディション・ステータス(販売中 / 売り切れ)で検索し、構造化された商品データを返す Actor です。 status: "sold" で 売り切れ商品(相場・価格履歴) も取れます。ブラウザ不要・ログイン不要・通常はプロキシ不要(Web 版メルカリと同じ API を同じ署名方式で呼びます)。オプションで商品詳細(説明文・配送・出品者評価・属性)を付加します。

用途: 古着・スニーカー・トレカ・フィギュア・カメラ・時計の相場調査、eBay / Grailed 等への転売の仕入れリサーチ、新着監視、ブランド別の価格モニタリング。

出力(1 商品 = 1 行)

  • itemId / url / title / brand / brandId / categoryId
  • priceJpy、status(on_sale 販売中 / trading 取引中 / sold 売り切れ)、soldAt(売り切れ・取引中のとき: 最終更新時刻 = 売れた時刻の近似)
  • sizeRaw(表記そのまま)と sizeNorm / size(W32、L、JP3、26.5cm、FREE)
  • conditionRank(6 新品、未使用 … 1 全体的に状態が悪い。他の JP Data Works Actor と同じ尺度)、conditionLabel、conditionId(メルカリの 1〜6)
  • itemType(mercari 個人出品 / shops メルカリ Shops)、shopName、sellerId、shippingPayerId(2 送料込み / 1 着払い)
  • imageUrl / imageUrls(フルサイズ)、createdAt / updatedAt / fetchedAt、keyword、search

「商品詳細を付加」(enrichDetail) を ON にすると追加で(個人出品のみ): description、categoryPath、color、hashTags、attributes、shippingPayer / shippingMethod / shippingFromArea / shippingDuration、likes、comments、seller(名前・出品数・評価)、全写真。

入力

keywords(キーワードだけ)と searches(構造化検索)を併用できます。トップレベルの status / sort / priceMinJpy / priceMaxJpy / conditionMin / createdAfter / excludeWords / itemType は全検索の既定値で、各検索内の指定が優先されます。

項目既定説明
keywords—検索キーワード(1 行 1 件)。searches があれば省略可
searches—構造化検索の配列(下表)。各要素にキーワード・categoryId・brandId・sellerId のいずれかが必要
statuson_saleon_sale 販売中 / sold 売り切れ + 取引中 / trading / all
sortrelevancerelevance おすすめ順 / newest 新しい順 / priceAsc / priceDesc / likes いいね順
priceMinJpy / priceMaxJpyなし価格帯
conditionMinなしコンディション下限 1〜6(6 新品、未使用 … 2 傷や汚れあり)
createdAfterなしこの日時以降に出品されたものだけ(ISO 日付 or epoch 秒)。スケジュール実行と組み合わせて差分取得
excludeWords[]タイトルにこの語を含む商品を除外(クライアント側)
itemTypeanymercari 個人出品のみ / shops メルカリ Shops のみ
maxItemsPerSearch120検索ごとの最大件数(API 1 ページ 120 件)
maxTotalItemsなし1 実行の上限
enrichDetailfalse商品詳細を取得(1 商品 +1 リクエスト)
maxDetailPages100詳細取得の上限
requestDelayMs2000リクエスト間隔(ms)
proxyConfigurationなし403 / 429 が出る場合のみ Apify Proxy(Residential, JP)等を指定

searches の各要素: keyword / excludeKeyword / status / categoryId / brandId / sizeId / sellerId(配列)/ priceMinJpy / priceMaxJpy / conditionMin または conditionIds(メルカリの 1〜6)/ shippingPayer(seller 送料込み / buyer 着払い)/ sort / createdAfter / createdBefore / excludeWords / itemType。ID はサイトで絞り込んだときの URL(category_id=1191、brand_id=9174、size_id=55)から拾えます。

入力例

ブランドの売り切れ相場(直近 1 か月):

{
"searches": [{ "keyword": "KAPITAL デニム", "status": "sold", "priceMinJpy": 5000, "sort": "newest", "createdAfter": "2026-10-01" }],
"maxItemsPerSearch": 240
}

カテゴリの新着監視(¥20,000 以下・状態良好・偽物語除外):

{
"searches": [{ "categoryId": [1191], "priceMaxJpy": 20000, "conditionMin": 4, "sort": "newest", "excludeWords": ["レプリカ", "偽物"] }],
"maxItemsPerSearch": 120
}

料金(Pay per event)

イベント課金タイミング価格
結果(apify-default-dataset-item、Apify が自動課金)商品 1 件をデータセットに保存したとき$0.002
商品詳細(detail-page)その商品の詳細を取得したとき(結果に加算)$0.005
相場サマリー(summary)outputMode が summary / both のとき、検索 1 件につきサマリー行 1 行$0.03
Actor 起動(apify-actor-start)実行ごと$0.00005

例: 売り切れ 240 件(詳細なし)≈ $0.48、100 件(詳細あり)≈ $0.70。「Max total charge」で上限を設定すると安全に停止し、それまでの結果は残ります。

利用上の注意

  • 取得するのは公開されている商品情報のみです(ログイン・購入・メッセージ等は一切行いません)。1 リクエストずつ、既定 2 秒間隔でアクセスします。
  • データの利用はご自身の責任で、メルカリの利用規約を守り、過度なアクセスや画像・文章の無断転載はお控えください。