# Mercari Listings Scraper — No Login Required (`crowdpull/mercari-listings-scraper`) Actor

Extract product listings from Mercari search, item, and seller pages. No login or cookies needed. Supports keyword search, direct URLs, item IDs, seller inventory, filters, pagination, retries, and diagnostics.

- **URL**: https://apify.com/crowdpull/mercari-listings-scraper.md
- **Developed by:** [Crowd Pull](https://apify.com/crowdpull) (community)
- **Categories:** E-commerce, Lead generation, Automation
- **Stats:** 3 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.25 / 1,000 listing extracteds

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

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Mercari Listings Scraper

Extract Mercari product listings from search queries, search URLs, item IDs, and seller shop URLs. The actor is built for resale market monitoring, sold-comp collection, deal discovery, and inventory tracking workflows.

Mercari search is a browser-rendered Next.js experience. The actor uses a real browser, waits for Mercari's hydrated XHR responses, extracts structured listing data from the JSON payload when available, and falls back to rendered listing cards when network payload capture is unavailable. It is read-only and does not sign in, like, follow, buy, offer, message, or add anything to a cart.

### Features

- Search one or many Mercari keywords.
- Accept direct Mercari search, category, item, and seller URLs.
- Hydrate item IDs into current item status and price rows.
- Extract seller inventory from numeric `/u/{sellerId}` pages and resolve username profile URLs when Mercari exposes the member ID.
- Supports category, brand ID, condition, price, shipping payer, status, offerable, local pickup, authenticate, and sort filters.
- Captures price, status, condition, brand, size, color, seller, shipping, likes, images, timestamps, and canonical listing URLs when available.
- Saves `SUMMARY`, `SEARCH_SPECS`, and `FAILED_TARGETS` records to key-value storage.
- Defaults to US residential Apify proxy because Mercari's public web app relies on browser-minted session state.

### Example Input

```json
{
  "queries": ["coach bag"],
  "priceMin": 50,
  "priceMax": 300,
  "maxItems": 25,
  "pageSize": 60,
  "proxyConfig": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "US"
  }
}
```

### URL And Watchlist Input

```json
{
  "startUrls": [
    { "url": "https://www.mercari.com/search/?keyword=lululemon%20align&priceMax=60" },
    { "url": "https://www.mercari.com/u/242666380/" }
  ],
  "itemIds": ["m12345678901"],
  "maxItems": 50,
  "includeDetails": false
}
```

### Output

Each dataset row is either a `listing` row or a `diagnostic` row. Listing rows include normalized fields such as:

- `itemId`, `url`, `title`, `priceUsd`, `priceText`
- `condition`, `brand`, `size`, `color`, `category`
- `sellerId`, `sellerUsername`, `sellerRating`, `sellerReviewCount`, `sellerVerified`
- `shippingPayer`, `shippingType`, `shippingCostUsd`, `freeShipping`, `shipFromZip`
- `primaryImageUrl`, `imageUrls`, `listingStatus`, `likeCount`
- `mercariAuthenticate`, `smartPricing`, `offerable`, `localPickup`
- `createdTime`, `updatedTime`, `listedRelative`, `scrapedAt`

#### Example Output

```json
{
  "type": "listing",
  "source": "mercari",
  "status": "ok",
  "mode": "search",
  "query": "coach bag",
  "searchUrl": "https://www.mercari.com/search/?keyword=coach%20bag",
  "itemId": "m12345678901",
  "url": "https://www.mercari.com/us/item/m12345678901/",
  "title": "Vintage Y2K Mini Bag Shoulder Bag - Coach",
  "priceUsd": 68.37,
  "priceText": "$68.37",
  "brand": "Coach",
  "primaryImageUrl": "https://u-mercari-images.mercdn.net/photos/m12345678901_1.jpg",
  "listingStatus": "on_sale",
  "likeCount": 14,
  "scrapedAt": "2026-06-01T08:00:00.000Z"
}
```

### Pricing

This actor uses pay-per-event pricing. The primary charge starts at `$4.75 per 1,000` emitted listing rows, with standard Apify customer-tier discounts on higher plans.

- `listing-extracted`: charged once per listing row emitted to the default dataset.
- `search-page-loaded`: charged once per successful Mercari search page replay or browser page.
- `seller-page-loaded`: charged once per successful seller shop page.
- `item-detail-hydrated`: charged once per item detail page opened when `includeDetails` is enabled.

Platform usage is passed through with pay-per-event pricing so browser and residential-proxy costs remain transparent on small or proxy-heavy runs.

### Limitations

- Mercari filter IDs for categories, brands, subcategories, colors, sizes, and status can change across builds. Numeric IDs should be discovered from the live Mercari filter UI before large runs.
- Mercari uses bot-management cookies and session-bound XHR auth. Runs should use US residential proxies and low concurrency.
- Seller pages use scroll loading, so very large shops take longer than regular search pagination. Numeric seller URLs are most reliable; username profile URLs are resolved when the page exposes a member ID.
- The actor does not sign in and cannot access account-only data, buyer messages, checkout, saved searches, private likes, or seller dashboard data.
- The actor is read-only and never clicks Buy Now, Make Offer, Add to Cart, Like, Follow, or Sign In.

# Actor input Schema

## `queries` (type: `array`):

Free-form Mercari search keywords such as 'coach bag', 'lululemon align', or 'pokemon cards'.

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

Optional Mercari search, category, item, or seller URLs. Search URL parameters are preserved and can be combined with pagination.

## `itemIds` (type: `array`):

Mercari item IDs, usually starting with 'm'. Each ID is hydrated from the public item page.

## `sellerUrls` (type: `array`):

Mercari seller URLs such as https://www.mercari.com/u/123456789 or username profile URLs. Username profiles are resolved to numeric inventory URLs when Mercari exposes the member ID.

## `categoryId` (type: `integer`):

Mercari category or subcategory ID. These IDs can change across Mercari builds; use a live Mercari URL or a current UI-derived ID.

## `brandIds` (type: `array`):

Mercari numeric brand IDs. Brand IDs are category-aware and may change across Mercari builds.

## `itemConditions` (type: `array`):

Mercari condition IDs: 1 New, 2 Like New, 3 Good, 4 Fair, 5 Poor.

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

Minimum item price in USD.

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

Maximum item price in USD.

## `shippingPayerId` (type: `string`):

Mercari shipping payer ID. Use 1 for seller pays/free shipping, 2 for buyer pays.

## `authenticated` (type: `boolean`):

Filter to listings with Mercari Authenticate when supported by the category.

## `offerable` (type: `boolean`):

Filter to items that accept offers.

## `localPickup` (type: `boolean`):

Filter to local meetup listings when Mercari supports the parameter.

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

Optional Mercari status filter. Leave as Any unless you have confirmed the current URL parameter value.

## `sortBy` (type: `string`):

Mercari search sort order.

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

Maximum listing rows to emit across all inputs.

## `pageSize` (type: `integer`):

Mercari search page size. Mercari usually caps this around 120.

## `maxPages` (type: `integer`):

Maximum paginated search pages or seller-scroll batches per target.

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

Open item detail pages for emitted search rows. This is slower and costs more proxy bandwidth.

## `maxAttemptsPerTarget` (type: `integer`):

Retry blocked or empty pages with a fresh browser and proxy session.

## `navigationTimeoutSecs` (type: `integer`):

Per-page browser navigation timeout.

## `requestDelayMs` (type: `integer`):

Base delay between page navigations in milliseconds.

## `saveDebugHtml` (type: `boolean`):

Save blocked, failed, or empty page HTML to the default key-value store.

## `proxyConfig` (type: `object`):

US residential proxies are strongly recommended for Mercari because the result XHR depends on browser-minted session state.

## Actor input object example

```json
{
  "queries": [
    "coach bag"
  ],
  "shippingPayerId": "",
  "authenticated": false,
  "offerable": false,
  "localPickup": false,
  "status": "",
  "sortBy": "default",
  "maxItems": 10,
  "pageSize": 30,
  "maxPages": 1,
  "includeDetails": false,
  "maxAttemptsPerTarget": 2,
  "navigationTimeoutSecs": 30,
  "requestDelayMs": 500,
  "saveDebugHtml": false,
  "proxyConfig": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

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

No description

## `summary` (type: `string`):

No description

## `failedTargets` (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 = {
    "queries": [
        "coach bag"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("crowdpull/mercari-listings-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 = { "queries": ["coach bag"] }

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

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

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

```

## CLI example

```bash
echo '{
  "queries": [
    "coach bag"
  ]
}' |
apify call crowdpull/mercari-listings-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=crowdpull/mercari-listings-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

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