# Mercari Japan Scraper (`parsebird/mercari-japan-scraper`) Actor

Extract Mercari Japan listings: title, price, brand, condition, seller, shipping, category, photos, and auction data from search, category, and item pages. No login required.

- **URL**: https://apify.com/parsebird/mercari-japan-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.49 / 1,000 listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Japan Scraper

**Mercari Japan Scraper** extracts structured listing data from [Mercari Japan](https://jp.mercari.com) — Japan's largest consumer-to-consumer marketplace — straight from search result pages, category pages, and individual item pages, with no Mercari account or login required.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Pull title, price, brand, condition, seller, shipping, category, photos, and auction data for any Mercari Japan search, category, or listing URL — normalized into one consistent JSON schema, ready for resale-pricing pipelines and analytics.
</td>
</tr></table>

<br>

##### Copy to your AI assistant

```
Use the Apify Actor "parsebird/mercari-japan-scraper" to scrape Mercari Japan (jp.mercari.com). Call it with the Apify API or the apify-client SDK, e.g. in Python: `from apify_client import ApifyClient; client = ApifyClient("<APIFY_TOKEN>"); run = client.actor("parsebird/mercari-japan-scraper").call(run_input={"startUrls": ["https://jp.mercari.com/en/search?keyword=apple%20watch"], "keyword": "apple watch", "sort": "created_time", "order": "desc", "status": ["on_sale", "sold_out"], "priceMin": 1000, "priceMax": 50000, "limit": 1000}); items = client.dataset(run["defaultDatasetId"]).list_items().items`. Inputs: startUrls (string[], required, search/category/item URLs), keyword (string, optional override), sort (score|created_time|price), order (desc|asc), status (on_sale|sold_out|trading), priceMin/priceMax (integer, JPY), limit (integer, default 50000, max listings per start URL). Output: one JSON record per listing with listing_id, title, price, currency, brand, listing_status, condition_id, seller, shipping, catalog, media, auction, timestamps, and engagement fields. Full API spec: https://apify.com/parsebird/mercari-japan-scraper/api. Get an API token at https://console.apify.com/account/integrations.
```

### What does Mercari Japan Scraper do?

Mercari Japan Scraper (also usable as a **Mercari API alternative** or **Mercari JP data extraction tool**) turns any `jp.mercari.com` URL into structured JSON:

- 🔍 **Search & category pages** — pass a search URL (`?keyword=...`) or a category URL (`?category_id=...`) and paginate through results automatically
- 🏷️ **Individual item pages** — pass a direct `jp.mercari.com/item/mXXXXXXXXXX` URL to get full listing detail, including description-level fields not present in search results
- 🔀 **Mix URL types freely** — combine search, category, and item URLs in a single run
- ⚙️ **Global filters** — override keyword, sort by relevance/newest/price, filter by listing status (on sale, sold out, trading), and set a min/max price in JPY across every search seed
- 🎯 **Auction data included** — Mercari's auction-style listings return bid count, highest bid, and initial price alongside standard fields
- 🧹 **Automatic deduplication** — the same listing found via multiple start URLs is only saved and charged once
- 🚫 **No login, no cookies, no browser** — the Actor talks directly to Mercari's own public search API, so runs are fast and don't need residential proxies for typical volumes

On top of the extraction logic, every run gets Apify platform features: [scheduling](https://docs.apify.com/platform/schedules) for recurring price monitoring, full [API access](https://docs.apify.com/api/v2) and [webhooks](https://docs.apify.com/platform/integrations/webhooks), ready-made [integrations](https://apify.com/integrations) with Zapier, Make, n8n, and Google Sheets, and one-click export to JSON, CSV, Excel, XML, HTML, or RSS.

### What data can you extract from Mercari Japan?

| Field | Description |
|-------|-------------|
| `listing_id` / `id` | Mercari item ID (e.g. `m84015541919`) as string and numeric form |
| `title` | Listing title |
| `price` | Listed price in JPY |
| `brand` / `brand_name` | Brand ID, name, and sub-name when tagged |
| `listing_status` | `ITEM_STATUS_ON_SALE`, `ITEM_STATUS_SOLD_OUT`, or `ITEM_STATUS_TRADING` |
| `condition_id` | Item condition code (new, like new, used, etc.) |
| `seller` | Seller ID and buyer ID (when sold) |
| `shipping` | Shipping payer and shipping method codes |
| `catalog` | Category ID and size IDs |
| `media` | Thumbnail and full-size photo URLs |
| `auction` | Auction ID, bid deadline, total bids, highest bid, initial price (for auction-style listings) |
| `timestamps` | Created and last-updated Unix timestamps |
| `engagement` | Liked flag and no-price flag |

Full field-by-field reference is in the [Output example](#output-example) section below.

### How to use Mercari Japan Scraper

1. Open the Actor's **Input** tab in Apify Console.
2. Paste one or more `jp.mercari.com` URLs into **Start URLs** — search pages, category pages, or item pages.
3. (Optional) Set a **Keyword override** to apply one search term across every search/category URL, and adjust **Sort by**, **Sort direction**, **Listing status**, and **Min/Max price**.
4. Set **Max listings per URL** to control how deep each search or category seed paginates.
5. Click **Start** and watch results land in the dataset in real time.
6. Export the dataset as JSON, CSV, Excel, XML, HTML, or RSS from the **Storage** tab, or pull it via the [Apify API](https://docs.apify.com/api/v2).

### Output example

```json
{
  "type": "listing",
  "id": 84015541919,
  "url": "https://jp.mercari.com/item/m84015541919",
  "listing_id": "m84015541919",
  "title": "た*中様 Apple Watch 箱のみ",
  "price": "400",
  "currency": "JPY",
  "brand_name": "Apple",
  "brand": { "id": 3272, "name": "Apple", "sub_name": "Apple" },
  "listing_status": "ITEM_STATUS_SOLD_OUT",
  "listing_type": "ITEM_TYPE_MERCARI",
  "condition_id": 2,
  "seller": { "seller_id": 670753842, "buyer_id": "" },
  "shipping": { "payer_id": 2, "method_id": 14 },
  "catalog": { "category_id": 3682, "size_ids": [] },
  "store": { "name": "", "details": null },
  "media": {
    "thumbnail_urls": ["https://static.mercdn.net/thumb/item/jpeg/m84015541919_1.jpg?1772980274"],
    "photo_urls": ["https://static.mercdn.net/item/detail/orig/photos/m84015541919_1.jpg?1772980274"]
  },
  "promotions": [],
  "auction": {
    "auction_id": "21189628",
    "bid_deadline": "2026-03-27T11:41:15Z",
    "total_bid_count": "1",
    "highest_bid": "400",
    "initial_price": "300"
  },
  "timestamps": { "created_unix": "1772980274", "updated_unix": "1774946740" },
  "engagement": { "is_liked": false, "is_no_price": false },
  "scrape_context": {
    "seed": { "type": "item_url", "value": "https://jp.mercari.com/item/m84015541919" },
    "source": { "source_url": "https://jp.mercari.com/item/m84015541919", "item_url": "https://jp.mercari.com/item/m84015541919" },
    "scraped_time": 1789816041
  }
}
```

This is real, unmodified output captured while testing this Actor. Fields are best-effort: some are only populated for auction listings, shop listings, or one of the two source page types, so always null-check optional fields downstream. Use `type + ":" + id` as an idempotency key when deduplicating or upserting across runs.

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("parsebird/mercari-japan-scraper").call(run_input={
    "startUrls": ["https://jp.mercari.com/en/search?keyword=apple%20watch"],
    "sort": "created_time",
    "order": "desc",
    "status": ["on_sale", "sold_out"],
    "priceMin": 1000,
    "priceMax": 50000,
    "limit": 1000,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], item["price"])
```

#### JavaScript

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

const client = new ApifyClient({ token: '<APIFY_TOKEN>' });
const run = await client.actor('parsebird/mercari-japan-scraper').call({
    startUrls: ['https://jp.mercari.com/en/search?keyword=apple%20watch'],
    sort: 'created_time',
    order: 'desc',
    status: ['on_sale', 'sold_out'],
    priceMin: 1000,
    priceMax: 50000,
    limit: 1000,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Use cases

- **Resale & arbitrage research** — compare Mercari Japan prices for electronics, sneakers, collectibles, and fashion against other marketplaces
- **Sold-price / comps tracking** — filter by `sold_out` and `trading` status to build historical sold-price datasets, including auction final prices
- **Category and brand monitoring** — watch a category or brand for new listings, price drops, or counterfeit activity
- **Sourcing for dropshipping** — pull structured product and seller data for sourcing pipelines
- **Market research and ML pricing models** — feed normalized JSON directly into pricing or demand-forecasting models
- **Seller and inventory tracking** — monitor a specific seller's listings over time via scheduled runs

### How it works

1. Each start URL is classified as either an **item page** (`/item/mXXXXXXXXXX`) or a **search/category page** (`/search?...`).
2. For search/category URLs, the Actor builds a search request from the URL's own query parameters (keyword, category, brand, size, condition, shipping payer, color) plus your global overrides, signs it with a fresh DPoP proof (RFC 9449, ES256), and calls Mercari's own public search API.
3. Results are paginated using Mercari's page tokens until **Max listings per URL** is reached or results run out.
4. For item URLs, the Actor signs and calls Mercari's item-detail API directly, which returns richer per-listing detail (auction history, full photo set, shipping details).
5. Both response shapes are normalized into one consistent output schema, deduplicated by listing ID, and pushed to the dataset.
6. Each unique listing saved triggers one billing event.

### How much does it cost to scrape Mercari Japan?

Mercari Japan Scraper uses Apify's [Pay-Per-Event](https://docs.apify.com/platform/actors/publishing/monetize#pay-per-event-pricing) pricing — you're billed per listing saved, not per compute unit, and your Apify plan tier automatically gets a lower rate:

| Apify plan | Price per listing | Price per 1,000 listings |
|------------|-------------------|---------------------------|
| Free | $0.00299 | **$2.99** |
| Bronze | $0.00249 | **$2.49** |
| Silver | $0.00199 | **$1.99** |
| Gold | $0.00149 | **$1.49** |

One billing event fires each time a new, unique listing is saved to the dataset — duplicate listings found across multiple start URLs are never double-charged. Scraping 1,000 unique listings on a Free Apify account costs about $2.99; the same run on a Gold plan costs about $1.49. Apify also gives every account a free monthly usage allowance that covers this Actor's platform (non-event) costs for light usage — see [Apify pricing](https://apify.com/pricing) for current plan details.

### FAQ

**Do I need a Mercari account to use this Actor?**
No. It calls Mercari Japan's own public, unauthenticated search and item APIs the same way the `jp.mercari.com` website does — no login, cookies, or session required.

**Can I scrape sold or expired listings?**
Yes. Set **Listing status** to `sold_out` and/or `trading` to pull historical sold-price data, including final auction prices.

**Does the Actor return results in exactly "newest first" order when I sort by created time?**
Mostly, but not guaranteed — Mercari's own search index does not promise perfectly exact ordering for the "Newest" sort, a known quirk of the underlying API rather than this Actor.

**Can I filter by category or brand?**
Yes — include a `category_id`, `brand_id`, `size_id`, `item_condition_id`, `shipping_payer_id`, or `color_id` query parameter directly in a start URL (the same parameters `jp.mercari.com/search` uses), and the Actor will apply them automatically.

**Can I schedule recurring runs?**
Yes. Use Apify's [Scheduler](https://docs.apify.com/platform/schedules) to run this Actor daily, hourly, or on any custom interval, and pair it with [webhooks](https://docs.apify.com/platform/integrations/webhooks) or integrations to push new listings to Slack, Sheets, or your own API automatically.

**Something looks wrong or missing — where do I report it?**
Open an issue on the Actor's **Issues** tab in Apify Console. Mercari occasionally changes response fields on their end, and we monitor and patch quickly.

**Can I call this from my own code instead of the Console?**
Yes — see the [Python and JavaScript examples](#python) above, or the full [API reference](https://apify.com/parsebird/mercari-japan-scraper/api).

### Is it legal to scrape Mercari Japan?

Scraping publicly available data, such as listings visible to any visitor on `jp.mercari.com` without logging in, is generally considered legal, but you're responsible for how you use the collected data and for complying with Mercari's own [Terms of Service](https://jp.mercari.com/terms) and applicable data protection laws (such as Japan's APPI or the EU's GDPR) in your jurisdiction. Avoid collecting personal data beyond what's needed, and don't use this Actor to overload Mercari's servers. Read more in Apify's blog post on [the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

### Related Actors

- [Naver Shopping Scraper](https://apify.com/parsebird/naver-shopping-scraper) — product and pricing data from Naver Shopping (South Korea)
- [Coupang Korea Product Scraper](https://apify.com/parsebird/coupang-scraper) — product listings from Coupang (South Korea)
- [AliExpress Scraper](https://apify.com/parsebird/aliexpress-scraper) — products and sellers from AliExpress
- [Walmart Product Scraper](https://apify.com/parsebird/walmart-product-scraper) — product data from Walmart.com
- [Target Product Scraper](https://apify.com/parsebird/target-product-scraper) — product data from Target.com
- [MercadoLibre Scraper](https://apify.com/parsebird/mercadolibre-scraper) — listings from MercadoLibre (Latin America)

# Changelog

This Actor's version history is a separate document: https://apify.com/parsebird/mercari-japan-scraper/changelog.md

# Actor input Schema

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

One or more jp.mercari.com URLs to scrape: search result pages, category pages, or individual item pages (e.g. https://jp.mercari.com/item/m84015541919). You can mix all three types in the same run.

## `keyword` (type: `string`):

Optional search term applied to every search/category start URL in this run, replacing whatever keyword is already in each URL. Leave empty to use each URL's own keyword.

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

Order search results by relevance, listing date, or price. Note: Mercari's own search index does not always return a perfectly exact order for Newest.

## `order` (type: `string`):

Sort direction to use with Sort by.

## `status` (type: `array`):

Restrict results to listings in these statuses. Leave empty to include all statuses.

## `priceMin` (type: `integer`):

Exclude listings priced below this amount, in Japanese yen.

## `priceMax` (type: `integer`):

Exclude listings priced above this amount, in Japanese yen.

## `limit` (type: `integer`):

Maximum number of listings to save per search or category start URL. Use a low value for a quick test run.

## Actor input object example

```json
{
  "startUrls": [
    "https://jp.mercari.com/en/search?keyword=apple%20watch"
  ],
  "limit": 30
}
```

# Actor output Schema

## `dataset` (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 = {
    "startUrls": [
        "https://jp.mercari.com/en/search?keyword=apple%20watch"
    ],
    "limit": 30
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/mercari-japan-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 = {
    "startUrls": ["https://jp.mercari.com/en/search?keyword=apple%20watch"],
    "limit": 30,
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/mercari-japan-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 '{
  "startUrls": [
    "https://jp.mercari.com/en/search?keyword=apple%20watch"
  ],
  "limit": 30
}' |
apify call parsebird/mercari-japan-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parsebird/mercari-japan-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/XoVxwMzYwdDKBA1Pe/builds/57KbtHwklGucx5z0i/openapi.json
