Mercari US Sold Listings Scraper
Pricing
from $2.50 / 1,000 results
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
Maintained by CommunityActor 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 rotation —
curl-cffiimpersonates 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-Afterhonoured. - 🧱 Rate-limit-aware pacing — when the target pushes back, we slow down instead of getting banned.
- 🌐 Proxy on standby —
proxyConfigurationis 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-startwarm-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
- Click Try for free at the top of the page.
- Set
keywordto whatever you're pricing (e.g."nintendo"). - Optionally pick a
category— leave it unset to fan out across all 17 departments (uses more requests per run). - Turn on
soldOnlyand setsoldWithinDaysfor a recent-comps window. - Turn on
includeDetailsif you want listing/sold dates and seller rating per row (one extra request per item). - Click Start. Rows stream into the run's dataset as they're found.
- Export from Storage → Dataset as JSON, CSV, or Excel — or fetch via the API.
📥 Input
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
keyword | string | yes | — | Free-text search term, e.g. "nintendo". |
category | string | no | fans out over all 17 | One 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. |
conditionIds | array | no | — | 1=New … 5=Poor. Applied client-side after fetch. |
priceMin / priceMax | number | no | — | USD. Applied client-side after fetch. |
soldOnly | boolean | no | false | Only trading/sold_out listings — Mercari's own "Sold" facet. |
soldWithinDays | integer | no | — | Only items sold in the last N days (1-365). Requires soldOnly. |
includeDetails | boolean | no | false | Fetch each item's detail page for listing/sold dates + seller rating. |
maxResults | integer | no | 100 | Cap on total emitted rows per run, 1-2000. |
proxyConfiguration | object | no | {"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:
| Field | Type | Notes |
|---|---|---|
item_id | string | Mercari's own item ID, e.g. m96557170766. |
title | string | Listing title. |
price / original_price | number | null | Current / original asking price, USD. |
currency | string | Always "USD". |
status | string | on_sale, trading, sold_out, stop, or cancel. |
sold | boolean | Derived: status is trading or sold_out. |
condition / brand | string | null | Item condition and brand tag. |
category / category_id | string / integer | The item's own (usually leaf-level) category — not an echo of the requested department. |
seller_id | integer | Seller's numeric Mercari ID. |
seller_username, seller_rating_avg, seller_rating_count | mixed, nullable | Enrichment only (includeDetails: true). |
item_url | string | Canonical mercari.com/us/item/{id}/ URL. |
thumbnail_url / photo_urls | string | null / array | First photo, and the full photo list. |
shipping_payer | string | null | Who pays shipping. |
listing_date / sold_date | string | null | Enrichment only. sold_date is a last-status-change proxy, not a guaranteed sale instant. |
scraped_at | string | ISO-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:
| Event | USD | What it is |
|---|---|---|
actor-start | $0.01 | One-off warm-up charge per run |
item-result | $0.0025 | Per listing row written to the dataset |
item-detail-enrichment | $0.0015 | Per 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.