Mercari API Scraper
Pricing
from $2.20 / 1,000 results
Mercari API Scraper
Mercari API 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.20 / 1,000 results
Rating
0.0
(0)
Developer
DevilScrapes
Maintained by CommunityActor stats
0
Bookmarked
15
Total users
5
Monthly active users
2 days ago
Last modified
Categories
Features
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
- 🔁 Retries with exponential backoff on rate-limits, Cloudflare challenges and transient errors — up to 8 attempts, each challenge retried on a fresh browser profile and proxy session,
Retry-Afterhonoured. - 🧱 Rate-limit-aware pacing — when the target pushes back, we slow down instead of getting banned.
- 🌐 US residential proxy by default — Mercari's Cloudflare challenges datacenter exits, so runs go through Apify's US residential proxy unless you choose otherwise.
- 🧊 Clean, typed dataset rows — validated fields, ISO-8601 timestamps, stable item IDs, deduplicated even when a keyword fans out across departments.
- 💰 Pay per output — no Actor start fee. You pay for the output events listed in Pricing.
💡 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. |
apify-default-dataset-item | $0.0025 | Per delivered dataset row | ||
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": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US"} | US residential proxy. Apify Proxy without a group also uses RESIDENTIAL US. |
Example input
{"keyword": "nintendo","category": "men","soldOnly": true,"soldWithinDays": 7,"includeDetails": true,"maxResults": 5,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US" }}
📤 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
No Actor start fee. You pay for the output events below.
| Event | USD per event | Billing unit |
|---|---|---|
apify-default-dataset-item | $0.0025 | Single result in the default dataset. |
1,000 output events cost $2.50 at the standard rate, with no start charge.
Existing subscriber discounts remain available in the Apify Pricing tab.
🚧 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?
Yes, and it is on by default. Mercari's Cloudflare challenges Apify datacenter exits, so proxyConfiguration defaults to Apify's US residential proxy. Leaving the group empty also uses RESIDENTIAL US.
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.