# Mercari Scraper — Japan & US Listings, Prices & Sold Items (`tortuga/mercari-scraper`) Actor

Scrape Mercari Japan (jp.mercari.com) and Mercari US listings by keyword or search URL: price, sold status, condition, brand, size, seller, photos; optional full item details.

- **URL**: https://apify.com/tortuga/mercari-scraper.md
- **Developed by:** [Trevor Ortega](https://apify.com/tortuga) (community)
- **Categories:** E-commerce
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.80 / 1,000 listing scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Mercari Scraper — Japan & US Listings, Prices & Sold Items

Scrape **Mercari Japan** (jp.mercari.com, including Mercari Shops) and **Mercari US** (mercari.com) listings from a keyword or any search URL: title, price, status (on sale / sold), condition, category path, brand, size, who pays shipping and how it ships, seller id, auction bids, listing time, thumbnail and photo. Turn on **Include item details** to also get the full description, all photos, the seller's name and rating, likes, comments, ship-from area and item attributes.

It reads the same JSON search API the Mercari web apps use, so the data is complete and structured, runs are fast (120 listings per request on Mercari Japan, 100 on Mercari US) and you pay only for the listings you get. No login, no browser, no residential proxy needed. Use it for resale research and sourcing, sold-price comps, price tracking, or alerts for new listings.

### What data does Mercari Scraper extract?

Every listing from a search gives you:

| Field | Description |
|---|---|
| `market` | `jp` (Mercari Japan) or `us` (Mercari US) |
| `id`, `url` | Item id (`m12345678901`, or a Mercari Shops product id) and the item URL |
| `title` | Listing title as written by the seller |
| `price`, `currency` | Price in `JPY` (Japan) or `USD` (US). For Mercari Japan auctions this is the current highest bid |
| `originalPrice` | US: the previous price when the seller dropped it |
| `status`, `isSold` | `on_sale`, `trading` (sold, transaction in progress) or `sold_out`; `isSold` is true for the last two |
| `condition`, `conditionLocal`, `conditionId` | e.g. `"Like new"` / `"未使用に近い"` |
| `category`, `categoryId`, `categoryPath` | e.g. `"Games, Toys & Merchandise > Trading Cards > Pokémon Trading Card Game"` (English), with `categoryLocal` / `categoryPathLocal` in Japanese for Mercari Japan |
| `brand`, `brandId`, `size` | When the seller set them |
| `shippingPayer`, `shippingMethod` | Japan: `seller` (送料込み) or `buyer` (着払い) and the method, e.g. `らくらくメルカリ便` |
| `sellerId`, `sellerUrl` | Seller profile (or the Mercari Shops shop page) |
| `itemType`, `shopId` | `mercari` (C2C) or `shops` (Mercari Shops business seller) |
| `isAuction`, `auctionEndsAt`, `bidCount`, `startingPrice` | Mercari Japan auctions |
| `createdAt`, `updatedAt` | Listing time (and last update on Mercari Japan), ISO 8601 UTC |
| `thumbnail`, `photos` | Thumbnail and first photo URL (all photos with details) |
| `searchQuery`, `searchUrl`, `scrapedAt` | Which search the listing came from and when |

With **Include item details** on (or for single item URLs), each listing also gets:

| Field | Description |
|---|---|
| `description` | Full item description |
| `photos` | Every photo in full size |
| `sellerName`, `sellerRating`, `sellerRatingCount` | Seller display name, star rating (1-5) and number of ratings, as shown on the item page |
| `sellerItemsCount`, `sellerGoodRatings`, `sellerBadRatings`, `sellerSalesCount`, `sellerVerified` | Seller stats as shown (Japan / US) |
| `likes`, `comments` | Number of likes; number of comments (Mercari Japan) |
| `shippingFrom`, `shippingDuration` | Prefecture or state it ships from; Japan: days to ship (`"1~2日で発送"`) |
| `shippingFee`, `shippingClass` | US: shipping cost and weight class |
| `attributes` | Item attributes, e.g. `{"言語": "日本語版", "合計枚数/個数": "4枚"}` |
| `isAnonymousShipping`, `stock`, `soldAt` | Anonymous shipping (Japan), stock for Mercari Shops items, sold time (US) |
| `detailsFetched` | `true` when the item page was read |

### How to scrape Mercari Japan listings

1. Pick **Market**: Mercari Japan (default) or Mercari US.
2. Type one or more **Search terms**, e.g. `ポケモンカード`, `nintendo switch`, `chanel`. Japanese and English keywords both work on Mercari Japan.
3. Optionally set **Status** (on sale / sold), **Sort**, **Min/Max price**, **Condition**, **Category IDs**, **Brand IDs** or **Size IDs**.
4. Or paste search URLs from your browser into **Start URLs**: every filter you set on jp.mercari.com or mercari.com is applied (status, price, condition, category, brand, size, shipping, item type, attributes).
5. Set **Max items** and click **Start**. Download the results as JSON, CSV or Excel, or read them through the API.

### How to scrape sold items on Mercari (sold price comps)

Set **Status** to **Sold** (or add `status=sold_out%7Ctrading` to a jp.mercari.com URL, `itemStatuses=2-3` to a mercari.com URL). You get the sold listings with their final price, condition and listing time, which is what resellers use to price items. Keep **Status** at **All** if you want both, and filter on `isSold` afterwards.

### Input example

```json
{
  "market": "jp",
  "searchQueries": ["ポケモンカード box"],
  "status": "on_sale",
  "sort": "newest",
  "minPrice": 3000,
  "conditions": ["new"],
  "startUrls": [
    { "url": "https://www.mercari.com/search/?keyword=nintendo%20switch&itemStatuses=2-3" },
    { "url": "https://jp.mercari.com/item/m72905207423" }
  ],
  "maxItems": 200,
  "includeDetails": false
}
```

### Output example

A Mercari Japan listing with details (shortened):

```json
{
  "market": "jp",
  "id": "m72905207423",
  "url": "https://jp.mercari.com/item/m72905207423",
  "title": "コナンカード　セット　4枚",
  "price": 6999,
  "currency": "JPY",
  "status": "on_sale",
  "isSold": false,
  "condition": "New, unused",
  "conditionLocal": "新品、未使用",
  "category": "Detective Conan card game",
  "categoryPath": "Games, Toys & Merchandise > Trading Cards > Detective Conan card game",
  "categoryPathLocal": "ゲーム・おもちゃ・グッズ > トレーディングカード > 名探偵コナンカードゲーム",
  "shippingPayer": "seller",
  "shippingMethod": "郵便（定型、定形外、書留など）",
  "sellerId": "112423451",
  "sellerName": "ののかりあん",
  "sellerRating": 5,
  "sellerRatingCount": 65,
  "itemType": "mercari",
  "isAuction": false,
  "likes": 2,
  "comments": 0,
  "createdAt": "2026-10-05T12:15:36Z",
  "updatedAt": "2026-10-10T06:07:28Z",
  "thumbnail": "https://static.mercdn.net/thumb/item/jpeg/m72905207423_1.jpg?1791202536",
  "photos": ["https://static.mercdn.net/item/detail/orig/photos/m72905207423_1.jpg?1791202536"],
  "description": "スコッチ　SRP\n諸伏景光　SRP\n山村ミサオ　RP\nスコッチ　RP",
  "attributes": { "種別": "シングルカード 複数", "合計枚数/個数": "4枚", "言語": "日本語版" },
  "shippingDuration": "1~2日で発送",
  "detailsFetched": true
}
```

A Mercari US listing with details (shortened):

```json
{
  "market": "us",
  "id": "m19214492785",
  "url": "https://www.mercari.com/us/item/m19214492785/",
  "title": "Nintendo switch",
  "price": 250,
  "currency": "USD",
  "status": "on_sale",
  "condition": "Like new",
  "categoryPath": "Electronics > Video games & consoles > Consoles",
  "brand": "Nintendo",
  "shippingPayer": "seller",
  "shippingFrom": "Washington",
  "shippingFee": 7.48,
  "sellerName": "TITIRO",
  "sellerRating": 5,
  "sellerRatingCount": 182,
  "likes": 0,
  "createdAt": "2026-10-10T06:04:42Z",
  "photos": ["https://u-mercari-images.mercdn.net/photos/m19214492785_1.jpg?1791612282", "…"],
  "description": "Nintendo switch.  new red shells (joycon/console). …",
  "detailsFetched": true
}
```

### Monitor changes on a schedule

Turn on **Only new or changed items** and save the input as a task with a Schedule (for example every hour). The Actor remembers what earlier runs of the same search returned and outputs only new listings and listings whose price or status changed: price drops, new auction bids and items that sold. Unchanged listings are not output and not charged, so a quiet hour costs next to nothing. Each output item has `changeType` (`new` or `changed`) and, for changes, `previousValues` with the old price or status. Use **Sort: Newest first**, keep **Status: All** so sold items show up as changes, and set **Max items** to how many of the newest listings to check per run. **Monitoring key** keeps several watches on the same search apart.

### How many results can I get per search?

Mercari Japan serves at most 12,000 listings per search (100 pages of 120) and Mercari US at most 1,000, even when the site says more match. To get more, split a search by price range, category or condition, or add several searches; **Max items per search** caps each one so a busy keyword does not use up the run.

### Does it work without login or cookies?

Yes. It uses only what an anonymous visitor sees: Mercari Japan's web API with a per-run key pair (as the website itself does), and Mercari US's anonymous web session. No account, cookies or API key needed.

### Pricing

Pay per result, no subscription:

- **$2.80 per 1,000 listings** (event `result`).
- **+$2.00 per 1,000 item pages** when **Include item details** is on, and for single item URLs (event `detail`).

Platform usage is small: about $0.005 per 1,000 listings on top. Apify's free plan is enough to try it.

### Proxy note

The default Apify Proxy (datacenter) works for both markets. Cloudflare in front of mercari.com sometimes challenges datacenter IPs for a while; when that happens, the Actor retries those Mercari US requests through Apify residential proxy (US) automatically. Residential traffic is billed by Apify per GB, and a Mercari US request is only 4-35 KB, so this costs fractions of a cent.

### Integrations and API

Use the results in Zapier, Make, n8n or Google Sheets, or call the Actor from Python or Node.js with the Apify client. See the **API** tab for ready-made snippets.

### Is it legal to scrape Mercari?

The Actor collects only data that Mercari shows publicly to any visitor without logging in: listings, prices, photos and the seller names and ratings shown on item pages. It never logs in, never reads messages, addresses or purchase data. You are responsible for how you use the data and for complying with Mercari's terms and the law that applies to you (for example GDPR or APPI when you store seller names).

### Support

Found a bug or need a field or filter added? Open an issue in the **Issues** tab; it is usually answered within a day.

# Actor input Schema

## `market` (type: `string`):

Which Mercari to search with the search terms: Mercari Japan (jp.mercari.com, prices in JPY) or Mercari US (mercari.com, prices in USD). Start URLs always use the market of their own domain.

## `searchQueries` (type: `array`):

Keywords as you would type them into the Mercari search box, one search per line, e.g. "ポケモンカード", "nintendo switch", "chanel bag". Japanese and English keywords both work on Mercari Japan.

## `startUrls` (type: `array`):

Alternative to search terms: Mercari search pages with any filters set in the browser (https://jp.mercari.com/search?keyword=...\&status=on_sale, https://www.mercari.com/search/?keyword=...\&itemStatuses=1) or single item pages (https://jp.mercari.com/item/m12345678901, https://jp.mercari.com/shops/product/..., https://www.mercari.com/us/item/m12345678901/), which are returned with full details.

## `status` (type: `string`):

Used with the search terms: all listings (as Mercari shows them by default), only items on sale, or only sold items (sold out or in a transaction). Keep 'All' for monitoring so listings that sell are reported as changes.

## `sort` (type: `string`):

Used with the search terms. Newest first is the best choice for monitoring new listings.

## `minPrice` (type: `integer`):

Used with the search terms. In yen on Mercari Japan, in dollars on Mercari US.

## `maxPrice` (type: `integer`):

Used with the search terms. In yen on Mercari Japan, in dollars on Mercari US.

## `conditions` (type: `array`):

Used with the search terms: only these item conditions. Mercari Japan: New/unused, Like new, No noticeable scratches (Good), Some scratches (Fair), Scratches or stains (Poor), Poor condition (Bad). Mercari US has the first five. Empty = all.

## `categoryIds` (type: `string`):

Used with the search terms: one or more Mercari category ids, comma-separated. Take them from a Mercari URL: category_id=1289 on jp.mercari.com (Pokémon cards), categoryIds=84 on mercari.com (Video games & consoles). With no search term, the category is browsed.

## `brandIds` (type: `string`):

Used with the search terms: one or more Mercari brand ids, comma-separated, as in a Mercari URL (brand_id=... on jp.mercari.com, brandIds=... on mercari.com).

## `sizeIds` (type: `string`):

Used with the search terms: one or more Mercari size ids, comma-separated, as in a Mercari URL (size_id=... on jp.mercari.com, sizeIds=... on mercari.com).

## `excludeKeyword` (type: `string`):

Mercari Japan only: leave out listings that contain these words, e.g. "ジャンク" (junk) or "空箱" (empty box).

## `maxItems` (type: `integer`):

Stop after this many listings in total (across all searches). Keeps cost predictable. Mercari serves at most 12,000 listings per search on Mercari Japan and 1,000 on Mercari US; split big searches by price range or category to get more.

## `maxItemsPerSearch` (type: `integer`):

Optional cap for each search term or search URL, so one busy search does not use up Max items for the others (e.g. 50 newest listings for each of 10 keywords). Empty = no per-search cap.

## `includeDetails` (type: `boolean`):

Also open every item page for the full description, all photos, seller name and rating, likes, comments (Japan), ship-from area, shipping duration or fee and item attributes. One extra request per listing; charged as an extra 'detail' event (see pricing).

## `onlyNewOrChanged` (type: `boolean`):

Remember what earlier runs of this search returned and output only new items or items whose price/status changed (new listings, price drops, auction bids, items that sold). Use with a Schedule; unchanged items are not charged. With this on, Max items is the number of listings checked per run (e.g. the newest 100).

## `monitoringKey` (type: `string`):

Name for this watch, so several schedules on the same search stay separate; defaults to a key derived from the search input

## `proxyConfiguration` (type: `object`):

Apify Proxy (datacenter) works for both Mercari Japan and Mercari US and is the default; no residential proxy is needed.

## Actor input object example

```json
{
  "market": "jp",
  "searchQueries": [
    "nintendo switch"
  ],
  "startUrls": [],
  "status": "all",
  "sort": "newest",
  "conditions": [],
  "maxItems": 100,
  "includeDetails": false,
  "onlyNewOrChanged": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQueries": [
        "nintendo switch"
    ],
    "startUrls": [],
    "conditions": [],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("tortuga/mercari-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchQueries": ["nintendo switch"],
    "startUrls": [],
    "conditions": [],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("tortuga/mercari-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "nintendo switch"
  ],
  "startUrls": [],
  "conditions": [],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call tortuga/mercari-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tortuga/mercari-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/bXekIcBF7zSkWt83A/builds/FE3qEMde7WACETMuD/openapi.json
