Mercari API Scraper avatar

Mercari API Scraper

Pricing

from $2.20 / 1,000 results

Go to Apify Store
Mercari API Scraper

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

DevilScrapes

Maintained by Community

Actor stats

0

Bookmarked

15

Total users

5

Monthly active users

2 days ago

Last modified

Categories

Features

Limited permissions

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-After honoured.
  • 🧱 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

  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
keywordstringyes—Free-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.
conditionIdsarrayno—1=New … 5=Poor. Applied client-side after fetch.
priceMin / priceMaxnumberno—USD. Applied client-side after fetch.
soldOnlybooleannofalseOnly trading/sold_out listings — Mercari's own "Sold" facet.
apify-default-dataset-item$0.0025Per delivered dataset row
soldWithinDaysintegerno—Only 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": 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:

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

No Actor start fee. You pay for the output events below.

EventUSD per eventBilling unit
apify-default-dataset-item$0.0025Single 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.