# Used iPhone Resale Value Japan — Sold Price, Buyback & Ask (`jpmarketdata/japan-phone-resale-value`) Actor

What a used phone is really worth in Japan, in one call: dealer ask by grade next to Yahoo! Auctions and Mercari SOLD prices, the resale margin, and the two discounts that move Japanese prices — network restriction (赤ロム) and battery under 80%. Carrier/capacity splits. From $0.02. 日本の中古スマホ相場を1コールで。

- **URL**: https://apify.com/jpmarketdata/japan-phone-resale-value.md
- **Developed by:** [h ichi](https://apify.com/jpmarketdata) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $20.00 / 1,000 handset valuations

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/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

## Used iPhone Resale Value Japan — Sold Price, Buyback & Ask

**What is this handset actually worth in Japan?** One call per model returns the **dealer ask** (what a Japanese used-phone retailer wants for it today) next to the **sold price** (what the same handset really changed hands for on Yahoo! Auctions and Mercari) — plus the two discounts that decide a Japanese handset's price and that nothing outside Japan prices for you: **network restriction (赤ロム)** and **battery below 80 %**.

| Source | What you get | Basis |
|---|---|---|
| [Iosys](https://iosys.co.jp/) (イオシス) — used-phone retailer | Current stock, with condition grade, carrier, capacity, blacklist marker and battery flag as **fields** | **dealer ask** |
| [Yahoo! Auctions Japan](https://auctions.yahoo.co.jp/) (ヤフオク) | Closed auctions with at least one bid | **sold** |
| [Mercari Japan](https://jp.mercari.com/) (メルカリ) | Sold-out (default) and/or on-sale listings | **sold** and/or **asking** |
| [PayPay Flea Market](https://paypayfleamarket.yahoo.co.jp/) (PayPayフリマ) | Live listings | **asking** |

This is not a generic sold-comps scraper pointed at phones. It is built around the three things that make the **Japanese** used-phone market its own market: 赤ロム risk, battery health disclosure, and carrier-branded stock.

### The two discounts, and why you can trust the number

- **`ネットワーク利用制限` (赤ロム)** — a handset the carrier has barred, or can still bar because the original buyer stopped paying the instalments. `○` cleared, `△` instalments running, `▲` risk, `×` already barred. A barred handset cannot use a mobile network, and the market prices that.
- **`バッテリー80%未満`** — below 80 % of the original maximum capacity, the point at which Apple and the Japanese trade call a battery worn.

Both are returned as a **percentage off the clear price**, and every figure says how it was computed:

- **`like_for_like`** — flagged against clear **inside the same source / grade / carrier / capacity cell**, so the number is not confounded by the stock mix. It only becomes the headline once at least 4 listings stand behind it: an unconfounded ratio computed from two prices is worse than a confounded one computed from twenty.
- **`pooled_unadjusted`** — all flagged against all clear. Reported always, labelled clearly, never dressed up as a coefficient.
- **Listings whose seller did not state the flag are excluded from both sides** and counted in `unstatedListings`. A silent listing title is *not* a clean handset, and folding silence into the clean bucket is the one move that would turn this product into a fabricated number. (`赤ロム保証` — "we refund you if it is ever barred" — is likewise read as the *opposite* of 赤ロム, not as the flag.)

### Why the price-basis tags matter more than the medians

A dealer ask, a winning bid and a live asking price are three different quantities. So every source block carries **`priceBasis`** (`dealer_ask` / `sold` / `asking`) with a plain-English `priceBasisLabel`, and every entry of **`valuation.pairs`** is tagged `dealer_ask_vs_sold`, `sold_vs_sold`, `asking_vs_asking`, and so on, with a boolean `sameBasis`. In a mixed pair the **buy side is always `from`**, so `diffPct` reads as a margin rather than a coincidence. `dealer_ask_vs_sold` is the only pair that is a margin; the rest is context.

### Pricing — from $0.02 per model, no subscription

| Event | Price | When |
|---|---|---|
| Model analyzed across sources | **$0.02** | Per model, whatever the number of sources |
| Individual listing | **$0.002** | Only if you enable **Include individual listings** |

A default run (1 model, 3 sources, summary only) costs **$0.02** and takes about **5 seconds** (measured). Apify's **$5 monthly free credit covers roughly 250 such runs**. No subscription, no minimum.

**A model is only charged when at least two of the selected sources actually returned data** (or the single one, if you selected only one). A cross-source valuation with one source in it is not a valuation, so it is free.

### Input

| Field | Example | Notes |
|---|---|---|
| `models` | `["iPhone 14 Pro 256GB"]` | Model, ideally with the capacity. Works for iPhone, Android and iPad. Full-width text and spacing are normalized. Each model costs $0.02 |
| `sources` | `["iosys","yahoo_auction","mercari"]` | Multi-select. Add `paypay_flea` for a second asking reference. The price per model does not change |
| `mercariStatus` | `"sold_out"` | `sold_out` (sold comps, default) / `on_sale` (asking) / `both` (returned as two separate blocks) |
| `modelNameFilter` | `true` | Keeps only listings whose title contains **every** word of your model keyword |
| `maxItemsPerSource` | `100` | 30–300 listings sampled per source (and per Mercari status) |
| `priceMinJpy` / `priceMaxJpy` | `40000` | Optional price window, applied **identically to every source** |
| `includeIndividualListings` | `false` | Enable to also get every matched listing, +$0.002 each |
| `convertToUsd` | `true` | Adds USD stats at the current rate (one FX lookup per run) |

### Output example (`type: "phone_resale_valuation"`, abridged, measured 2026-08-07)

`iPhone 14 Pro 256GB`, sources `iosys` + `yahoo_auction` + `mercari`:

```json
{
  "type": "phone_resale_valuation",
  "model": "iPhone 14 Pro 256GB",
  "normalizedModel": "iPhone14 Pro 256GB",
  "sources": {
    "iosys": {
      "priceBasis": "dealer_ask",
      "priceBasisLabel": "Dealer ask — tax-included shelf price a Japanese used-phone retailer wants today",
      "totalListingsFound": 28, "sampledListings": 28, "matchedListings": 18, "pricedListings": 18,
      "priceJpy": {"min": 77800, "p25": 89050, "median": 92800, "p75": 92800, "max": 109800, "average": 94300},
      "byGrade": [
        {"grade": "中古Bランク", "gradeEn": "Used B", "listings": 16, "sharePct": 88.9, "medianJpy": 92800, "units": 19},
        {"grade": "中古Cランク", "gradeEn": "Used C", "listings": 2,  "sharePct": 11.1, "medianJpy": 84800, "units": 3}
      ],
      "gradePremium": [{"betterGrade": "中古Bランク", "worseGrade": "中古Cランク", "medianRatio": 1.094, "premiumPct": 9.4}],
      "byCarrier": [{"carrier": "SoftBank", "listings": 6, "sharePct": 33.3, "medianJpy": 92800, "units": 7}],
      "byCapacity": [{"capacity": "256GB", "listings": 18, "sharePct": 100.0, "medianJpy": 92800, "units": 22}],
      "conditionMix": {
        "networkRestricted": {"flagged": 2, "clear": 16, "unstated": 0, "flaggedSharePct": 11.1},
        "batteryUnder80":    {"flagged": 1, "clear": 17, "unstated": 0, "flaggedSharePct": 5.6}
      },
      "signals": {"unitsInStock": 22, "listingsWithStockCount": 18},
      "coverage": "exact", "pagesSampled": [1, 2], "specSource": "structured"
    },
    "yahoo_auction": {
      "priceBasis": "sold",
      "totalListingsFound": 1622, "sampledListings": 100, "matchedListings": 72,
      "priceJpy": {"p25": 65750, "median": 74920, "p75": 85450},
      "conditionMix": {"networkRestricted": {"flagged": 0, "clear": 3, "unstated": 69}},
      "signals": {"sellThroughRatioSampled": 1.0, "bidCount": {"median": 1, "max": 86}},
      "specSource": "title"
    },
    "mercari_sold": {
      "priceBasis": "sold",
      "totalListingsFound": 1422, "sampledListings": 100, "matchedListings": 45,
      "priceJpy": {"p25": 68000, "median": 70000, "p75": 75000},
      "signals": {"medianDaysToSell": 4}
    }
  },
  "valuation": {
    "dealerAsk": {"source": "iosys", "medianJpy": 92800, "p25Jpy": 89050, "p75Jpy": 92800, "pricedListings": 18},
    "soldComps": [{"source": "yahoo_auction", "medianJpy": 74920, "pricedListings": 72},
                  {"source": "mercari_sold",  "medianJpy": 70000, "pricedListings": 45}],
    "soldMedianJpy": 72460, "soldMedianBasis": "median of the 2 sold source medians",
    "dealerPremiumJpy": 20340, "dealerPremiumPct": 28.1,
    "resaleMarginJpy": -20340, "resaleMarginPct": -21.9,
    "comparable": true, "spreadJpy": 22800, "spreadBasis": "dealer_ask_vs_sold", "mixedBasis": true,
    "pairs": [
      {"from": "iosys", "to": "yahoo_auction", "basis": "dealer_ask_vs_sold", "sameBasis": false,
       "diffJpy": -17880, "diffPct": -19.3, "cheaperSource": "yahoo_auction"},
      {"from": "yahoo_auction", "to": "mercari_sold", "basis": "sold_vs_sold", "sameBasis": true,
       "diffJpy": -4920, "diffPct": -6.6, "cheaperSource": "mercari_sold"}
    ],
    "note": "`resaleMarginPct` is gross: … before marketplace fees (~10 %), shipping and payment costs."
  },
  "conditionDiscounts": {
    "networkRestricted": {
      "dealer_ask": {"available": true, "basis": "pooled_unadjusted", "discountPct": 5.4,
                     "flaggedListings": 2, "clearListings": 16, "unstatedListings": 0,
                     "pooled": {"medianFlaggedJpy": 87800, "medianClearJpy": 92800, "discountJpy": 5000}},
      "sold": {"available": false, "basis": null, "discountPct": null,
               "flaggedListings": 0, "clearListings": 3, "unstatedListings": 114,
               "reason": "no priced flagged listing stated this flag for this model, so there is nothing to compare"}
    },
    "batteryUnder80": {
      "dealer_ask": {"available": true, "basis": "like_for_like", "discountPct": 16.2,
                     "likeForLike": {"cellsCompared": 1, "listingsInCells": 6, "medianRatio": 0.838}},
      "sold": {"available": true, "basis": "pooled_unadjusted", "discountPct": 9.0}
    }
  },
  "gradePremium": [{"betterGrade": "中古Bランク", "worseGrade": "中古Cランク", "premiumPct": 9.4}],
  "sourcesWithData": ["iosys", "mercari", "yahoo_auction"],
  "checkedAt": "2026-08-07T…"
}
```

Read that record as: the dealer wants **¥92,800**, the market pays **¥72,460**, so buying retail and flipping C2C loses **21.9 % before fees** — and a weak battery costs you **16.2 %** on the buy side while a ▲ marker costs **5.4 %**.

With `includeIndividualListings: true` you additionally get one record per matched listing, each tagged with `source`, `priceBasis`, `grade`, `carrier`, `capacity`, `networkRestricted`, `batteryUnder80`, `batteryHealthPct` and `specSource`.

### Use cases

- **Export sourcing** — Japan is a supply pool for the rest of Asia. `dealerAsk` is a price you can actually buy at today and `signals.unitsInStock` is the volume behind it; `soldComps` tells you what the same handset fetches at retail-adjacent prices
- **Buy-back / trade-in desks** — `gradePremium` is the empirical answer to "what is grade B worth over grade C this week", per model, instead of a fixed internal table. `conditionDiscounts` is the same for the two risk flags
- **Repricing and monitoring** — schedule it over your model list and watch the dealer ask, the sold median and the spread move
- **Deciding where to sell** — `sold_vs_sold` compares Yahoo! Auctions against Mercari for the same handset; `signals.medianDaysToSell` and `sellThroughRatioSampled` are the liquidity
- **Risk pricing** — quantify what 赤ロム and a worn battery are worth before you buy a lot of mixed stock

### Notes & limits

- **Check `matchedListings` and `pricedListings` before trusting a median.** `totalListingsFound` is what each site reports for the raw keyword and is deliberately shown next to them: the retailer's search is loose (measured: 28 hits for `iPhone14 Pro 256GB`, only 18 of them actually a 14 Pro), Mercari caps its hit count at 15,000
- **A model the dealer does not stock returns `matchedListings: 0`, not a guess.** The valuation then drops the dealer side and says so in `note` — `resaleMarginPct` needs a buy side
- `resaleMarginPct` is **gross**: before ~10 % marketplace fees, shipping and payment costs. And a dealer ask is a firm price while a sold median is a distribution — read `p25`/`p75`
- **The C2C condition flags are read from listing titles**, so they are only as good as what sellers wrote; `specSource: "title"` marks every such field and `unstatedListings` is usually the largest bucket. The retailer's flags are real fields (`specSource: "structured"`)
- **Iosys is a fixed-price retailer**, not a marketplace: prices are current asks, tax included, no sale date. Its buy-back site is `Crawl-delay: 60` and JavaScript-rendered, so the sell/buy spread is not obtainable and is not pretended
- **PayPay Flea Market can never return sold prices** — they are not server-rendered
- Yahoo's sold filter is `bidCount >= 1`; ended auctions with no bid are sampled but excluded from the statistics. Mercari's `medianDaysToSell` uses `updated - created`, which also moves on price edits, so it skews low
- The retailer is sorted price-ascending and sampled with **evenly spaced pages across the price range** (`coverage`, `pagesSampled`), never a cheap prefix
- **A source that fails does not fail the run**: it comes back as `available: false` with an `error` and the rest are still compared. Only a model where *every* source failed fails the run
- Read-only, no login, no browser. One request per 1.5 s, and Yahoo! Auctions and PayPay Flea Market are queried **sequentially** because they share one backend
- No personal data is collected — sellers are excluded from every record

***

**日本語**: 中古スマホ1機種につき、業者の販売価格(イオシス)とヤフオク・メルカリの**実際の落札/売却価格**を1レコードで並べ、**赤ロム(ネットワーク利用制限)割引率・バッテリー80%未満の割引率・ランク別/キャリア別/容量別の内訳**まで返します(1機種 $0.02、明細は $0.002/件、サブスク不要)。

**中文**: 一次调用即可获得日本二手手机的**商家售价与雅虎拍卖/煤炉实际成交价对比**,并量化「红ROM(网络限制)」与「电池健康低于80%」的折价幅度(每款机型 $0.02,无需订阅)。

# Actor input Schema

## `models` (type: `array`):

One or more handset keywords, valued across every selected source. Be specific — the model, and ideally the capacity: 'iPhone 14 Pro 256GB', 'Xperia 1 V', 'Pixel 8 128GB', 'iPad Air4'. Full-width characters and spacing are normalized automatically. Each model costs $0.02.

## `sources` (type: `array`):

Iosys is a used-phone retailer and returns a DEALER ASK (what you pay to buy stock today), with the condition grade, carrier, capacity, network-restriction marker and battery flag as real fields. Yahoo! Auctions and Mercari (sold out) return SOLD prices — what handsets actually changed hands for. PayPay Flea Market can only return ASKING prices. The price per model is the same whichever sources you pick.

## `mercariStatus` (type: `string`):

Which Mercari listings to price. 'Sold out' gives real sold comps (comparable with Yahoo! Auctions), 'On sale' gives asking prices, 'Both' returns them as two separate blocks so each keeps a single, honest price basis.

## `modelNameFilter` (type: `boolean`):

On by default. Keeps only listings whose title contains every word of your model keyword, so a search for 'iPhone 14 Pro 256GB' does not price plain iPhone 14 bodies, cases or screen protectors. Measured on the retailer: 27 hits, only 15 of them actually a 14 Pro — including the rest moves the median from ¥92,800 to ¥84,800. Turn off only for very loosely-named models.

## `maxItemsPerSource` (type: `integer`):

How many listings to sample per source (and per Mercari status) before filtering and computing the statistics. Larger samples are steadier but slower: Yahoo returns 50 per request, Mercari 120, PayPay 100, Iosys 24, and requests are throttled to one per 1.5 s.

## `priceMinJpy` (type: `integer`):

Drop listings priced below this before computing the statistics. Applied identically to every source so the medians stay comparable. Useful to cut junk, parts and accessory listings out of a model.

## `priceMaxJpy` (type: `integer`):

Drop listings priced above this before computing the statistics. Applied identically to every source. Useful to cut multi-unit lots out of a model.

## `includeIndividualListings` (type: `boolean`):

Off by default: a run costs a flat $0.02 per model, whatever the number of sources. Enable to also get every matched listing from every source (title, price, grade, carrier, capacity, restriction and battery flags, URL) at +$0.002 per listing.

## `convertToUsd` (type: `boolean`):

Adds USD statistics next to JPY using the current exchange rate (open.er-api.com, looked up once per run).

## Actor input object example

```json
{
  "models": [
    "iPhone 14 Pro 256GB"
  ],
  "sources": [
    "iosys",
    "yahoo_auction",
    "mercari"
  ],
  "mercariStatus": "sold_out",
  "modelNameFilter": true,
  "maxItemsPerSource": 100,
  "includeIndividualListings": false,
  "convertToUsd": true
}
```

# 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 = {
    "models": [
        "iPhone 14 Pro 256GB"
    ],
    "sources": [
        "iosys",
        "yahoo_auction",
        "mercari"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("jpmarketdata/japan-phone-resale-value").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 = {
    "models": ["iPhone 14 Pro 256GB"],
    "sources": [
        "iosys",
        "yahoo_auction",
        "mercari",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("jpmarketdata/japan-phone-resale-value").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 '{
  "models": [
    "iPhone 14 Pro 256GB"
  ],
  "sources": [
    "iosys",
    "yahoo_auction",
    "mercari"
  ]
}' |
apify call jpmarketdata/japan-phone-resale-value --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jpmarketdata/japan-phone-resale-value"
        }
    }
}

```

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/dyoh7IBoIgkjtz1zE/builds/1lpclxwbobobEW1NP/openapi.json
