# BOOTH Japan Item Prices — Typical Price, Range, In Stock (`jpmarketdata/booth-japan-item-price-checker`) Actor

Type a keyword like VRChat and see what creators on BOOTH Japan charge for it. You get how many items match, the typical price and the lowest-highest range, how many are still in stock, and how many shoppers saved the most popular ones. $0.02 per keyword, no results = no charge. Unofficial.

- **URL**: https://apify.com/jpmarketdata/booth-japan-item-price-checker.md
- **Developed by:** [h ichi](https://apify.com/jpmarketdata) (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 $20.00 / 1,000 keyword analyzeds

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?

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

## BOOTH Japan Item Prices — Typical Price, Range, In Stock

> **Unofficial** — independent tool, **not affiliated with, endorsed by, or sponsored by BOOTH or pixiv**. It reads only publicly visible pages. Support, reliability guarantees and the full disclaimer are at the bottom of this page.

**What it does:** Type a keyword and see what creators on BOOTH Japan (pixiv's marketplace) charge for it, and how much of it you can still buy.

**You enter:** keywords — Japanese finds the most (`アクスタ`), English works when the item uses it (`VRChat`).

**You get:** BOOTH's exact item count and in-stock count, the typical price and low-to-high range in yen and USD, the shops, categories and stock states behind the 60 listings read, and wish-list counts for the items opened. Optional: one row per listing.

**Price:** $0.02 per keyword. +$0.002 per row if you also want the list. No results = no charge.

**Example:** enter `VRChat` → 213,694 items listed · 212,802 still buyable (99.6%) · typical ¥350, middle half ¥150–800 · 40 different shops among the 60 listings read · the more popular of the two items opened is on 51,637 wish lists (real run, 2026-09-08)

> Unofficial — not affiliated with BOOTH or pixiv. Reads public pages only.

### Pricing — $0.02 per keyword

| Event | Price | When |
|---|---|---|
| Keyword market summary | **$0.02** | Once per keyword, when its numbers come back |
| Individual listing | **$0.002** | Only if you turn on **Also return each listing as a row** |

A default run (1 keyword, summary only) costs **$0.02** and takes about 15 seconds. You pay per keyword; there is no monthly fee. **A keyword that returns zero listings is never charged.**

### Input

| Field | Example | Notes |
|---|---|---|
| `keywords` | `["VRChat"]` | 1–20 words, one row and $0.02 each; about 15 fit in one run (the run stops reading after 240 seconds and later words come back as `unknown`, not charged). Japanese finds the most (`アクスタ`, `アバター`); English works when the item uses it |
| `category` | `"3Dモデル"` | Empty = all of BOOTH. A BOOTH category name in Japanese keeps every number inside that category (`VRChat`: 213,694 → 195,765 in `3Dモデル`) |
| `inStockOnly` | `false` | `false` counts sold-out items too, like BOOTH's own search. `true` describes only what you can still buy, and `inStockShare` becomes `1.0` |
| `sampleFrom` | `"popular"` | `popular` or `new` — which 60 listings the shop count, stock breakdown, categories and optional rows come from. Prices are unaffected |
| `detailSampleSize` | `2` | 0–10. How many of those listings get their own page opened, for `wishListCounts` and `firstListedAt`. One request each; `0` skips them |
| `includeIndividualItems` | `false` | Turn on to also get the listings read, one row each (up to 60 per keyword), at +$0.002 per row |
| `convertToUsd` | `true` | Adds `priceUsd` at today's rate. A failed rate lookup never fails the run |

### Output example (`type: "creator_market_summary"`)

Measured on 2026-09-08 (real run, `{"keywords": ["VRChat"], "detailSampleSize": 2, "includeIndividualItems": false}` — 9 requests, 17 seconds). The whole record, nothing shortened.

```json
{
  "type": "creator_market_summary",
  "keyword": "VRChat",
  "keywordStatus": "ok",
  "locale": "ja",
  "categoryFilter": null,
  "inStockOnly": false,
  "sortUsed": "popular",
  "totalListingsFound": 213694,
  "inStockCount": 212802,
  "inStockShare": 0.9958,
  "sampledListings": 60,
  "priceJpy": { "min": 0, "p25": 150, "median": 350, "p75": 800, "max": 9999999, "average": null },
  "priceJpyBasis": "population_quantiles",
  "priceJpyMaxNote": "highest listed price; BOOTH allows placeholder listings up to ¥9,999,999",
  "freeItemShare": 0.0,
  "distinctShops": 40,
  "stockMix": { "inStock": 60, "outOfStock": 0, "saleEnded": 0, "lowStock": 0 },
  "topCategories": [
    { "name": "3Dキャラクター", "categoryId": 208, "count": 35 },
    { "name": "3Dツール・システム", "categoryId": 215, "count": 12 },
    { "name": "3D小道具", "categoryId": 210, "count": 5 }
  ],
  "wishListCounts": { "min": 50268, "median": 50952, "max": 51637, "sampleSize": 2 },
  "firstListedAt": {
    "oldest": "2024-06-11T12:45:33.000+09:00",
    "newest": "2025-11-17T20:00:10.000+09:00",
    "sampleSize": 2
  },
  "soldOutInDetailSample": 0,
  "pageCapHit": false,
  "monotonicityCheck": "ok",
  "hint": null,
  "sourceUrl": "https://booth.pm/ja/search/VRChat",
  "checkedAt": "2026-09-08T17:10:41.110949+00:00",
  "priceUsd": { "min": 0.0, "p25": 0.97, "median": 2.27, "p75": 5.18, "max": 64759.99, "average": null },
  "exchangeRateJpyUsd": 0.006476
}
```

Reading that record:

- **`totalListingsFound` and `inStockCount` are BOOTH's own counts**, printed above its result grid, and they cover every matching item. `inStockShare` is one divided by the other — 99.6% here because VRChat items are downloads that never run out, against 70% for `アクスタ`, where the goods are physically made to order (measured 2026-09-08: 45,692 listed, 31,980 buyable).
- **`priceJpy` covers every matching item too, not the 60 read.** BOOTH's cheapest-first order holds across pages, so the tool reads the listing sitting at the matching rank: ¥150 is the price a quarter of the way up all 213,694 items, ¥350 the middle one, ¥800 three quarters up. `priceJpyBasis` says which reading you got (see the table below).
- **`min` is ¥0 and that is real** — BOOTH is full of free downloads. `freeItemShare` counts how many of the 60 listings read were free (0 here: the popular ones are all paid).
- **`average` is `null` whenever the numbers cover every item.** An average needs every single price, which would mean reading all 3,562 pages of this one keyword; the middle values are read at their rank instead, and the tool leaves the field empty rather than quietly swapping in an average of the 60 listings it did read.
- **`max` is the highest price anyone typed, not a market price.** BOOTH lets a creator list up to ¥9,999,999 and some do, as a placeholder or a joke. `priceJpyMaxNote` repeats this on every record. Use the middle values for pricing decisions.
- **`sortUsed` is the order the 60 listings were read in** — your `sampleFrom` choice, `popular` (BOOTH's own default order) or `new`. It is not the order behind the prices: `priceJpy` is always read from BOOTH's cheapest-first order at the matching rank, whatever `sortUsed` says.
- **`sampledListings`, `distinctShops`, `stockMix`, `topCategories` and `freeItemShare` cover the 60 listings read** (which 60 is your `sampleFrom` choice). `wishListCounts`, `firstListedAt` and `soldOutInDetailSample` cover only the items opened — `sampleSize` says how many that was.

#### Does a number cover every item, or only the ones read?

| `priceJpyBasis` | What it means |
|---|---|
| **`population_quantiles`** | The typical price and the middle range were read at their rank in the cheapest-first order — they describe **every matching item** |
| **`population_median`** | The middle value was read that way, but at least one edge sits deeper than page 3,333, which BOOTH will not serve. That edge is `null` and `pageCapHit` is `true` |
| **`sample`** | The cheapest-first order did not come back in order (`monotonicityCheck: "violated"`), so the numbers fall back to the 60 listings read and say so, rather than publish a broken figure |

### When a keyword comes back empty

`keywordStatus` is `ok` as soon as BOOTH returns items, `not_found` when BOOTH itself says zero (with `hint` naming the next thing to try, `null` otherwise), and `unknown` when the run reached its time limit before the keyword. **Zero items is never charged.** Measured 2026-09-08: `zzzqqxnotarealproduct` returns a normal-looking 46 KB page whose only difference is `対象商品 0 件`, and the run finishes in 1 request with `not_found`.

`truncatedForTimeLimit: true` is on every row the reading budget touched. The run stops starting new keywords after 240 seconds, so a keyword reached after that comes back `unknown` with this key, every figure `null` and **no charge**. The same key on a charged `ok` row means the budget ran out part-way through that keyword: its counts and prices are complete, but the item pages were skipped, so `wishListCounts` and `firstListedAt` read `sampleSize: 0` even though `detailSampleSize` asked for more. Rows without the key were read inside the budget.

### What this Actor does not do

- **No sold prices.** These are asking prices. BOOTH publishes no sales figures at all — the `past_purchase_count` field in its own item data read 0 on every item measured and is not a sales count, so it is never reported here
- **No images, item descriptions, shop display names or seller names.** Only counts, prices, category names, stock states and the shop's address on BOOTH. Every row is re-checked before it is returned, and the run fails rather than return something outside that list
- **No adult items.** BOOTH's default result set is all-ages and this tool has no code path that can ask for anything else
- **No listing dumps by default.** The product is the summary; individual rows are opt-in and separately priced
- **No login-only data, and nothing is kept between runs** — every run reads the public pages live

### Notes on the data

- **Counts are exact, and they move.** `アクスタ` read 45,686, then 45,702, then 45,692 over one day — it moves both ways — and `VRChat` went from 213,663 to 213,694. Every record carries `checkedAt`, so a number always has a time attached. Which 60 listings count as "most popular" moves the same way, so `distinctShops`, `stockMix` and the wish-list sample of a repeat run differ from the example above even when the prices do not
- **Pages hold 60 items, and BOOTH stops at page 3,333.** A rank deeper than that is unreachable — BOOTH answers `200` with page 3,333's content instead of refusing, so this tool checks the page number BOOTH actually served and reports `pageCapHit: true` with a `null` value rather than a wrong price. It bites above about 267,000 items for the top of the middle range (`p75`), about 400,000 for the median and about 800,000 for `p25` — measured 2026-09-08, `3Dモデル` (288,308 items) already returns `p75: null` with `pageCapHit: true`
- **`priceJpyFrom` is the cheapest option of a listing.** A card that offers several variations shows `¥ 500~` and BOOTH's own number for it is the lowest one; that is what is read, for the record and for the rows
- **What "sold out" means here.** `stockMix.outOfStock` counts listings BOOTH marks 在庫なし, `saleEnded` counts 販売終了, `lowStock` counts 残りN点. They describe availability today, never units sold
- **The wish-list count is BOOTH's own demand signal** — how many shoppers saved the item. It is only available on an item's own page, which is why it covers the items opened (`detailSampleSize`) and not the whole result
- **Everything is UTF-8**, read one page at a time with 1.5 seconds between requests, no browser and no login. A keyword costs at most 7 page reads plus one small read per item opened — 9 requests for the example above

### If something goes wrong

- **Wrong number or a failed run?** Open a ticket on the **Issues** tab. I read every one and reply within 2 business days (Japan time).
- **You never get a fake "empty" result.** If the site can't be read, the run fails and says so.
- **No results = no charge.** You only pay for results you actually get.
- **Checked every week.** An automatic test runs this tool weekly; if the site changes, I fix it.
- **Public pages only.** No login, no personal data, and it goes easy on the site.

### More tools by the same author

- [Mercari Japan Sold Prices — What Items Really Sell For](https://apify.com/jpmarketdata/mercari-japan-price-checker)
- [Yahoo! Auctions Japan Sold Prices — Median, Range, Bids](https://apify.com/jpmarketdata/yahoo-auction-sold-comps)

All tools (Japan marketplaces, real estate, jobs, racing, prediction markets): <https://apify.com/jpmarketdata>

### Disclaimer

Unofficial, independent tool — **not affiliated with, endorsed by, or sponsored by BOOTH or pixiv**. Product names and logos belong to their owners and only say where the data comes from. Data is read from public pages, for market research; check before you act on it.

# Actor input Schema

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

One row of numbers per keyword. Each keyword is charged $0.02, and a keyword that finds nothing is not charged. Creators name items in Japanese, so Japanese words find the most (アクスタ, アバター); English works when the item uses it (VRChat). Up to 20 per run, about 15 fit: the run stops reading after 240 seconds and any keyword left unread comes back as `unknown`, not charged.

## `category` (type: `string`):

Leave this empty to look across all of BOOTH. Type a BOOTH category name in Japanese (3Dモデル, グッズ, アクリルフィギュア) and every number then describes that category only: measured 2026-09-08, VRChat has 213,694 items on all of BOOTH and 195,765 inside 3Dモデル. The name has to match BOOTH's own spelling of the category.

## `inStockOnly` (type: `boolean`):

Off by default, so the counts include items that are sold out or no longer on sale — that is how BOOTH's own search behaves. Turn it on and every number describes only what you can still buy today, and `inStockShare` is then always 1.0. Measured 2026-09-08: アクスタ had 45,692 items listed but 31,980 of them still buyable.

## `sampleFrom` (type: `string`):

Which 60 listings the shop count, the stock breakdown, the top categories and the optional rows are read from: BOOTH's popular order, or its newest-first order. The typical price and the low-to-high range are always read from the cheapest-first order at the matching rank, so this choice does not move them.

## `detailSampleSize` (type: `integer`):

How many of those listings get their own item page read, for the wish-list count, the first listing date and whether the item is sold out. One extra request each, about 1.5 seconds. Set it to 0 and `wishListCounts` and `firstListedAt` come back empty and the run is quicker; the item count, the prices and the in-stock share are unaffected. Does not change what you are charged.

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

Off by default: a run costs a flat $0.02 per keyword. Turn it on to also get the listings that were read, one row each, up to 60 per keyword, at +$0.002 per row. Each row carries the item number, title, link, starting price, stock state, category and the shop's address on BOOTH, plus the wish-list numbers for the items that were opened.

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

Adds a US dollar copy of the yen price numbers at today's rate. A failed rate lookup never fails the run — you simply get the yen numbers on their own.

## Actor input object example

```json
{
  "keywords": [
    "VRChat"
  ],
  "inStockOnly": false,
  "sampleFrom": "popular",
  "detailSampleSize": 2,
  "includeIndividualItems": false,
  "convertToUsd": true
}
```

# Actor output Schema

## `creatorMarketSummaries` (type: `string`):

One row per keyword: how many items BOOTH lists, how many you can still buy, the typical price and the low-to-high range in yen and US$, the shops and categories behind them, and wish-list numbers for the items that were opened.

# 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": [
        "VRChat"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("jpmarketdata/booth-japan-item-price-checker").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": ["VRChat"] }

# Run the Actor and wait for it to finish
run = client.actor("jpmarketdata/booth-japan-item-price-checker").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": [
    "VRChat"
  ]
}' |
apify call jpmarketdata/booth-japan-item-price-checker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jpmarketdata/booth-japan-item-price-checker"
        }
    }
}

```

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/lrHsiZ7MB78x5uKjw/builds/KTF0d63idlAC6vS6Y/openapi.json
