Mercari Japan Scraper: New Listings & Sold Prices avatar

Mercari Japan Scraper: New Listings & Sold Prices

Pricing

from $1.00 / 1,000 listing returneds

Go to Apify Store
Mercari Japan Scraper: New Listings & Sold Prices

Mercari Japan Scraper: New Listings & Sold Prices

Mercari Japan scraper and sold items tracker: search by keyword or URL for JPY price, condition, brand, status and seller type. Sold items by keyword, sold price comps, new listings and a price drop alert for camera lenses or any search. To Google Sheets or n8n. No login. Pay per listing.

Pricing

from $1.00 / 1,000 listing returneds

Rating

0.0

(0)

Developer

Adriana Voss

Adriana Voss

Maintained by Community

Actor stats

0

Bookmarked

4

Total users

2

Monthly active users

an hour ago

Last modified

Share

Watch a search, get only what's new. This actor runs your search on Mercari Japan (jp.mercari.com), Japan's biggest flea-market app, and returns one clean row per listing: title, JPY price, condition, brand, status, seller type and a permanent link. Switch to sold mode and the same search becomes a price-comps feed: what things actually sold for, most recently sold first. Turn on monitoring and it becomes a watchlist: new listings, new sales and price drops since your last run, charged per new row, free on quiet days. Add the sold signal and it is a Mercari Japan sold items tracker: which watched listings left the market, whether Mercari confirms each one sold, and the watchlist's sell-through rate.

Who it's for

Resellers and importers who price by what sold last week, not by asking prices. Proxy-buying and export shops sourcing trading cards, games, cameras and fashion from Japan. Market researchers who need a bulk export of a Mercari search in a spreadsheet, and n8n, Make or Sheets workflows that act the moment a new listing appears. Paste a list of searches (Japanese or English keywords, or a search URL copied from your browser), get back a flat row per listing, and pay only for listings returned. A search that finds nothing costs nothing.

Mercari already sends its own app alerts to individual buyers. This actor is for the jobs the app doesn't do: sold-price comps in bulk, a structured export, and monitoring many searches at once on your own schedule.

Why this one

  • Sold price comps built in. Set "Listing type" to Sold and you get items that already sold (or are mid-transaction), most recently sold first, with the price they went for. Combine with monitoring for a running log of every new sale in a search.
  • Sold signal with Mercari's own confirmation. A watched listing that leaves the on-sale results comes back as gone, and the actor asks Mercari for its status: soldConfirmed: true when it sold, false when it was deleted or paused. Plus a lifetime sell-through rate and the search's median price, on every monitoring run.
  • Monitoring first, not a one-off dump. It remembers every item ID it has shown you and only bills what's new or cheaper since the last run. A quiet run costs only the run fee.
  • Mercari's own filters, not an approximation. Condition, category, brand and price are sent to Mercari's search as Mercari's own filters, so a price cap is applied before you pay, not after.
  • Readable condition labels. Mercari's six condition grades come back as an ID plus an English and a Japanese label (新品、未使用 through 全体的に状態が悪い), taken from Mercari's own filter UI.
  • Private or business seller. Mercari Shops listings (business sellers) are flagged sellerType: business and link to their Shops page; ordinary C2C listings are private.
  • Never charged for a miss or a quiet monitoring run.

What you get

One row per listing by default (turn off "Expand rows" in Advanced for one row per search, with the listings nested under listings).

FieldTypeDescription
querytextThe search you submitted, echoed back
foundbooleantrue if Mercari returned a search response
statustextOK, or NOT_FOUND / BLOCKED / BAD_FORMAT on a miss
searchQuerytextThe keyword actually searched (read from a pasted URL if you gave one)
listingTypetextactive, sold or all for this search
listingCountnumberListings returned and billed for this search
totalAvailablenumberMatches Mercari reports (Mercari caps this figure at 15,000)
truncatedbooleantrue if more results existed than were returned
newCount / priceDropCountnumberNew listings and price drops this run (monitoring only)
goneCountnumberWatched listings that left the on-sale results this run, returned or not (monitoring only)
sellThroughRatenumberWatchlist lifetime: listings sold (or presumed sold) / listings tracked, 0 to 1 (monitoring only)
medianPricenumberMedian JPY price of the fixed-price listings this run read for the search (monitoring only)
brandResolvedAstextThe real Mercari brand name(s) the brands filter matched, or empty when that filter wasn't set
listingIdtextMercari item ID (m... for C2C, a longer ID for Mercari Shops)
urllinkjp.mercari.com/item/<id>, or jp.mercari.com/shops/product/<id> for Mercari Shops
titletextListing title
pricenumberPrice in JPY (for an auction listing, the current highest bid)
currencytextAlways JPY
soldPricenumberSold listings only: Mercari is fixed-price and a sold item's price never changes again, so this is the real sale amount. Empty for active/trading listings. No soldAt — Mercari's feed carries no sale timestamp.
listingStatustexton_sale, trading (bought, transaction in progress) or sold_out
statusValuetextStandard 3-state column (named statusValue, not status — that name is reserved for the run-level miss/hit column above): available / reserved (trading — a real Mercari state, not folded into available) / sold
conditionIdnumberMercari condition grade, 1 (new) to 6 (poor overall)
conditionName / conditionNameJatextThe grade in English and in Mercari's Japanese wording
conditiontextStandard 6-value grade: new, like_new, good, fair, unknown. Mercari's own 4/5/6 (fair/poor/very poor) all collapse into fair — lossy on purpose, there's no grade below fair in this scheme. Mercari has no with-tags grade, so new_with_tags never appears here.
conditionRawtextMercari's exact condition id + Japanese label, verbatim (e.g. "4 やや傷や汚れあり")
categorytextMercari category ID
brandtextBrand, when the seller tagged one
sellerTypetextbusiness for Mercari Shops, otherwise private
shippingPaidBytextseller (送料込み) or buyer (着払い); empty for Mercari Shops
isAuction / auctionEndsAtboolean / dateMercari's auction-format listings and their bid deadline
postedAt / listedAtdateWhen the listing was created (listedAt is the standard column name, same value)
updatedAtdateLast status or price change; for sold items, roughly when it sold
imageUrllinkFirst listing photo
sellerHashtextAnonymous, stable hash of the seller ID
sellerIdtextOnly with "Include raw seller ID" on
isNew, changeType, previousPrice, priceDropPct, firstSeenAtmixedMonitoring fields; changeType is new, price-drop, gone or seen
lastSeenAt / daysListeddate / numberLast run that saw the listing, and days from first to last sighting
lastPricenumberGone rows: the last price this watchlist saw before the listing went
soldConfirmedbooleanGone rows: true Mercari says sold (or in transaction), false deleted or paused, empty when it couldn't be checked
gonePresumedSoldbooleanGone rows: soldConfirmed, or when unknown, seen 2+ runs in a row and priced at or under the median
scrapedAtdateWhen this row was fetched

How to filter

All filters below are optional and off by default — an existing input with none of these keys gets exactly the same rows it always did. minPrice/maxPrice, conditions and brands are sent to Mercari as part of the search request itself, so they also cut the number of pages fetched (fewer requests, not just fewer rows). includeKeywords/excludeKeywords run client-side, over the title only — Mercari's search API returns no description field to match against.

1. Sold comps for a resale flip, one specific grade, over ¥3,000:

{
"searches": ["ポケモンカード リザードン"],
"listingType": "sold",
"conditions": ["like_new", "good"],
"minPrice": 3000
}

Only sold listings (Mercari's own fixed-price sale amount lands in soldPrice), kept to the two best real-world grades (Mercari's 2 like_new/3 good), ¥3,000 and up. conditionRaw still shows the exact id and Japanese label Mercari used.

2. One resolved brand, excluding reproductions, cheapest first:

{
"searches": ["トレーディングカード"],
"brands": ["Pokemon"],
"excludeKeywords": ["レプリカ", "プロキシ"],
"sort": "price_low"
}

brands is resolved against Mercari's own ~52,000-brand list (exact match, then an obvious spelling fix) and sent to Mercari as brandId — a name that doesn't match anything returns one free row naming the closest real brand names instead of silently searching without it. excludeKeywords drops any title mentioning "レプリカ"/"プロキシ" (replica/proxy), sorted cheapest first.

3. New-in-box only, a price band, title must mention the model:

{
"searches": ["Nintendo Switch"],
"conditions": ["new"],
"includeKeywords": ["有機EL", "OLED"],
"minPrice": 20000,
"maxPrice": 35000
}

Keeps only Mercari's 1 新品、未使用 grade (condition: "new"), ¥20,000–35,000, and only titles mentioning the OLED model in Japanese or English — a plain "Switch" search that isn't the OLED model is dropped.

Pricing

  • Listing returned: $2 per 1,000 listings

Plus a $0.00005 start fee per run. Each event above is billed independently, only when it actually returns data — misses (found:false) are never charged.

Monitoring / only new results

Turn on "Only return results that are new or dropped in price since the last run" and a search line becomes a watchlist:

  • A listing is new the first time this watchlist sees its Mercari item ID. In Sold mode that means newly sold since the last run.
  • A price drop fires when a fixed-price, on-sale listing's price falls by at least "Minimum price drop" (5% by default). Auction bids and sold items never fire one.
  • Already-seen, unchanged listings are dropped before billing. A quiet run returns one free row.
  • The first run has nothing to compare against, so it returns everything as new. Turn on "Skip alerts on the first run" to bank the first run silently and start alerting from run two.

Schedule recipe. Save the actor as an Apify Task with deltaMode: true and your own deltaName, add an hourly or daily Schedule, and point the task's webhook at Slack, Discord, Google Sheets or an n8n / Make webhook.

  • A gone listing (sold, deleted, paused) is counted on every monitoring run, and returned only with "Alert on gone listings" on. See "Sold signal and sell-through" below.

Limitation. Each run reads up to 1,000 listings per search (newest first, 120 per page). A very busy keyword can post more than that between two runs, and a price drop is only seen on a listing that is still inside that window. Narrow busy searches with a category, brand or price cap, or schedule them more often.

Sold signal and sell-through

Gone means delisted: most often sold, sometimes withdrawn. On Mercari a listing leaves the on-sale results when it sells, but also when the seller deletes or pauses it, or edits it out of your filters (a new title, a price outside your range). So this actor doesn't stop at "it's missing": for each listing it judges gone, it asks Mercari for that item's own status.

  • soldConfirmed: true: Mercari says sold_out or trading (bought, transaction in progress). The row's price is the price it sold at, updatedAt is roughly when, lastPrice is the last price your watchlist saw.
  • soldConfirmed: false: deleted or paused. It counts as gone but not toward sell-through.
  • Still on sale: not reported at all. It slid out of view or out of your filters, and is not billed.
  • soldConfirmed empty: it couldn't be checked (Mercari Shops listings, a refused lookup, or more than 40 gone in one search in one run). gonePresumedSold then falls back to a rule of thumb: seen on 2+ runs in a row and priced at or under the search's median.

A remembered listing that already shows trading or sold_out in the on-sale results (Mercari's index lags a sale by minutes) is a confirmed sale straight away, with no lookup.

How it decides a listing is gone. Each run reads the newest listings (up to "Most listings to return", paged 120 at a time). Mercari's "Newest first" also moves an old listing back to the top when its seller cuts the price, so the actor can't just count new arrivals. It calls a listing gone only when a listing that sat below it last time, untouched since, is still in view: if the missing one were still for sale it would sit above that one and would have been read. On a search small enough to fit one page, anything missing is gone. There is no gone check on a first run, on an empty fetch, when a page fails or Mercari refuses one, when the run hits its request budget, or on a Sold, Both or non-newest search. When in doubt, a listing is treated as still for sale.

Limits. Listings near the bottom of the window can slide out of view with nothing below them to prove it, so they're never called gone that run. A busy keyword wants "Most listings to return" comfortably above the number of new listings between two runs (or a narrower search). Mercari Shops listings follow their own ordering: they're only judged gone on a one-page search, and can't be confirmed. Sell-through is lifetime for the watchlist: listings sold (confirmed or presumed) over listings tracked since the watchlist started, from 0 to 1.

Billing. Gone rows are ordinary listing rows, no separate event: $2 per 1,000 like any other listing, and only when "Alert on gone listings" is on. With it off, gone listings are still counted in goneCount and sellThroughRate, free. The status lookups are never billed.

Example: daily sell-through watch on a card.

{
"searches": ["リザードン ex SAR"],
"listingType": "active",
"sort": "newest",
"maxListingsPerSearch": 240,
"deltaMode": true,
"deltaName": "charizard-sar-sellthrough",
"alertOnNew": false,
"alertOnPriceDrop": false,
"alertOnGone": true
}

Schedule it daily. Run 1 remembers the search silently apart from its summary row; from run 2 you get one row per listing that sold or was delisted, and every row carries sellThroughRate and medianPrice. Use the dataset's Sold signals view.

Sold comps

Turn on "Include sold comps and a sold-price summary" and each search also fetches Mercari's sold listings for the same keywords and filters (most recently sold first, up to "Max sold comps to fetch", 50 by default, 200 at most) and puts a pricing summary on the search row. The sold comps come back as ordinary listing rows and are billed as ordinary listings; nothing new is charged. It is off by default, and with it off every row, field and charge is exactly as before.

{
"searches": ["ポケモンカード リザードン"],
"includeSoldComps": true,
"maxSoldComps": 50
}

All prices are Japanese yen (JPY) and are not converted. The existing sellThroughRate and medianPrice still mean what they meant (monitoring only); these fields are new:

  • activeCount: active listings counted in the summary (what the search fetched, up to your "Most listings to return").
  • soldCount: sold listings counted in the summary: sold rows from the search plus the sold comps. Like Sold mode, this includes items a buyer has paid for and Mercari is still completing (trading); their soldPrice stays empty until Mercari marks them sold, and the summary uses their price.
  • compsWindowDays: days between the oldest and the newest sold comp, by last status change.
  • activeMedianPrice: median asking price of the fixed-price active listings (auction bids are not asks).
  • soldMedianPrice: median price the sold listings went for.
  • askVsSoldGapPct: how far the asking median sits above (or below) the sold median, in percent.
  • medianDaysToSell: always empty on Mercari. Its search feed has no sale date; updatedAt also moves when a seller edits or relists, so "updated minus posted" would not be a time to sell, and we do not guess.

Which sales you get: Mercari cannot sort by sale time, so the comps are the most recently posted sold listings, then ordered by last status change. Expect the freshest sales of that search, not a long history; compsWindowDays tells you how far back they reach.

Monitoring: when the search is a change-only monitor, the comps still feed the summary but are not returned or billed again each run. A failed or blocked comps fetch returns the plain search.

How to use

  1. In the Apify Console. Open the actor page and click Start — the searches field is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found.
  2. Via the API. Call it directly with a POST request — no Console needed once you have an API token:
    curl "https://api.apify.com/v2/acts/accountable_eel~mercari-jp-listing-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
    -X POST \
    -H "Content-Type: application/json" \
    -d '{"searches":["ポケモンカード"]}'
  3. On a schedule. Save this actor as an Apify Task with the input you want, then add a Schedule (hourly, daily, weekly) so it runs on its own — no server of your own required.
  1. For sold comps, set "Listing type" to Sold. For monitoring, turn on the Monitoring section.

Input

{
"searches": [
"ポケモンカード"
]
}

One search per line: keywords like "ポケモンカード" or "nintendo switch", or paste a jp.mercari.com search URL (its own filters for status, sort, condition, category, brand and price are kept). Accepted formats: ポケモンカード, nintendo switch, https://jp.mercari.com/search?keyword=iphone&status=sold_out%7Ctrading.

Pasted search URLs keep their own filters: status=on_sale or status=sold_out|trading, sort/order, item_condition_id, category_id, brand_id, price_min and price_max override the matching inputs for that one search.

Sample output

queryfoundstatussearchQuerylistingTypelistingCounttotalAvailabletruncatednewCountpriceDropCountgoneCountsellThroughRatemedianPricebrandResolvedAsactiveCountsoldCountcompsWindowDaysactiveMedianPricesoldMedianPriceaskVsSoldGapPctmedianDaysToSelllistingslistingIdurltitlepricecurrencysoldPricelistingStatusstatusValueconditionIdconditionNameconditionNameJaconditionconditionRawcategorybrandsellerTypeshippingPaidByisAuctionauctionEndsAtpostedAtlistedAtupdatedAtimageUrlsellerHashsellerIdisNewchangeTypepreviousPricepriceDropPctfirstSeenAtlastSeenAtdaysListedlastPricegonePresumedSoldsoldConfirmedscrapedAt
ポケモンカードtrueOKポケモンカードactive3015000true<active listings counted in the comps summary (sold comps only)><sold listings counted in the comps summary (sold comps only)><span of the sold comps, oldest to newest last-status-change date, in days (sold comps only)><median asking price of fixed-price active listings, jpy (sold comps only)><median sold price, jpy (sold comps only)><asking vs. sold median price gap in % (sold comps only)><median days from posted to sold; always empty on mercari, which publishes no sale date (sold comps only)><all listings found (full list)>m71314570426https://jp.mercari.com/item/m71314570426ポケモンカード ピカチュウex SAR8500JPYon_saleavailable3No noticeable scratches or stains目立った傷や汚れなしgood3 目立った傷や汚れなし1289privatesellerfalse2026-10-15T06:19:39.000Z2026-10-15T06:19:39.000Z2026-10-15T06:19:39.000Zhttps://static.mercdn.net/item/detail/webp/photos/m71314570426_1.jpg?1792045179d5d14358b3d2042e2026-10-15T06:20:15.916Z

A search that finds nothing comes back as a row with "found": false and is never charged.

Use it from Clay, n8n, Make, or an AI agent

This actor runs synchronously over plain HTTP — call it directly from a script, a workflow tool, or an AI agent, no Apify Console needed once you have an API token.

curl "https://api.apify.com/v2/acts/accountable_eel~mercari-jp-listing-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
-X POST \
-H "Content-Type: application/json" \
-d '{"searches":["ポケモンカード"]}'

n8n. Add an HTTP Request node: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~mercari-jp-listing-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body Content Type JSON, JSON Body {"searches":["ポケモンカード"]} (swap in an expression from an earlier node for a real value).

Clay. Add an "HTTP API" column: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~mercari-jp-listing-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body {"searches":["{{search}}"]}, mapping the row's search into the searches array.

MCP. In Claude, Cursor, or any MCP client with the Apify MCP server, ask for "Mercari Scraper: Japan New Listings & Sold Prices" — the agent will find and run this actor.

Tips

  • Price a card, lens or console by running the same keyword in Sold mode with a condition floor ("Like new or better"). The median of price over the last few dozen rows is a fair comp.
  • totalAvailable reads 15,000 on any broad keyword: that is Mercari's own display cap, not a real count. Narrow the search if you need everything.
  • Category and brand IDs are the numbers after category_id= and brand_id= in a jp.mercari.com search URL. Easiest path: set the filters on the site, then paste the URL as your search.
  • A BLOCKED status means Mercari returned 401, 403, 429 or 503. Lower "Max concurrency" or retry later. No proxy is needed by default.

vs. other Mercari scrapers

The busiest Mercari Japan actor on the Apify Store (fatihtahta's) has about 30 monthly users and is a one-off search export. Japan Alerts is a paid external alert service across several Japanese platforms, and Mercari's own app alerts cover one buyer's saved searches.

What it costsWhat you getTrade-off
This actor$2 per 1,000 listings; nothing for a miss or a quiet runSold comps mode, monitoring (new, newly sold, price drop, gone with Mercari-confirmed sales), sell-through rate, condition labels, seller type, up to 1,000 listings per searchNo listing descriptions or seller location (Mercari's search doesn't return them)
Mercari app alertsFreePush alerts for your own saved searchesNo export, no sold history in bulk, no automation
Paid alert servicesMonthly subscriptionAlerts across several platformsNot your data pipeline

Data & privacy

This actor reads public search results that anyone can see without logging in. It doesn't log in, solve CAPTCHAs or reveal hidden contact details. Seller identity is off by default: you get a private/business flag and an anonymous seller hash so you can group listings by seller without names. Turning on seller info makes you responsible for having a lawful reason to process it. Not affiliated with Mercari.

Seller phone numbers and emails are never collected.

FAQ

Is this allowed? It collects the same public listing data your browser shows, for the searches you choose. It's built for monitoring a search, not for copying the marketplace. Check that your use fits Mercari's terms and your local law.

Does it need a Mercari account or login? No. Mercari's web client signs each search request with a key pair it generates itself (a "DPoP" proof). This actor does the same with a fresh key pair per run. No account, login or token is involved. If Mercari ever requires a login for search, the actor reports it instead of working around it.

What does trading mean in Sold mode? The item was bought and the transaction is still in progress. Mercari's own "sold" filter includes these, so this actor does too; filter them out on listingStatus if you only want completed sales.

Why is shippingPaidBy empty on some rows? Mercari Shops listings don't report who pays shipping in search results.

Does it tell me which of my watched listings sold? Yes, with monitoring and "Alert on gone listings" on. A watched listing that leaves the on-sale results comes back as changeType: "gone", and Mercari's own item status decides soldConfirmed (true sold, false deleted or paused). Listings still for sale elsewhere in Mercari are not reported. For every recent sale in a search, not just your watched listings, use Sold mode instead.

Am I charged for gone listings? Only when "Alert on gone listings" is on, and then each gone row is an ordinary listing row ($2 per 1,000). The sale-status lookups behind soldConfirmed are free. goneCount and sellThroughRate are filled on every monitoring run either way.

Am I charged for a quiet monitoring run? No. When nothing is new you get one row with listingCount: 0 and no listing charge.

Can an AI agent call this directly? Yes. It's available through the Apify MCP server and the REST endpoint above.