# Digimart 日本二手乐器 Japan Instrument Price Stats (`jpmarketdata/digimart-instrument-market-cn`) Actor

日本二手乐器（日产吉他、贝斯、键盘、管乐）的进货与转卖定价：输入一个关键词，一次调用拿到デジマート（Digimart，约 2000 家日本乐器店共用的挂牌平台）的行情——全量四分位（最低/Q1/中位/Q3/最高，不是首页样本）、二手与新品的价差、成色构成（中古/vintage/B-stock/展示品）、品牌与店铺分布、有货比例。零件与配件和乐器共用关键词索引，可用 categoryId 锁定。From $0.02 per keyword, no subscription.

- **URL**: https://apify.com/jpmarketdata/digimart-instrument-market-cn.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 keyword market summaries

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

## Japan Used Instrument Price & Condition Stats — for Chinese-Speaking Buyers

**中文 · English · 日本語** —— 输入一个关键词，一次调用拿到デジマート（Digimart，约 2000 家日本乐器店共用的挂牌平台）的**全量价格四分位**、二手与新品价差、成色构成、品牌与店铺分布。

***

### 中文说明

#### 这是给谁用的（Who this is for）

**日产吉他是一条成熟的出口通道**——Fender Japan、Tokai、Greco、ESP、Yamaha 的日产型号，在中国、东南亚与欧美都有稳定需求。做这门生意的人每天要回答的问题只有一个：**这把琴在日本到底值多少钱？**

难点不在于找到几个报价，而在于**报价的分布**。你在国内能查到的，是零散的几条挂牌，或者某个平台首页恰好排在前面的那几件；你查不到的，是**整个在售池的分位数**。而一次调用就能拿到后者。

这个 Actor 读取 **[Digimart](https://www.digimart.net/)（デジマート）**——约 2000 家日本乐器店（含石桥乐器、黑泽乐器）挂牌用的平台——并为每个关键词返回一条紧凑的行情记录：

- **`priceJpy` —— 全量的最低 / Q1 / 中位 / Q3 / 最高。** 一个 9,038 条命中的关键词，给出的就是全部 9,038 条的真实 25/50/75 百分位，用 5 次请求拿到，而不是从 100 个样本里估出来的。
- **`usedVsNew`** —— 二手中位价、新品中位价，以及两者之间的价差。这是跨境买家真正据以行动的数字。
- **`conditionBreakdown`** —— 新品 / 中古 / **vintage** / 展示outlet / B-stock。Digimart 是少数把 vintage 当作独立成色标注、而不是丢在标题里的平台之一。
- **`brandTop`**、**`categoryTop`**、**`inStockRatioSampled`**，以及按当前汇率的美元换算。
- 可选：每一件取样商品（标题、品牌、分类、价格、成色、有货与否、商品链接）。

值得注意的是：**日本国内的二手乐器市场，和「在国际平台上跨境挂牌的日本卖家」并不是同一个池子**——`stratocaster` 在 Digimart 上约 9,000 条，而在最大的国际平台上日本所在地的挂牌约 900 条。本 Actor 测的是国内那一个。

无需登录、无需 API key、运行之间不存储任何数据。

本 Actor 是英文版 **Digimart Japan Used Instruments — Price & Condition Stats in One Call**（同一账号下的英文入口）的**中文语言包**：抓取逻辑与统计口径完全相同，只有标题、商店说明、文档和输入项标签改写成中文。

#### 概览 Overview

每个关键词返回**一条 `market_summary` 汇总记录**：全量价格四分位（附口径标注）、二手价与新品价统计、二手/新品价差、成色构成、有货比例、品牌与分类分布、汇率。开启单件输出后，另外为每一件取样商品返回一条记录。

#### 输入 Input

| 字段 | 示例 | 说明 |
|---|---|---|
| `keywords` | `["Stratocaster"]` | 型号名命中率最高。拉丁字母与日文都建了索引。每个关键词 $0.02 |
| `categoryId` | `"2001"` | **强烈建议填。** 不填的话，零件与乐器共用同一个关键词索引——搜 `Stratocaster` 会返回 150 日元的拨档开关帽，把低位四分位整体拉低。从任意 Digimart 分类链接里复制数字 |
| `maxItemsPerKeyword` | `100` | 用于成色/品牌构成的查看件数（30–400，每页 100）。**不影响**四分位 |
| `includeIndividualItems` | `false` | 开启后输出每一件取样商品的记录（+$0.002/件） |
| `convertToUsd` | `true` | 按当前汇率附上美元统计 |

```json
{
    "keywords": ["Stratocaster"],
    "maxItemsPerKeyword": 100,
    "includeIndividualItems": false,
    "convertToUsd": true
}
```

**关于 `categoryId`，请务必读这一段。** 零件与配件和乐器共用同一个关键词索引。搜一个「琴型名」（Stratocaster、Les Paul、Jazz Bass）而不填 `categoryId`，结果里会混进拨档开关帽、旋钮、护板这类几百日元的小件，最低位四分位会被整体拉低，`usedVsNew` 也会跟着失真。**只要你搜的是琴型而不是某个具体型号，就填 `categoryId`。**

#### 输出 Output

字段名保持英文，这是 API 接口：

```json
{
  "type": "market_summary",
  "keyword": "Stratocaster",
  "categoryId": null,
  "totalListingsFound": 9038,
  "sampledListings": 100,
  "priceJpy": { "min": 150, "q1": 39800, "median": 98000, "q3": 198000, "max": 4980000, "count": 9038 },
  "priceJpyBasis": "population_quantiles",
  "usedPriceJpy": { "min": 150, "q1": 1980, "median": 6800, "q3": 24800, "max": 79800, "count": 61 },
  "newPriceJpy": { "min": 275, "q1": 1650, "median": 3300, "q3": 8800, "max": 39600, "count": 39 },
  "usedVsNew": { "usedMedianJpy": 6800, "newMedianJpy": 3300, "discountVsNewPct": -106.1 },
  "conditionBreakdown": { "new": 34, "used": 58, "vintage": 3, "new_outlet": 5, "b_stock": 0 },
  "inStockRatioSampled": 0.93,
  "brandTop": [["Fender", 21], ["ALLPARTS", 14]],
  "categoryTop": [["エレキギター", 46]],
  "checkedAt": "2026-08-01T05:14:07.221Z",
  "sourceUrl": "https://www.digimart.net/search?keyword=Stratocaster&readCount=100&currentPage=1&sortKey=PRICE_ASC"
}
```

上例中 `usedVsNew.discountVsNewPct` 是负数，而且是**故意留在这里的**：没有填 `categoryId` 时，一个不加限定的 `Stratocaster` 搜索里，「新品」那一侧被便宜零件主导，所以二手乐器反而**高于**它。这正是 `categoryId` 要消除的那个假象——注意 `brandTop` 里出现的 `ALLPARTS`（零件厂）就是信号。**本 Actor 选择把这个数字报出来，而不是把它藏起来。**

#### 每项统计的口径（basis）

每条记录都带 **`priceJpyBasis`**，你永远不用猜一个数字是怎么来的：

| `priceJpyBasis` | 含义 | 怎么拿到的 | 什么时候出现 |
|---|---|---|---|
| **`exact`** | 对**每一条命中商品**的真实统计 | 整个结果集就在一页里（≤100 条）——1 次请求 | 窄关键词 |
| **`population_quantiles`** | 最低/Q1/中位/Q3/最高是**真正的全量分位数**，`count` 就是全部命中数 | 按价格升序排列后，直接跳到每个分位数所在名次的那一页，再加一次降序页拿最高价——5 次请求 | 大多数关键词 |
| **`sample`** | 普通的样本统计，`count` 是样本量 | 兜底。当价格顺序跨页**不单调**、或多关键词运行撞上时间预算时使用（此时还会设置 `truncatedForTimeLimit: true`） | 少见 |

**兜底档才是重点**：如果 Digimart 哪天改了排序行为，本 Actor 会**停止声称自己给的是全量分位数**，而不是悄悄返回错误的百分位。

`usedPriceJpy`、`newPriceJpy`、`usedVsNew`、`conditionBreakdown`、`brandTop`、`categoryTop` 与 `inStockRatioSampled` **始终是样本口径**（样本量见 `sampledListings`）。默认 `maxItemsPerKeyword: 100` 时，样本是最便宜的 100 件；调到 200/400 后，样本会自动借用本来就要抓的分位页铺开到整个价格区间——**不增加请求，也不增加时间。**

#### 本 Actor 不做什么

- **默认不倾倒商品明细。** 产品本身是「那条统计」，单件输出是可选项且单独计费。
- **不访问需要登录的数据。** 全部来自公开搜索页。
- **不存数据集。** 每次运行都实时抓取，运行之间不保留任何内容。
- **不涉及卖家个人数据。** 只有店铺层级的名称，绝不涉及个人。

#### 价格 Pricing —— 每个关键词 $0.02 起，无订阅

| 计费事件 | 价格 | 何时发生 |
|---|---|---|
| 关键词行情汇总（`keyword-analyzed`） | **$0.02** | 每分析一个关键词 |
| 单件商品记录（`item-scraped`） | **$0.002** | 仅当开启「输出单件商品」时 |

默认运行（1 个关键词、只要汇总）花费 **$0.02**。**零结果的关键词绝不收费。** Apify 每月赠送 $5 免费额度。

#### 注意事项 Notes & limits

- **成色代码取自 Digimart 自己的 `instru_type` 字段**：1 新品、2 中古、3 vintage、4 展示outlet、5 B-stock。它们读自站点输出的结构化数据，不是从标题里猜的。
- **`sortKey` 永远显式发送。** 平台默认是相关度排序，会让每一项价格统计失真——和门户网站的「推荐排序」是同一类陷阱。
- **零件噪声是真实存在的。** 只要关键词写的是琴型而不是具体型号，就填 `categoryId`。
- 价格是卖家展示的含税挂牌价；Digimart 是挂牌平台，所以这些是**要价**，不是成交价。
- 与株式会社リットーミュージック／デジマート无任何关联。数据用于市场调研，大额交易前请自行核实。

#### 用途 Use cases

- **进货判断** —— 用全量四分位判断一个型号在日本的价格水位，而不是被首页几条挂牌带偏。
- **出货定价** —— 二手与新品的价差，就是你在国内报价时的锚。
- **品类摸底** —— `conditionBreakdown` 里的 vintage 占比与 `categoryTop`，帮你看清一个关键词到底对应什么样的货。

***

### English

#### Overview

Used-instrument price statistics for any keyword on Digimart (デジマート), the platform roughly 2,000 Japanese instrument shops list their stock on. One call per keyword returns population quartiles (min/Q1/median/Q3/max) of the whole result set — not a first-page sample — plus the used-vs-new spread, the condition split (new / used / vintage / new-outlet / B-stock), the brand and category mix, and the in-stock share.

This listing is the **Chinese-language package** of our English Actor **Digimart Japan Used Instruments — Price & Condition Stats in One Call**. The scraping and the statistics are identical; the documentation, store copy and input labels are written for Chinese-speaking instrument importers and resellers (日本二手乐器 / 日产吉他 / 日本乐器代购).

#### Input

| Field | Example | Notes |
|---|---|---|
| `keywords` | `["Stratocaster"]` | Model names work best. Latin and Japanese both index. $0.02 per keyword |
| `categoryId` | `"2001"` | **Strongly recommended.** Without it, parts share the keyword index with instruments and drag the low quartiles down |
| `maxItemsPerKeyword` | `100` | Listings inspected for the condition / brand mix (30–400). Does **not** affect the quartiles |
| `includeIndividualItems` | `false` | Enable to also get each sampled listing as a record (+$0.002 each) |
| `convertToUsd` | `true` | Adds USD stats at the current exchange rate |

#### Output

One `type: "market_summary"` record per keyword (`priceJpy` + `priceJpyBasis`, `usedPriceJpy`, `newPriceJpy`, `usedVsNew`, `conditionBreakdown`, `inStockRatioSampled`, `brandTop`, `categoryTop`, USD conversion) — see the JSON example in the Chinese section — plus optionally one listing record per sampled item.

#### Pricing

| Event | Price |
|---|---|
| Keyword market summary (`keyword-analyzed`) | **$0.02** |
| Individual listing record (`item-scraped`) | **$0.002** each |

Individual listings are OFF by default, so a default run is a flat **$0.02** per keyword. A keyword that returns zero listings is never charged. No subscription.

#### Notes & limits

- **Parts share the keyword index with instruments, which is why `categoryId` matters.** A `Stratocaster` search without it returns ¥150 switch tips and drags the low quartiles down; `usedVsNew.discountVsNewPct` can then go negative because the "new" side is dominated by cheap parts. The Actor reports the number rather than hiding it.
- `priceJpyBasis` is always labelled `exact` / `population_quantiles` / `sample`; if Digimart changes its sort behaviour the Actor stops claiming population quantiles.
- `sortKey` is always sent explicitly — the platform default is a relevance order that would skew every price statistic.
- Condition codes come from Digimart's own `instru_type` structured payload, not guessed from titles.
- Prices are listed asking prices including tax; Digimart is a listing platform, so these are **asking** prices, not sold prices.
- Read-only, no login, nothing stored between runs. Not affiliated with Digimart / Rittor Music.

***

### 日本語

#### 概要 Overview

デジマート（約2,000店の日本の楽器店が在庫を掲載するプラットフォーム）の中古楽器相場を、キーワード単位で1コールで返します。**結果セット全体の母集団四分位**（最小/Q1/中央値/Q3/最大。1ページ目のサンプルではありません）、中古と新品の価格差、状態内訳（新品/中古/ビンテージ/新品アウトレット/B級品）、ブランド・カテゴリ内訳、在庫比率。中国語圏の利用者（日本二手乐器 / 日产吉他 / 日本乐器代购）向けに中国語で書き直したパッケージで、英語版は **Digimart Japan Used Instruments — Price & Condition Stats in One Call**（取得・統計処理は同一）。

#### 入力 Input

`keywords`（型名が最も当たる）／`categoryId`（任意だが**強く推奨**）／`maxItemsPerKeyword`（既定 100、30〜400）／`includeIndividualItems`（既定 OFF）／`convertToUsd`（既定 ON）。

#### 出力 Output

キーワードごとに `market_summary` を1件（`priceJpy`＋`priceJpyBasis` / `usedPriceJpy` / `newPriceJpy` / `usedVsNew` / `conditionBreakdown` / `inStockRatioSampled` / `brandTop` / `categoryTop` / USD換算）。`includeIndividualItems` が ON のときは、取得した各商品の明細（タイトル・ブランド・カテゴリ・価格・状態・在庫・商品URL）も出力します。

#### 料金 Pricing

キーワードサマリー（`keyword-analyzed`）**$0.02**／個別商品レコード（`item-scraped`）**$0.002 / 件**。個別明細は**既定 OFF** なので既定実行はキーワードあたり $0.02 固定です。**0件のキーワードには課金されません。** サブスクリプション不要。

#### 注意 Notes

**パーツ・アクセサリが楽器とキーワードインデックスを共有している**ため、`categoryId` が重要です。無指定の `Stratocaster` 検索は¥150のスイッチチップまで拾い、低位四分位を押し下げます（`usedVsNew.discountVsNewPct` がマイナスになるのはこの副作用で、バグではありません）。`priceJpyBasis` は常に `exact` / `population_quantiles` / `sample` のいずれかで根拠を明示し、並び順の挙動が変われば母集団分位の主張を**やめます**。`sortKey` は常に明示送信（既定の関連度順は価格統計を歪めるため）。状態コードはサイトが出力する構造化データの `instru_type` を読んでおり、タイトルからの推測ではありません。価格は掲載中の税込**売り希望価格**であり、成約価格ではありません。ログイン不要・実行間の保存なし。デジマート／株式会社リットーミュージックとは無関係です。

# Actor input Schema

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

一个或多个搜索关键词——型号名命中率最高（Stratocaster、Les Paul、SG Standard、Jazz Bass、MG-M）。拉丁字母与日文都可用：Digimart 按厂商自己的写法建索引。每个关键词 $0.02。

## `categoryId` (type: `string`):

把搜索限定到 Digimart 的某一个分类。不填的话，零件与配件和乐器共用同一个关键词索引——搜 'Stratocaster' 会返回 150 日元的拨档开关帽，把低位四分位整体拉低。从任意 Digimart 分类链接里复制数字即可（…/search?categoryId=<数字>）。留空表示搜索全部。

## `maxItemsPerKeyword` (type: `integer`):

每个关键词查看多少件商品用于成色构成、品牌构成与有货比例。价格四分位读自全量结果集，不受此项影响。结果每页 100 件，所以大于 100 的取值会复用本来就要抓的分位页——样本自然铺开在整个价格区间，不额外增加请求；小于 100 的取值只限制开启「输出单件商品」时返回（并计费）多少条记录（+$0.002/件）。

## `includeIndividualItems` (type: `boolean`):

默认关闭：一次运行每个关键词汇总固定 $0.02。开启后还会输出每一件取样商品（标题、品牌、分类、价格、成色、有货与否、商品链接），+$0.002/件。

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

按当前汇率（open.er-api.com）在日元统计旁边附上美元统计。

## Actor input object example

```json
{
  "keywords": [
    "Stratocaster"
  ],
  "maxItemsPerKeyword": 100,
  "includeIndividualItems": 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 = {
    "keywords": [
        "Stratocaster"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("jpmarketdata/digimart-instrument-market-cn").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 = { "keywords": ["Stratocaster"] }

# Run the Actor and wait for it to finish
run = client.actor("jpmarketdata/digimart-instrument-market-cn").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 '{
  "keywords": [
    "Stratocaster"
  ]
}' |
apify call jpmarketdata/digimart-instrument-market-cn --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jpmarketdata/digimart-instrument-market-cn"
        }
    }
}

```

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/DAAsp4lbIlDGQFMQe/builds/yfi6zDAjvS2odS2cZ/openapi.json
