# Mercari Sold Price & Sell-Through Scraper (`kitebuilds/resale-sold-comps`) Actor

Scrape Mercari SOLD listings: final sold prices, sell-through rate, days-to-sell, condition & brand from one search term. Sold comps for reseller pricing & Japan-sourcing arbitrage — not active listings. Mercari Japan live; US + Depop roadmap.

- **URL**: https://apify.com/kitebuilds/resale-sold-comps.md
- **Developed by:** [Kite](https://apify.com/kitebuilds) (community)
- **Categories:** E-commerce, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 Sold Price & Sell-Through Scraper (Mercari Japan)

**Scrape Mercari SOLD listings — final sold prices, sell-through rate, days-to-sell, condition and brand — from one search term.** Every other Mercari scraper on the Store returns *active listings* (asking prices). This one returns **sold history**: what items actually sold for and how fast — the data resellers, Japan-sourcing arbitrageurs and pricing tools actually pay for.

> Asking prices tell you what sellers *hope* to get. **Sold prices tell you what buyers actually paid.** This Actor gives you the second one — plus the real demand signal: sell-through rate.

**Scope (honest):** **Mercari Japan is live and verified** (public JSON API, JPY, no login, runs without residential proxy). Mercari US and Depop are on the roadmap (both need a residential proxy at runtime and are not yet verified — see *Platform support* below).

### What you get

For each **sold** item:

| field | description |
|-------|-------------|
| `platform` | `mercari_jp` (live); `mercari_us` / `depop` on roadmap |
| `title` | item title |
| `soldPrice` | **final sold price** (number) |
| `currency` | `JPY` (Mercari Japan) |
| `condition` | New / Like new / Good / Fair / Poor / Damaged |
| `brand` | brand name when present |
| `soldDate` | date the sale completed (`soldDateEstimated: true` — derived from last status change) |
| `daysToSell` | days from listing to sale (`daysToSellEstimated: true`) |
| `url` | listing URL |
| `imageUrl` | first photo |
| `query` | the search term you passed |

Plus a `SUMMARY` record (in the run's key-value store) — instant pricing intelligence:

```json
{
  "count": 8,
  "medianSoldPrice": 11300,
  "avgSoldPrice": 17320.63,
  "p25SoldPrice": 5500,
  "p75SoldPrice": 28980,
  "avgDaysToSell": 18.25,
  "sellThroughRate": 0.6,
  "currency": "JPY"
}
````

`sellThroughRate` = sold count / (sold + active count) for your query — a real **demand signal** computed from Mercari's own result totals. A high sell-through + short days-to-sell = a fast-moving item worth sourcing.

#### Example output (one real row)

```json
{
  "platform": "mercari_jp",
  "title": "幻級 70s PENDLETON オンブレ ペンドルトン",
  "soldPrice": 5500,
  "currency": "JPY",
  "condition": "Good",
  "brand": "PENDLETON",
  "soldDate": "2026-05-30",
  "soldDateEstimated": true,
  "daysToSell": 4,
  "daysToSellEstimated": true,
  "url": "https://jp.mercari.com/item/m76760088287",
  "imageUrl": "https://static.mercdn.net/thumb/item/webp/m76760088287_1.jpg",
  "query": "pendleton flannel"
}
```

### Use cases

- **Reseller pricing** — price your listings off what *actually sold*, not optimistic asks. Median + p25/p75 sold price per keyword in one run.
- **Japan-sourcing arbitrage** — vintage denim (Levi's, Lee, Wrangler), workwear and designer goods often sell 50-75% cheaper on Mercari Japan than on US resale. Pull JP sold comps to find what flips and what it's worth.
- **Inventory sell-through analysis** — `sellThroughRate` + `avgDaysToSell` tell you which SKUs move fast before you buy them.
- **Market & trend research** — track sold-price drift, brand demand and condition premiums over time for any search term.
- **Feeding pricing tools / dashboards** — clean normalized JSON to power a repricer, a sourcing screener, or a BI dashboard.

### Input

| field | type | default | notes |
|-------|------|---------|-------|
| `searchTerm` | string | — | **required** |
| `platform` | enum `both` / `mercari` / `depop` | `mercari` | `mercari` (Japan) is the live, verified path |
| `mercariMarket` | enum `jp` / `us` | `jp` | `jp` = fully supported (public JSON API, JPY). `us` = roadmap (needs residential proxy). |
| `maxItems` | int | 50 | per platform |
| `condition` | string | — | optional case-insensitive substring filter |
| `priceMin` / `priceMax` | int | — | optional |
| `proxyConfiguration` | proxy | RESIDENTIAL | optional for JP; required for US/Depop roadmap paths |

#### Example input

```json
{
  "searchTerm": "Pendleton flannel",
  "platform": "mercari",
  "mercariMarket": "jp",
  "maxItems": 50
}
```

### Platform support (honest status)

- **Mercari Japan (`mercariMarket: "jp"`) — LIVE, verified on-platform.** Uses Mercari's public `api.mercari.jp/v2/entities:search` JSON API with a self-signed DPoP proof (no login, no account). Clean per-item sold status + result totals for sell-through. Prices in JPY. Works without a residential proxy. Verified on the Apify cloud (a real run returns sold comps + full SUMMARY).
- **Mercari US (`mercariMarket: "us"`) — roadmap, not yet verified.** The US web API is session-auth-gated, so this path drives a real browser to mint the session and read the in-page search JSON. Requires a **residential proxy** at runtime (datacenter IPs are tunnel-blocked).
- **Depop — roadmap, not yet verified.** Public `webapi.depop.com/api/v3/search` API with an `isSold` flag, but it sits behind Cloudflare bot protection that a clean residential IP alone does not defeat. Use Mercari Japan for guaranteed results.

### Proxy

Mercari blocks datacenter IPs on most paths, but the **Mercari Japan JSON path is the forgiving one** and is the recommended default — it runs without a residential proxy. The US/Depop roadmap paths will require **Apify RESIDENTIAL** proxy.

### Pricing

**Pay-per-result (coming): ~$2 per 1,000 sold-comp records.** No subscription. You only pay for sold items actually returned. This sits above raw active-listing scrapers because sold/sell-through data is higher-value and harder to get — yet trivial next to the margin a reseller protects per item. (Pricing is being finalized in Apify's monetization flow.)

### Legal / scope

Public, non-authenticated search data only. **No login, no buyer PII, no seller names/emails** — aggregate price intelligence only, the same risk class as the eBay/Poshmark sold-comps actors already on the Store. The Actor backs off and rotates sessions to respect rate limits.

### Local development

```bash
npm install
npm test          ## offline unit tests (DPoP signature, normalization, stats)
npm start         ## runs the Actor locally (reads INPUT from ./storage)
```

# Actor input Schema

## `searchTerm` (type: `string`):

What to look up sold comps for, e.g. 'Pendleton flannel' or 'Nike Dunk Low Panda'.

## `platform` (type: `string`):

Which marketplace(s) to pull sold comps from. Mercari is fully supported; Depop is best-effort (see README).

## `mercariMarket` (type: `string`):

Which Mercari catalog. 'jp' (Mercari Japan, prices in JPY) works via the public DPoP JSON API and is the fully supported path. 'us' (Mercari US, USD) uses a browser session and requires residential proxy — best-effort.

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

Maximum number of SOLD items to return per platform. Pagination stops once this is reached.

## `condition` (type: `string`):

Only keep sold items whose condition matches this value (case-insensitive substring), e.g. 'new', 'good'. Leave empty for all.

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

Drop sold items below this price (in the platform's currency).

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

Drop sold items above this price (in the platform's currency).

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

Proxy settings. Residential proxies are STRONGLY recommended — Mercari/Depop block datacenter IPs.

## Actor input object example

```json
{
  "searchTerm": "Pendleton flannel",
  "platform": "mercari",
  "mercariMarket": "jp",
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "searchTerm": "Pendleton flannel",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("kitebuilds/resale-sold-comps").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 = {
    "searchTerm": "Pendleton flannel",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("kitebuilds/resale-sold-comps").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 '{
  "searchTerm": "Pendleton flannel",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call kitebuilds/resale-sold-comps --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=kitebuilds/resale-sold-comps",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Mercari Sold Price & Sell-Through Scraper",
        "description": "Scrape Mercari SOLD listings: final sold prices, sell-through rate, days-to-sell, condition & brand from one search term. Sold comps for reseller pricing & Japan-sourcing arbitrage — not active listings. Mercari Japan live; US + Depop roadmap.",
        "version": "0.1",
        "x-build-id": "yHFeWbD8YQkBWoVvv"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/kitebuilds~resale-sold-comps/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-kitebuilds-resale-sold-comps",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/kitebuilds~resale-sold-comps/runs": {
            "post": {
                "operationId": "runs-sync-kitebuilds-resale-sold-comps",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/kitebuilds~resale-sold-comps/run-sync": {
            "post": {
                "operationId": "run-sync-kitebuilds-resale-sold-comps",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "searchTerm"
                ],
                "properties": {
                    "searchTerm": {
                        "title": "Search term",
                        "type": "string",
                        "description": "What to look up sold comps for, e.g. 'Pendleton flannel' or 'Nike Dunk Low Panda'."
                    },
                    "platform": {
                        "title": "Platform",
                        "enum": [
                            "both",
                            "mercari",
                            "depop"
                        ],
                        "type": "string",
                        "description": "Which marketplace(s) to pull sold comps from. Mercari is fully supported; Depop is best-effort (see README).",
                        "default": "mercari"
                    },
                    "mercariMarket": {
                        "title": "Mercari market",
                        "enum": [
                            "jp",
                            "us"
                        ],
                        "type": "string",
                        "description": "Which Mercari catalog. 'jp' (Mercari Japan, prices in JPY) works via the public DPoP JSON API and is the fully supported path. 'us' (Mercari US, USD) uses a browser session and requires residential proxy — best-effort.",
                        "default": "jp"
                    },
                    "maxItems": {
                        "title": "Max sold items",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum number of SOLD items to return per platform. Pagination stops once this is reached.",
                        "default": 50
                    },
                    "condition": {
                        "title": "Condition filter (optional)",
                        "type": "string",
                        "description": "Only keep sold items whose condition matches this value (case-insensitive substring), e.g. 'new', 'good'. Leave empty for all."
                    },
                    "priceMin": {
                        "title": "Minimum sold price (optional)",
                        "type": "integer",
                        "description": "Drop sold items below this price (in the platform's currency)."
                    },
                    "priceMax": {
                        "title": "Maximum sold price (optional)",
                        "type": "integer",
                        "description": "Drop sold items above this price (in the platform's currency)."
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy settings. Residential proxies are STRONGLY recommended — Mercari/Depop block datacenter IPs.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
