Mercari US Sold Listings Scraper avatar

Mercari US Sold Listings Scraper

Pricing

from $2.50 / 1,000 results

Go to Apify Store
Mercari US Sold Listings Scraper

Mercari US Sold Listings Scraper

Search Mercari US listings by keyword with a first-class sold/completed-listing filter — one row per item with price, condition, brand, category, seller, and photos. Built for reseller-arbitrage comps. No login; we handle the retries.

Pricing

from $2.50 / 1,000 results

Rating

0.0

(0)

Developer

DevilScrapes

DevilScrapes

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share


🎯 What this scrapes

Mercari US (mercari.com) doesn't publish a clean "sold comps" view — resellers digging for real recent sale prices are stuck scrolling active listings. This Actor reads Mercari's own server-rendered category pages (the same pages Google indexes, not a private reverse-engineered endpoint) with a first-class sold / completed-listing filter and an optional sold-within-days window, so arbitrageurs and flippers get exactly the comps they need without wading through active inventory.

Give it a keyword — optionally a category, a condition, a price band, and a "sold within the last N days" window — and it hands back one clean row per matching item: price, condition, brand, category, seller, photos, and (optionally) exact listing/sold dates and seller rating.

🔥 What we handle for you

  • 🛡️ Browser fingerprint rotationcurl-cffi impersonates real Chrome / Firefox TLS handshakes so Mercari sees a browser, not Python.
  • 🔁 Retries with exponential backoff on rate-limits and transient errors — up to 5 attempts, Retry-After honoured.
  • 🧱 Rate-limit-aware pacing — when the target pushes back, we slow down instead of getting banned.
  • 🌐 Proxy on standbyproxyConfiguration is available as an escape hatch, ready to flip on if Mercari tightens later, with no code changes on your end.
  • 🧊 Clean, typed dataset rows — Pydantic-validated, ISO-8601 timestamps, stable item IDs, deduplicated even when a keyword fans out across departments.
  • 💰 Pay-Per-Event pricing — you only pay for results that hit your dataset. No data, no charge (beyond the small actor-start warm-up fee).

💡 Use cases

  • Reseller-arbitrage comps — check what an item actually sold for recently before buying stock to flip.
  • Liquidation / dropship pricing — price a pallet or lot against real completed Mercari sales, not asking prices.
  • Demand tracking — watch how fast a keyword's listings move from active to sold within a rolling window.
  • Sourcing research — see which condition and price bands are actually selling versus sitting active.

⚙️ How to use it

  1. Click Try for free at the top of the page.
  2. Set keyword to whatever you're pricing (e.g. "nintendo").
  3. Optionally pick a category — leave it unset to fan out across all 17 departments (uses more requests per run).
  4. Turn on soldOnly and set soldWithinDays for a recent-comps window.
  5. Turn on includeDetails if you want listing/sold dates and seller rating per row (one extra request per item).
  6. Click Start. Rows stream into the run's dataset as they're found.
  7. Export from Storage → Dataset as JSON, CSV, or Excel — or fetch via the API.

📥 Input

FieldTypeRequiredDefaultNotes
keywordstringyesFree-text search term, e.g. "nintendo".
categorystringnofans out over all 17One Mercari department — women, men, kids, home, vintage_collectibles, beauty, electronics, sports_outdoors, handmade, other, arts_crafts, books, pet_supplies, toys_collectibles, garden_outdoor, office, tools.
conditionIdsarrayno1=New … 5=Poor. Applied client-side after fetch.
priceMin / priceMaxnumbernoUSD. Applied client-side after fetch.
soldOnlybooleannofalseOnly trading/sold_out listings — Mercari's own "Sold" facet.
soldWithinDaysintegernoOnly items sold in the last N days (1-365). Requires soldOnly.
includeDetailsbooleannofalseFetch each item's detail page for listing/sold dates + seller rating.
maxResultsintegerno100Cap on total emitted rows per run, 1-2000.
proxyConfigurationobjectno{"useApifyProxy": false}Not required for this target; kept as a forward-looking escape hatch.

Example input

{
"keyword": "nintendo",
"category": "men",
"soldOnly": true,
"soldWithinDays": 7,
"includeDetails": true,
"maxResults": 5,
"proxyConfiguration": { "useApifyProxy": false }
}

📤 Output

One dataset row per matched item:

FieldTypeNotes
item_idstringMercari's own item ID, e.g. m96557170766.
titlestringListing title.
price / original_pricenumber | nullCurrent / original asking price, USD.
currencystringAlways "USD".
statusstringon_sale, trading, sold_out, stop, or cancel.
soldbooleanDerived: status is trading or sold_out.
condition / brandstring | nullItem condition and brand tag.
category / category_idstring / integerThe item's own (usually leaf-level) category — not an echo of the requested department.
seller_idintegerSeller's numeric Mercari ID.
seller_username, seller_rating_avg, seller_rating_countmixed, nullableEnrichment only (includeDetails: true).
item_urlstringCanonical mercari.com/us/item/{id}/ URL.
thumbnail_url / photo_urlsstring | null / arrayFirst photo, and the full photo list.
shipping_payerstring | nullWho pays shipping.
listing_date / sold_datestring | nullEnrichment only. sold_date is a last-status-change proxy, not a guaranteed sale instant.
scraped_atstringISO-8601 UTC timestamp for this row.

Example output

{
"item_id": "m96557170766",
"title": "Mario Hanafuda card T-shirt (Size XXL) - Nintendo Japan exclusive (NEW)",
"price": 59.0,
"original_price": 58.0,
"currency": "USD",
"status": "trading",
"sold": true,
"condition": "New",
"brand": "Nintendo",
"category": "T-Shirts for Men",
"category_id": 303,
"seller_id": 348351597,
"item_url": "https://www.mercari.com/us/item/m96557170766/",
"thumbnail_url": "https://u-mercari-images.mercdn.net/photos/m96557170766_1.jpg?1773934282&width=200&height=200",
"listing_date": null,
"sold_date": null,
"scraped_at": "2026-07-21T06:40:00.000Z"
}

💰 Pricing

Pay-Per-Event — you pay only when these events fire:

EventUSDWhat it is
actor-start$0.01One-off warm-up charge per run
item-result$0.0025Per listing row written to the dataset
item-detail-enrichment$0.0015Per row, only when includeDetails is on

Example: 1 000 results ≈ $2.51 base, ≈ $4.01 with detail enrichment on. No subscription, no minimum, no card to start — Apify gives every new account $5 of free credit.

🚧 Limitations

sold_date is a last-status-change proxy (the item detail page's own "updated" timestamp) — not a guaranteed exact sale instant. Mercari retires sold-item history after roughly a year; older sold items return a purge signal and are skipped, not faked. conditionIds / priceMin / priceMax are applied client-side after fetch, not as a confirmed server-side filter — a narrow filter combined with a broad keyword and no category can cost extra pagination. Custom sort order isn't supported; results follow Mercari's own default relevance ranking. Mercari Japan (jp.mercari.com) is a different site and out of scope.

❓ FAQ

What counts as "sold" here?

Mercari's own UI groups itemStatuses 2 (trading / in escrow) and 3 (sold_out) under one "Sold" facet — soldOnly=true matches that same definition, not just fully closed-out listings.

Is sold_date the exact moment of sale?

It's a proxy — the item detail page's own last-updated timestamp, which moves when status flips to sold/trading. Close, not certified exact-to-the-second.

Do I need a proxy?

No — Mercari's category pages are keyless and server-rendered, so proxyConfiguration defaults off. It stays present as a forward-looking escape hatch.

What happens with old, purged sold items?

Mercari retires sold-item history after roughly a year; those return a purge signal and are skipped, not silently faked.

💬 Your feedback

Spotted a bug, a field that doesn't match reality, or a Mercari category we're missing? Open an issue on the Actor's Issues tab on Apify Console — the devil's in the data, and we'd rather fix it than let it slide.