# Japan to eBay Price Gap — Mercari & Yahoo! Auctions vs eBay (`northbell/japan-ebay-price-gap`) Actor

What a product really sold for in Japan (recent sold prices on Mercari and Yahoo! Auctions: median and range) next to what it is listed for on eBay (official Browse API, your keys), in JPY, with the gap after shipping and eBay fees. Figures, cards, cameras. No login.

- **URL**: https://apify.com/northbell/japan-ebay-price-gap.md
- **Developed by:** [Northbell](https://apify.com/northbell) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $16.00 / 1,000 product compareds

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

## Japan to eBay Price Gap — Mercari & Yahoo! Auctions Sold Prices vs eBay

What a product **really sold for in Japan** next to what it is **listed for on eBay**, in yen, with the **gap after shipping and eBay fees**. One row per product: the median, quartiles and range of recent **sold prices on Mercari Japan** (メルカリ) **and Yahoo! Auctions Japan** (ヤフオク), each site on its own and together, the median eBay price (item + shipping) converted to JPY at the day's European Central Bank rate, how many of those eBay listings already ship from Japan, and what is left for you per item. For anime figures, trading cards, cameras and lenses, video games, vintage clothing — anything people buy in Japan to resell abroad.

Without eBay keys it still works: you get the sold prices in Japan (median, p25–p75, min, max per site, and the combined median) and every sold item.

**Try it now. The input is already filled in.** Press **Start** (no eBay keys needed for this): Nendoroid Hatsune Miku — **100 recent sold items in Japan and one comparison row in about 20 seconds, for $0.13** (measured on 28 Oct 2026). The comparison row:

| | sold | median (JPY) | p25–p75 (JPY) | sold per day |
| --- | --- | --- | --- | --- |
| Mercari | 50 | 4,176 | 3,144–7,995 | 8 |
| Yahoo! Auctions | 50 | 3,691 | 2,600–5,401 | 10.3 |
| Japan, both | 100 | 4,000 | | 18.3 |

Add your eBay Client ID and Client Secret and the same row also gets the eBay median (item + shipping, in JPY) and the gap after shipping and eBay fees.

### What you get

One `comparison` row per search:

| Field | What it is |
|---|---|
| `search`, `ebaySearch` | the Japanese words sent to Yahoo! Auctions and the English words sent to eBay |
| `yahooSold`, `yahooSoldMedianJpy`, `yahooSoldP25Jpy`, `yahooSoldP75Jpy`, `yahooSoldMinJpy`, `yahooSoldMaxJpy`, `yahooLastSoldAt` | how many recent auctions **actually sold** (at least one bid, or a fixed-price sale), and their sold prices in JPY |
| `mercariSold`, `mercariSoldMedianJpy`, `mercariSoldP25Jpy`, `mercariSoldP75Jpy`, `mercariSoldMinJpy`, `mercariSoldMaxJpy` | the same for recent **sold-out** items on Mercari (including Mercari Shops) |
| `yahooSoldPerDay`, `mercariSoldPerDay`, `japanSoldPerDay` | how fast it sells: the newest 80% of the sold items read, divided by the days they span back from now, at least one day (both sites added up for Japan; the oldest 20% are left out because a sold-out search can carry a few items from years ago). It tells a product that sells ten a day from one that sold twice last month at the same median. Read from the dates of the sold items, not from the sites' result counts, which are capped |
| `japanSold`, `japanSoldMedianJpy` | all sold items from both sites together, and their median: **the Japanese price the gap uses** |
| `ebayListings`, `ebayListingsRead`, `ebayListingsFromJapan` | eBay fixed-price listings for the words, how many were read, and how many ship from Japan (your competition) |
| `ebayMedianPrice`, `ebayCurrency`, `ebayMedianJpy`, `jpyPerUnit`, `fxDate` | median eBay price including shipping, in the marketplace currency and in JPY, with the rate and its date |
| `costs` | the shipping, eBay fee % and other costs used |
| `gapJpy`, `gapPercent` | eBay median after fees, minus the Japanese sold median, shipping and other costs; and that as a share of the Japanese price |
| `lastRunAt`, `japanSoldMedianChangeJpy`, `ebayMedianChangeJpy`, `gapChangeJpy` | from the second run of the same search: when your last run was, and how the Japanese sold median, the eBay median and the gap moved since then |
| `note` | why a number is missing (no keys, nothing sold, no listings) |

With **Include every item** on (default), each sold item (`type: yahooSold`: title, sold price, bids, condition, category, sold time, link; `type: mercariSold`: title, price, condition, whether it was a Mercari Shops item, sold time, link) and each eBay listing (`type: ebayListing`: title, price, shipping, condition, ships from, link) follows as its own row, so you can check the median against the actual items.

**How the gap is worked out:** `gapJpy = ebayMedianJpy × (1 − eBay fee %) − japanSoldMedianJpy − shipping − other costs`. Medians, not averages, so one rare variant does not move the price. eBay prices are **asking prices of current listings**; Mercari and Yahoo! Auctions prices are **what buyers paid**. Treat a large gap as a lead to check, not a promise.

**Example** (made-up numbers, to show how one comparison row reads):

```json
{
  "type": "comparison",
  "search": "example figure",
  "japanSold": 60,
  "japanSoldMedianJpy": 4800,
  "japanSoldPerDay": 12.5,
  "ebayMedianPrice": 62,
  "ebayCurrency": "USD",
  "ebayMedianJpy": 9300,
  "ebayListingsRead": 60,
  "ebayListingsFromJapan": 31,
  "gapJpy": 268,
  "gapPercent": 5.6,
  "gapChangeJpy": -410
}
```

It sells about 12 a day in Japan at a median of ¥4,800. eBay asks a median of $62 (¥9,300). After the 13.25% fee and ¥3,000 shipping, ¥268 is left per item, ¥410 less than at your last run, and half the eBay listings already ship from Japan: a product to skip, not to stock.

### Input

Put one product per line in **Searches**: the Japanese words for Mercari and Yahoo! Auctions, then `|`, then the English words for eBay — e.g. `ねんどろいど 初音ミク | nendoroid hatsune miku`, `ポケモンカード リザードン | pokemon card charizard japanese`, `FUJIFILM X100F | fujifilm x100f`. Without the `|` part, the same words go to both.

**Leave out titles with these words** drops junk, bundles and parts on both sites before the medians are worked out (prefilled with `ジャンク`, `まとめ`, `部品取り`, `junk`, `lot of`, `for parts`; any case).

**Costs:** set your own. The defaults are only a starting point: **Shipping** 3,000 JPY (a small parcel), **eBay fees** 13.25 % (eBay.com's final value fee for most categories), **Other costs** 0 (add proxy or forwarding fees, packing, domestic shipping, payment fees).

**eBay (optional):** create a free developer account at developer.ebay.com, open *Application Keys*, and copy the **Production** App ID (Client ID) and Cert ID (Client Secret) into the two fields. The secret is stored encrypted by Apify and is used only to get a read-only token for eBay's official **Browse API**. Pick the **marketplace** where you would sell (US, UK, DE, FR, IT, ES, AU, CA) and, if you like, **used only** or **new only**.

### Watch prices over time

Schedule the same searches every week. From the second run of a search, its comparison row says how the prices moved since your last run: `lastRunAt`, `japanSoldMedianChangeJpy`, `ebayMedianChangeJpy` and `gapChangeJpy` (on by default as **Compare with my last run**; the medians are kept in a named key-value store in your own Apify account). You see a product's price in Japan or on eBay move before you buy stock.

### How the data is read

- **Yahoo! Auctions Japan:** the public closed-auction search page (`/closedsearch/closedsearch`, which the site's robots.txt allows), 50 items a page, newest first, with a pause between pages. Only the search words and the page number are sent. Seller names and IDs are never read or returned.
- **Mercari Japan:** the same search the Mercari website runs for sold-out items, newest first, 120 a page, with a pause between pages. Each run makes its own anonymous signing key, as every visitor's browser does; it never signs in and never uses anyone's account or token. Seller and buyer IDs and shop names are not returned. Mercari does not publish the moment of sale, so `soldAt` is the item's last update, which is when it sold for almost every item.
- **eBay:** only through eBay's official Browse API with your own keys. eBay's web pages are not read. Seller names are not returned.
- **Exchange rate:** the European Central Bank reference rate of the latest business day (via frankfurter.dev).

No login to any of the sites. E-mail addresses and phone numbers in titles are replaced with `[email removed]` / `[phone removed]`. This Actor is not affiliated with or endorsed by Mercari, Inc., LY Corporation (Yahoo! JAPAN) or eBay Inc.; you are responsible for how you use the data and for following each site's terms, and for checking import, export and resale rules for what you sell.

### Pricing

Pay per result: **$0.02 per comparison** (one product compared) and **$0.001 per item row** (each sold item from Mercari or Yahoo! Auctions, or eBay listing; turn off **Include every item** to pay only for comparisons), plus $0.01 per run. Apify's platform usage is billed separately.

### For AI agents

Call it with one product and read the first row:

```bash
curl -X POST "https://api.apify.com/v2/acts/northbell~japan-ebay-price-gap/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searches":["ねんどろいど 初音ミク | nendoroid hatsune miku"],"includeItems":false,"ebayClientId":"YOUR_EBAY_APP_ID","ebayClientSecret":"YOUR_EBAY_CERT_ID"}'
```

The first row is the comparison; `gapJpy` is what is left per item after the costs you set.

# Actor input Schema

## `searches` (type: `array`):

One product per line: the Japanese words for Yahoo! Auctions, then | and the English words for eBay, e.g. "ねんどろいど 初音ミク | nendoroid hatsune miku". Without the | part the same words go to both.

## `japanSites` (type: `array`):

Where to read recent sold prices. Both by default; the gap uses the median of all sold items together.

## `excludeWords` (type: `array`):

Items whose title contains any of these words are left out on both sites, so junk, parts and bundles do not move the median (any case). E.g. ジャンク (junk), まとめ (lot), 部品取り (for parts), lot, broken.

## `ebayClientId` (type: `string`):

From your free eBay developer account (developer.ebay.com > Application Keys > Production). eBay is read only through its official Browse API with your own keys.

## `ebayClientSecret` (type: `string`):

The Production Cert ID of the same app. Stored encrypted by Apify; used only to get a read-only token for the Browse API.

## `ebayMarketplace` (type: `string`):

Where you would sell. Prices are converted to JPY at the European Central Bank reference rate of the day.

## `ebayCondition` (type: `string`):

Compare with used or new listings only. Fixed-price listings only (no auctions still running).

## `shippingJpy` (type: `integer`):

Your cost to ship one item abroad. 3,000 is a placeholder for a small parcel; set your own.

## `ebayFeePercent` (type: `number`):

Final value fee plus anything else eBay takes, as a share of the sale price. 13.25 is eBay.com's rate for most categories; check yours.

## `otherCostJpy` (type: `integer`):

Anything else per item: a proxy or forwarding fee, packing, Yahoo! Auctions shipping inside Japan, payment fees.

## `maxSoldPerSearch` (type: `integer`):

Most recent sold items to read per Japanese site for the median (Yahoo! Auctions 50 a page, Mercari 120 a page).

## `maxEbayPerSearch` (type: `integer`):

eBay listings to read for the median (one API call).

## `compareWithLastRun` (type: `boolean`):

Keep each search's medians in your own storage and, from the second run of the same search, show how the Japanese sold median, the eBay median and the gap moved since then (lastRunAt, japanSoldMedianChangeJpy, ebayMedianChangeJpy, gapChangeJpy).

## `includeItems` (type: `boolean`):

Also return each sold item and each eBay listing as its own row (type yahooSold / ebayListing). Off = only one comparison row per search.

## Actor input object example

```json
{
  "searches": [
    "ねんどろいど 初音ミク | nendoroid hatsune miku"
  ],
  "japanSites": [
    "yahoo",
    "mercari"
  ],
  "excludeWords": [
    "ジャンク",
    "まとめ",
    "部品取り",
    "junk",
    "lot of",
    "for parts"
  ],
  "ebayMarketplace": "EBAY_US",
  "ebayCondition": "any",
  "shippingJpy": 3000,
  "ebayFeePercent": 13.25,
  "otherCostJpy": 0,
  "maxSoldPerSearch": 50,
  "maxEbayPerSearch": 50,
  "compareWithLastRun": true,
  "includeItems": true
}
```

# Actor output Schema

## `comparisons` (type: `string`):

Yahoo! Auctions sold median vs eBay listing median in JPY, and the gap after costs.

## `items` (type: `string`):

Comparisons, sold items and eBay listings.

# 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 = {
    "searches": [
        "ねんどろいど 初音ミク | nendoroid hatsune miku"
    ],
    "excludeWords": [
        "ジャンク",
        "まとめ",
        "部品取り",
        "junk",
        "lot of",
        "for parts"
    ],
    "maxSoldPerSearch": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("northbell/japan-ebay-price-gap").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 = {
    "searches": ["ねんどろいど 初音ミク | nendoroid hatsune miku"],
    "excludeWords": [
        "ジャンク",
        "まとめ",
        "部品取り",
        "junk",
        "lot of",
        "for parts",
    ],
    "maxSoldPerSearch": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("northbell/japan-ebay-price-gap").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 '{
  "searches": [
    "ねんどろいど 初音ミク | nendoroid hatsune miku"
  ],
  "excludeWords": [
    "ジャンク",
    "まとめ",
    "部品取り",
    "junk",
    "lot of",
    "for parts"
  ],
  "maxSoldPerSearch": 50
}' |
apify call northbell/japan-ebay-price-gap --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,northbell/japan-ebay-price-gap"
        }
    }
}
```

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/oveAo0Hz50GqhKeYw/builds/KF57oV0FNz1ncoYEF/openapi.json
