# Japan Electronics Store Prices by JAN - TSUKUMO & XPRICE (`jpopendata/japan-electronics-retail-prices`) Actor

Selling prices at Japanese electronics retailers TSUKUMO and XPRICE with points, price minus points, stock and shipping, keyed by JAN and model number to compare stores. JANs, keywords, search pages or product URLs. robots.txt-compliant, facts only. Unofficial; not affiliated with the stores.

- **URL**: https://apify.com/jpopendata/japan-electronics-retail-prices.md
- **Developed by:** [JP Open Data](https://apify.com/jpopendata) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

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/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 Electronics Store Prices by JAN - TSUKUMO & XPRICE

**Selling prices at Japanese electronics retailers, keyed by JAN barcode and model number: price incl. tax, points, price minus points, stock, shipping fee or free-shipping badge, shipping estimate, condition (new / outlet) and category — one clean JSON record per product per store.**

Stores covered: **TSUKUMO (ツクモネットショップ, shop.tsukumo.co.jp)** — PCs, PC parts, consoles, appliances — and **XPRICE (エクスプライス, www.xprice.co.jp)** — appliances, AV, outlet and previous-model items. Look products up by **JAN code**, by **keyword or model number**, from a **TSUKUMO search or category page** you copied from your browser, or from **product URLs** of either store.

> **Unofficial tool. Not affiliated with or endorsed by TSUKUMO / 株式会社ヤマダデンキ or XPRICE / エクスプライス株式会社.** It reads publicly available pages only (no login), politely (one request at a time, at least 1.5 s apart, a hard per-run request budget, `Retry-After` honoured, no block evasion), fetches **only URLs that each store's robots.txt allows**, and returns **facts only — no reviews, no product descriptions, no images**. You are responsible for making sure your use of the data complies with the stores' terms and applicable law.

Related Actors from the same publisher:

- **Sold prices (落札相場):** [jpopendata/japan-yahoo-auction-sold](https://apify.com/jpopendata/japan-yahoo-auction-sold) — what items actually sold for on Yahoo! Auctions.
- **Resale price comps:** [jpopendata/japan-resale-price-comps](https://apify.com/jpopendata/japan-resale-price-comps) — Yahoo Auctions sold prices plus flea-market, BOOKOFF and Hareruya listings, with min/median/max per keyword.
- **Flea market listings:** [jpopendata/japan-flea-market-paypay](https://apify.com/jpopendata/japan-flea-market-paypay) — PayPay Flea Market (Yahoo!フリマ) prices.

***

### Quick start — verified input

Copy this into the input (JSON tab) or send it via the API. It was run successfully on 2026-10-13 (7 records: 1 JAN lookup, the top 5 results for "RTX 5070" and 1 XPRICE product; 8 requests, about 15 seconds, no proxy). Running with an empty input `{}` uses exactly these values.

```json
{
  "jans": ["4573681625917"],
  "keywords": ["RTX 5070"],
  "productUrls": ["https://www.xprice.co.jp/d.php?id=202000012630001&status=1"],
  "maxResultsPerSearch": 5
}
```

A list of JANs only (one request each):

```json
{
  "jans": ["4573681625917", "4988755071628", "0197105837829"]
}
```

A TSUKUMO category, 100 products, list-only (one request per 48 products):

```json
{
  "listingUrls": ["https://shop.tsukumo.co.jp/search/c20:2010:2010900/"],
  "maxResultsPerSearch": 100,
  "openProductPages": false
}
```

#### Common input mistakes

| Wrong | Right | Why |
|---|---|---|
| `"jans": ["4573681625918"]` | `"jans": ["4573681625917"]` | The last digit of a JAN is a check digit; a typo is detected and that code is skipped with a warning (the rest of the list still runs). |
| An XPRICE search URL (`search.php?q=…`) | XPRICE product URLs (`d.php?id=…&status=…`) | XPRICE draws its search results in the browser from an internal search API, which this Actor does not use. Paste product pages instead. |
| `"stores": ["xprice"]` with `jans` or `keywords` | add `"tsukumo"` | JAN and keyword lookups are served by TSUKUMO only (see above). |
| An XPRICE URL without `status=` | copy the full address bar | `status=` tells new (1) from outlet items (5, 6, …). Without it `status=1` is used, with a warning. |
| `"keywords": ["RTX 5070 グラフィックボード 新品 安い"]` | `"keywords": ["RTX 5070"]` or a model number | The store's search matches all words; short keywords or a model number work best. |
| `"maxResultsPerSearch": 500` with `"maxRequests": 20` | leave `maxRequests` at `0` | `0` sizes the request budget automatically. A small explicit budget stops the run early (it still succeeds with `complete: false`). |

A JAN pasted into the URL field, a JAN typed as a keyword, a TSUKUMO search page in the product field (or a product page in the list field) all work: the Actor moves the entry to the right place and says so in the log. An unusable value (another store's URL, a page that is neither a product nor a list) stops the run immediately, before any request, with a message that names the field and shows the valid forms.

#### Empty results?

- A JAN that TSUKUMO does not sell has no product page (HTTP 404): no record, nothing charged, a warning lists the JANs.
- A keyword with no match (TSUKUMO answers 「該当する商品がありませんでした。」) gives 0 records for that keyword, `noResults: true` in `RUN_SUMMARY`, nothing charged.
- A removed product URL (HTTP 404 at either store) is skipped with a warning.
- If a run stops early (budget, time limit, a store refusing requests), the records already stored are kept, the run succeeds, and `RUN_SUMMARY` in the key-value store shows `complete: false` and a `stopReason`.

***

### Who is this for?

- **Resellers / sedori (せどり) buyers:** check a JAN's current store price, points and stock before buying or listing; compare against sold prices on Yahoo! Auctions or flea markets.
- **Makers and retailers (price monitoring):** watch your products' selling price, points, stock wording and shipping at these stores on a schedule.
- **Market research:** price and stock across a TSUKUMO category (GPUs, SSDs, notebooks…), with model numbers for matching.

### Input

| Field | What it does |
|---|---|
| `jans` | JAN / EAN codes. Looked up at TSUKUMO, whose product page address is the barcode (`/goods/<JAN>/`) — one request per JAN, exact match. 8-digit short JANs and 12-digit UPCs are accepted. |
| `keywords` | TSUKUMO searches (discontinued items hidden, as on the site). The top `maxResultsPerSearch` results are returned, in the site's order (`listPosition`). |
| `productUrls` | Product pages of TSUKUMO (`https://shop.tsukumo.co.jp/goods/…/`) or XPRICE (`https://www.xprice.co.jp/d.php?id=…&status=…`). The only way to read XPRICE. |
| `listingUrls` | TSUKUMO search or category pages copied from the browser; maker/stock filters and sort order are kept; 48 rows per request. |
| `stores` | `tsukumo` and/or `xprice` (default both). Japanese names and domains are accepted too. |
| `maxResultsPerSearch` | Products per keyword and per list (default 5, up to 1000). |
| `openProductPages` | On (default): open each search/list result for points, category, condition and release date. Off: list-only mode (price, stock, badge, maker, JAN, model) — up to 48 products per request. |
| `maxRequests` | Hard request budget; `0` = automatic. |
| `proxyConfiguration` | Optional; not needed (both stores answer directly). One sticky IP per run if set. |

### Sample output (two dataset items)

```json
[
  {
    "store": "tsukumo",
    "storeName": "TSUKUMO (ツクモネットショップ)",
    "productName": "ノートPC IdeaPad Slim 3i Gen 11 83US0008JP [16型 /Core Ultra 5 322 /RAM:16GB /SSD:512GB /Windows 11 Home /Office OP付 /ルナグレー]",
    "maker": "Lenovo レノボ・ジャパン",
    "modelNumber": "83US0008JP",
    "jan": "4573681625917",
    "storeProductCode": "4573681625917",
    "category": "ノートPC",
    "categoryPath": ["ハードウェア", "パソコン本体", "Windowsノート", "ノートPC"],
    "condition": "new",
    "conditionNote": null,
    "priceJpy": 208780,
    "pointsJpy": 20878,
    "pointRatePercent": 10,
    "effectivePriceJpy": 187902,
    "freeShipping": true,
    "shippingFeeJpy": 0,
    "shippingNote": null,
    "stockStatus": "in_stock",
    "stockLabel": "在庫あり",
    "shippingEstimate": "24時間以内に出荷",
    "releaseDate": null,
    "url": "https://shop.tsukumo.co.jp/goods/4573681625917/",
    "matchedBy": "jan",
    "query": "4573681625917",
    "listPosition": null,
    "detailFetched": true,
    "source": "ツクモネットショップ (shop.tsukumo.co.jp) product, search and category pages",
    "sourceUrl": "https://shop.tsukumo.co.jp/",
    "license": "Publicly available data — unofficial tool; users are responsible for compliance with the source site's terms",
    "retrievedAt": "2026-10-12T21:53:29.576Z"
  },
  {
    "store": "xprice",
    "storeName": "XPRICE (エクスプライス)",
    "productName": "日立 CV-G95K [業務用掃除機(乾燥ごみ用)]",
    "maker": "日立",
    "modelNumber": "CV-G95K",
    "jan": "4902530747935",
    "storeProductCode": "202000012630001",
    "category": "業務・店舗用掃除機",
    "categoryPath": ["家電", "生活家電", "掃除機・クリーナー・洗浄機", "業務・店舗用掃除機"],
    "condition": "new",
    "conditionNote": "新品",
    "priceJpy": 35200,
    "pointsJpy": 352,
    "pointRatePercent": 1,
    "effectivePriceJpy": 34848,
    "freeShipping": true,
    "shippingFeeJpy": 0,
    "shippingNote": null,
    "stockStatus": "in_stock",
    "stockLabel": null,
    "shippingEstimate": "通常 2026年11月12日(木)まで に出荷",
    "releaseDate": null,
    "url": "https://www.xprice.co.jp/d.php?id=202000012630001&status=1",
    "matchedBy": "url",
    "query": "https://www.xprice.co.jp/d.php?id=202000012630001&status=1",
    "listPosition": null,
    "detailFetched": true,
    "source": "XPRICE (www.xprice.co.jp) product pages",
    "sourceUrl": "https://www.xprice.co.jp/",
    "license": "Publicly available data — unofficial tool; users are responsible for compliance with the source site's terms",
    "retrievedAt": "2026-10-12T21:53:29.576Z"
  }
]
```

#### What the fields mean

- `priceJpy` — the selling price shown to an anonymous visitor, tax included.
- `pointsJpy` — points the product page shows (1 point = ¥1 at both stores). `0` when the product page shows no points for the item (TSUKUMO prints none for many items); `null` in list-only mode, where points are not shown.
- `effectivePriceJpy` — `priceJpy − pointsJpy`, only when both are known. `pointRatePercent` is printed by XPRICE and computed (points ÷ price) for TSUKUMO.
- `jan` — the product's barcode, only when it is a valid EAN-13 / EAN-8. XPRICE outlet items carry an in-store number (prefix 2…) instead; that is **not** reported (`jan: null`, the store's own number is in `storeProductCode`). TSUKUMO bundles have store numbers too.
- `modelNumber` — **best-effort from the product name** (neither store has a model-number field): `null` rather than a guess.
- `stockStatus` — one of `in_stock`, `low_stock`, `out_of_stock`, `preorder`, `backorder`, `discontinued`, `unknown`; the store's own wording is kept in `stockLabel` (e.g. 在庫わずか, 予約受付中, 在庫限り).
- `freeShipping` / `shippingFeeJpy` — XPRICE states a fee per item (e.g. ¥550) or 送料無料. TSUKUMO shows a 送料無料 badge on qualifying items; for the others the fee is not printed per item, so `shippingFeeJpy` is `null` and `shippingNote` carries the store's rule (税込3,300円以上で送料無料…).
- `condition` — `new`, `outlet` (XPRICE 【アウトレット】 items), `used` or `refurbished`; `conditionNote` keeps XPRICE's label (新品, 箱破損品, 展示品…).
- `matchedBy` / `query` / `listPosition` — how the record was found (`jan`, `keyword`, `url`, `listing`), with your input and the position in the result list.

**Comparing stores:** run your JANs (TSUKUMO) together with XPRICE product URLs and group the dataset by `jan` (the *Compare by JAN* view shows price, points, shipping and stock side by side).

### Honest limits

- **XPRICE takes product URLs only.** Its search and category lists are generated in the browser from an internal search API; this Actor reads server-rendered pages only, so there is no JAN or keyword search for XPRICE.
- **Two stores.** Many large electronics retailers refuse automated requests that identify themselves honestly (blocked at the CDN), or prohibit scraping by name in their terms; they are not included and no block is ever evaded.
- **Prices change.** Everything is a snapshot at `retrievedAt` for an anonymous visitor (no login, no member prices, no coupons; shipping can depend on the delivery address).
- **One request per product page,** at least 1.5 s apart: 1,000 products take roughly 25 minutes. List-only mode reads 48 TSUKUMO products per request.
- **A store can change its pages or refuse requests.** If that happens mid-run, the run keeps what it has and ends successfully with `complete: false`; if the very first request is refused, the run fails visibly instead of retrying aggressively.

### robots.txt compliance

The Actor requests only these URLs: TSUKUMO product pages (`/goods/<code>/`), TSUKUMO search and category lists (`/search/p<N>/…`, `/search/c…/p<N>/…`) and XPRICE product pages (`/d.php?id=…&status=…`). Before every request the URL is checked against a copy of the store's robots.txt (`User-agent: *` group, RFC 9309 longest match) and refused if any rule disallows it (for example TSUKUMO's `/search/go`, XPRICE's `/i2*.php`). No other host is ever contacted.

### Data, privacy and GDPR

The output contains product, price, stock and shipping facts and the names of manufacturers. It contains no personal data: reviews, review counts, product descriptions, images and spec tables are never read into the dataset. If your use involves any personal data, you are responsible for complying with GDPR and other applicable laws. Sources: ツクモネットショップ (TSUKUMO, operated by 株式会社ヤマダデンキ) and XPRICE (operated by エクスプライス株式会社); each record links back to its product page.

### Pricing

Pay per result: you are charged for each record stored in the dataset (one product at one store). JANs or URLs that do not exist are not charged. A run stops by itself when it reaches the maximum charge you set for the run.

# Actor input Schema

## `jans` (type: `array`):

JAN / EAN barcodes, one per line, e.g. 4573681625917 (13 digits; 8-digit short JANs and 12-digit UPCs work too; spaces, hyphens and full-width digits are fine). Each JAN is looked up at TSUKUMO, where the product page address is the barcode itself (one request per JAN). A JAN the store does not sell gives no record and costs nothing. A code with a wrong check digit is skipped with a warning.

## `keywords` (type: `array`):

Searches at TSUKUMO, one per line, e.g. RTX 5070, SDDDC3-128G or 83US0008JP. A model number gives the most precise results. The top 'Max results per search' products of each search are returned (discontinued items hidden, like on the site). A JAN typed here is looked up directly as a JAN.

## `productUrls` (type: `array`):

Product pages, one per line: TSUKUMO https://shop.tsukumo.co.jp/goods/4573681625917/ or XPRICE https://www.xprice.co.jp/d.php?id=202000012630001\&status=1 (copy the address bar; keep status=, it marks new vs outlet items). This is the way to read XPRICE. Each URL = one request = one record. A TSUKUMO search page pasted here is read as a list.

## `listingUrls` (type: `array`):

TSUKUMO result lists, one per line, e.g. https://shop.tsukumo.co.jp/search/c20:2010:2010900/ (USB memory category) or a search address such as https://shop.tsukumo.co.jp/search?keyword=RTX+5070 — set maker or stock filters and the sort order on the site first: they are kept. Read in the list's order, 48 rows per request, up to 'Max results per search' products per list. XPRICE lists are not supported.

## `stores` (type: `array`):

Which stores to use, one per line: tsukumo (TSUKUMO / ツクモ) and/or xprice (XPRICE / エクスプライス). Default: both. JAN and keyword lookups need tsukumo; product URLs of a store left out are skipped.

## `maxResultsPerSearch` (type: `integer`):

How many products to return per keyword search and per pasted list (1..1000; values outside are clamped). With 'Open product pages' on, each product costs one extra request (about 1.5 s); with it off, one request returns up to 48 products.

## `openProductPages` (type: `boolean`):

On (default): open each search/list result's product page to add points, price minus points, category, condition and release date. Off: fast list-only mode — price, stock, shipping badge, maker, JAN and model number straight from the result list (points stay empty). JAN lookups and product URLs always open the product page.

## `maxRequests` (type: `integer`):

Hard budget of requests to the stores for the whole run. 0 (default) sizes it automatically from your inputs and limits. A number (1..20000) is a strict cap: requests are serial, at least 1.5 s apart (1,000 requests take about 25 minutes), and if the budget runs out the run still succeeds with the records found so far and complete=false in RUN_SUMMARY.

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

Optional. Both stores answer Apify datacenter IPs directly, so no proxy is used by default. If you set one, the run keeps a single sticky session (one IP) and never rotates.

## Actor input object example

```json
{
  "jans": [
    "4573681625917"
  ],
  "keywords": [
    "RTX 5070"
  ],
  "productUrls": [
    "https://www.xprice.co.jp/d.php?id=202000012630001&status=1"
  ],
  "listingUrls": [],
  "stores": [
    "tsukumo",
    "xprice"
  ],
  "maxResultsPerSearch": 5,
  "openProductPages": true,
  "maxRequests": 0,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `records` (type: `string`):

One record per product per store with source attribution (source, sourceUrl, license, retrievedAt) on every item.

# 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 = {
    "jans": [
        "4573681625917"
    ],
    "keywords": [
        "RTX 5070"
    ],
    "productUrls": [
        "https://www.xprice.co.jp/d.php?id=202000012630001&status=1"
    ],
    "listingUrls": [],
    "stores": [
        "tsukumo",
        "xprice"
    ],
    "maxResultsPerSearch": 5,
    "openProductPages": true,
    "maxRequests": 0,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("jpopendata/japan-electronics-retail-prices").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 = {
    "jans": ["4573681625917"],
    "keywords": ["RTX 5070"],
    "productUrls": ["https://www.xprice.co.jp/d.php?id=202000012630001&status=1"],
    "listingUrls": [],
    "stores": [
        "tsukumo",
        "xprice",
    ],
    "maxResultsPerSearch": 5,
    "openProductPages": True,
    "maxRequests": 0,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("jpopendata/japan-electronics-retail-prices").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 '{
  "jans": [
    "4573681625917"
  ],
  "keywords": [
    "RTX 5070"
  ],
  "productUrls": [
    "https://www.xprice.co.jp/d.php?id=202000012630001&status=1"
  ],
  "listingUrls": [],
  "stores": [
    "tsukumo",
    "xprice"
  ],
  "maxResultsPerSearch": 5,
  "openProductPages": true,
  "maxRequests": 0,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call jpopendata/japan-electronics-retail-prices --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jpopendata/japan-electronics-retail-prices"
        }
    }
}
```

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/boe3ij2LzJbGCKTO5/builds/qKj3r9OjGCWHMNe0G/openapi.json
