# Hobby Search Japan Prices — What's In Stock and % Off (`jpmarketdata/hobbysearch-japan-stock-price-checker`) Actor

Type a hobby keyword and see what model kits and figures cost on Hobby Search in Japan today. You get the typical price and price range over every item you can actually buy, how many that is of all found, and the usual discount off list. $0.02 per keyword, no results = no charge. Unofficial.

- **URL**: https://apify.com/jpmarketdata/hobbysearch-japan-stock-price-checker.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 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

## Hobby Search Japan Prices — What's In Stock and % Off

> **Unofficial** — independent tool, **not affiliated with, endorsed by, or sponsored by Hobby Search**. 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 hobby word and get what model kits and figures cost on Hobby Search in Japan today, over the items you can actually buy.
**You enter:** search words, e.g. `HGUC` or `ガンダム`. English words like `gundam` are swapped for you.
**You get:** how many items are in stock out of all found, the typical price and the lowest–highest over the in-stock items, the share discounted and the usual % off the Japanese list price, the share on pre-order and nearly sold out, and the shop's own stock tags.
**Price:** $0.02 per search word. +$0.002 per row if you also want the list. No results = no charge.

**Example:** enter `HGUC` in Gunpla → 27 of 306 items found are in stock (9%) · ¥363–¥9,900, typical ¥1,584 · 89% discounted, usually 20% off list · all 27 read, so those figures cover every one of them (real run, 2026-09-09)

> Unofficial — not affiliated with Hobby Search. Reads public pages only.

### Pricing — $0.02 per search word

| Event | Price | When |
|---|---|---|
| Keyword stock & price summary | **$0.02** | Per search word analyzed |
| Individual item | **$0.002** | Only if you enable **Also list every item** |

A default run (1 search word, summary only) costs **$0.02**. You pay per search word; there is no fixed monthly fee. **A search word that returns zero listings is never charged.** At most 10 search words are used per run.

### Input

| Field | Example | Notes |
|---|---|---|
| `keywords` | `["HGUC"]` | 1–10 search words, one summary row each, $0.02 each. Japanese finds far more than English — measured 2026-09-09: `gundam` 223 items in stock, `ガンダム` 1,075. At most 10 words per run; the form will not take more |
| `category` | `"gunpla"` | Which part of the shop: `all`, `gunpla`, `figure`, `mecha`, `plamo`, `car`, `paint`, `rail`, `train`, `mini`, `chara`, `doll`, `toy`, `rc`, `military`, `toreca`, `book`. Narrowing drops items that only share the word (`ガンダム` in `all` also returns marker pens) |
| `inStockOnly` | `true` | On by default. The shop's own "hide what is out of stock" filter — prices then cover only what you can buy today. Off prices the whole catalogue including sold-out items |
| `useJapaneseAliases` | `true` | On by default. Swaps a short list of whole English words for the Japanese the shop indexes (`gundam` → `ガンダム`). Part numbers are never touched; `searchTermUsed` says what was searched |
| `includeIndividualItems` | `false` | Enable to also get one row per item (+$0.002 each) |
| `maxItemPages` | `1` | 1–3. Only matters with the item list on: 60 items per page, so at most 60 / 120 / 180 rows charged |
| `convertToUsd` | `true` | Adds USD figures at today's rate. A failed lookup never fails the run |

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

Every record carries **`priceJpyBasis`** and **`shareBasis`**, so you never have to guess. The two are often different in the same row, which is the point of labelling both.

| Label | What it means | When you get it |
|---|---|---|
| **`exact`** | The pages read covered every matching item — the figures cover all of them | The search fits on one page (60 items or fewer) |
| **`population_quantiles`** | The price points were read straight out of the shop's own cheapest-first order at the item that sits a quarter, halfway and three quarters down the whole result set. They cover **every** matching item, not a sample | `priceJpyBasis` only, on any search bigger than one page |
| **`sample`** | The figures cover only the items actually read (`sampledListings` says how many) | `shareBasis` on any search bigger than one page; `priceJpyBasis` if the guard below trips |

**Why the price points can claim that and the share figures cannot.** Hobby Search offers a cheapest-first sort, and the order holds *across* pages: measured 2026-09-09 on `ガンダム`, page 9 ends at ¥1,485 and page 10 starts at ¥1,496. So the item at rank 25%, 50% and 75% of the result set can be looked up directly by jumping to its page — no reading of the other thousand items required. Nothing on the card is sorted that way, so the discount, pre-order and stock-tag shares are counted over the pages actually read and say so.

Every run re-checks the order: each page read must not fall, and the five price points must rise. If either check fails, `monotonicityCheck` becomes `violated` and `priceJpyBasis` drops to `sample` — the record never keeps a coverage claim it can no longer support.

Our sibling Actor for HobbyLink Japan (`hlj-hobby-market-checker`) has no such option: HLJ orders results by relevance and offers no price sort at all, so every figure there is a sample and is labelled as one. Hobby Search is also a Japanese domestic shop rather than an exporter, so the yen figure and the % off refer to the Japanese list price.

### When a search word comes back empty

`keywordStatus` tells you which kind of empty it is, and `hint` names the next thing to try in one sentence (`null` otherwise):

| `keywordStatus` | Meaning | What the `hint` suggests |
|---|---|---|
| `ok` | Items were read | — |
| `not_found` | The shop matched nothing at all under that word | Try the Japanese name or the part number as printed |
| `unknown` | The shop stocks items under that word, but none can be bought today | Turn off **Only what is in stock** |

**Neither empty is charged.** The counts that tell them apart are real: `totalFound` is the shop's hit count with no stock filter, `inStockFound` is its hit count with the filter on.

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

Measured on 2026-09-09 (real run, `{"keywords": ["HGUC"], "category": "gunpla", "inStockOnly": true, "includeIndividualItems": false}`). The whole record, nothing shortened. This search returns 27 items, which fit on one page, so both bases read `exact` and `average` is a real mean; on a larger search `priceJpyBasis` would read `population_quantiles` and `average` would be `null`.

```json
{
  "type": "stock_price_summary",
  "keyword": "HGUC",
  "searchTermUsed": "HGUC",
  "keywordAliasApplied": false,
  "keywordStatus": "ok",
  "categoryUsed": "gunpla",
  "sortUsed": "price_asc",
  "totalListingsFound": 27,
  "totalFound": 306,
  "inStockFound": 27,
  "inStockRate": 0.0882,
  "inStockFilterConfirmed": true,
  "sampledListings": 27,
  "priceJpy": { "min": 363, "p25": 701, "median": 1584, "p75": 2618, "max": 9900, "average": 2151 },
  "priceJpyBasis": "exact",
  "monotonicityCheck": "ok",
  "discountedShare": 0.8889,
  "discountPctMedian": 20,
  "preorderShare": 0.0,
  "lastFewUnitsShare": 0.0,
  "stockTagBreakdown": { "販売中": 26, "再入荷": 17, "お取り寄せ": 1 },
  "releasedShare": 1.0,
  "shareBasis": "exact",
  "hint": null,
  "truncatedForTimeLimit": false,
  "sourceUrl": "https://www.1999.co.jp/search?typ1_c=109&cat=gundam&target=&searchkey=HGUC&spage=1&sortid=2&sold=1",
  "checkedAt": "2026-09-09T12:00:56.766979+00:00",
  "priceUsd": { "min": 2.36, "p25": 4.56, "median": 10.3, "p75": 17.02, "max": 64.36, "average": 13.98 },
  "exchangeRateJpyUsd": 0.006501
}
```

Reading it: of the 306 `HGUC` items the shop lists in Gunpla, **27 can be bought today** (`inStockRate` 8.8%). Those 27 run ¥363 to ¥9,900 with a typical ¥1,584. **24 of them are discounted** (`discountedShare` 0.89) and the usual cut is **20% off the Japanese list price** (`discountPctMedian`). Nothing is on pre-order and nothing is down to its last units. The tags add up to more than 27 because one item can carry several.

With `includeIndividualItems` on you also get one row per item: `itemCode`, `name`, `url`, `priceJpy`, `listPriceJpy`, `discountPct`, `stockTags`, `remainingUnits`, `releaseText`, `isPreorder`.

### What this Actor does not do

- **No sold prices.** Hobby Search is a shop: these are **asking** prices, what a buyer would pay today, not what something changed hands for
- **No tax claim.** The prices are reported exactly as the shop displays them. The search results page contains no statement about tax either way, so this Actor does not add one
- **No product text, reviews or images.** Only the listing facts above are read — never descriptions, review bodies or image links
- **No item rows by default.** The product is the statistic; individual items are opt-in and separately priced
- **No login-only data.** Everything comes from public search pages
- **Nothing is stored.** Every run reads the shop live; nothing is kept between runs
- **No customer or seller information.** Hobby Search is a single retailer — there are no third-party sellers to profile

### Notes on the data

- **Page shape.** `https://www.1999.co.jp/search` is server-rendered UTF-8 HTML with **60 items per page**, no login and no hidden data feed. `robots.txt` is 531 bytes and sets neither a rule nor a delay for ordinary readers; the 1.5-second gap between requests here is self-imposed. A default run is **2 requests** when the search fits on one page and at most **6** when it does not
- **The hit count is the shop's own** and appears three times identically on the same page. It is the count for whatever filter was sent, which is what makes `inStockFound` exact rather than estimated
- **What "in stock" means here.** `inStockOnly` uses the shop's own 「在庫なしを除く」 filter, and it is a real filter rather than a label: measured 2026-09-09, `ガンダム` returns 11,824 items unfiltered and 1,075 with it on. The card tags say the same thing. On the cheapest-first page 9 of that search, **all 60 cards carry 「在庫なし」 unfiltered and none of the 60 do with the filter on** — that is the evidence the count rests on. The shop's second out-of-stock tag, the 「注文再開メール」 ("email me when it is back") button, was on only 10 of those same 60, so it is a weaker signal and is used as a second opinion, not the check. Every run re-reads both tags on the pages it reads and reports the result as `inStockFilterConfirmed`
- **Discounts are counted two ways on purpose.** The shop prints a % off only on discounted items, and coverage swings by page (measured 2026-09-09: 24 of 27 on the example above, 202 of 300 on a wider search). A single average over everything would be meaningless, so you get `discountedShare` (how many are discounted) and `discountPctMedian` (the usual cut among those) separately
- **Stock tags are every tag in the shop's own tag list except the delivery labels** (ゆうパケット, ネコポス, クリックポスト, メール便, 宅配便, 送料無料, 定形外). Both halves of that rule were measured on 2026-09-09. Delivery labels have to go: 「ゆうパケット」 sits in the same list as the stock states and was on 49 of 60 cards on one page, so keeping it would make a postage method the commonest "stock state". But they cannot be filtered by markup either, because the shop marks up only the *emphasised* states: 「在庫なし」 is printed plain, and on the unfiltered page 9 of `ガンダム` all 60 cards carried it. Everything else the shop prints is passed through, including tags added after this was written
- **`releasedShare`** splits the release line by its ending: 「発売」 (already out) against 「発売予定」 (still to come). The date itself is often written without a year, so only that split is reported
- **Latin words find much less.** Measured 2026-09-09: `gundam` 223 in-stock items against `ガンダム` 1,075, and `nendoroid` 0 against `ねんどろいど` 844. `useJapaneseAliases` swaps a short list of whole English words for the Japanese spelling and `searchTermUsed` always tells you what was actually searched
- **A known single point of failure.** Hobby Search runs a Cloudflare managed challenge on `/terms/`, `/faq` and `/eng/` — all of them answer 403 with a challenge page, verified again on 2026-09-09 from a datacenter address. Only `/search` is passed through. If that rule ever widens to `/search` there is no browser-free way around it: the run fails and says so by name rather than reporting an empty shelf
- Requests are throttled and the run carries a time budget; if it is reached, later search words skip their price-point lookups, and their records say so with `truncatedForTimeLimit: true` and a `sample` basis

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

- [BookOff Japan Used Manga, Books, CDs — Price & Stock](https://apify.com/jpmarketdata/bookoff-market-checker)
- [@cosme Japan Beauty Ranking — Top 50 Ratings & Prices](https://apify.com/jpmarketdata/cosme-beauty-market-checker)
- [Digimart Japan Used Guitar & Instrument Prices](https://apify.com/jpmarketdata/digimart-instrument-market-checker)
- [Fujiya Camera Japan Used Camera Prices by Condition](https://apify.com/jpmarketdata/fujiya-camera-market-checker)
- [GU Japan Prices — Typical Price and Markdown Share](https://apify.com/jpmarketdata/gu-japan-price-checker)
- [HobbyLink Japan Gunpla & Figure Prices + Stock Status](https://apify.com/jpmarketdata/hlj-hobby-market-checker)
- [Iosys Japan Used iPhone & Phone Prices by Condition](https://apify.com/jpmarketdata/iosys-phone-market-checker)
- [JACKROAD Japan Watch Prices — New, Used, Vintage, In Stock](https://apify.com/jpmarketdata/jackroad-watch-price-checker)
- [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 Hobby Search**. 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 or more search words; each gets its own summary row. Japanese finds far more than English here (measured 2026-09-09: `gundam` 223 items in stock, `ガンダム` 1,075); part numbers work as printed (`HGUC`, `MG`). Each word is charged $0.02, and a word that finds nothing is not charged. At most 10 words run per call, inside the $3.00 Maximum cost per run; split the run to do more.

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

Which part of the shop to look in. `all` searches everything; picking a section removes items that merely share the word (searching `ガンダム` in everything also returns marker pens and tools). Narrowing a section lowers the counts and can change the typical price a lot. It does not change what you are charged.

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

On by default: the shop hides everything it cannot sell today, and the prices you get cover only items you could buy right now. Turn it off to price the whole catalogue including sold-out items — the typical price usually moves, because old sold-out items sit at a different price than current stock. Either way you get both counts and the share in stock. It does not change what you are charged.

## `useJapaneseAliases` (type: `boolean`):

On by default: a short list of English words is swapped for the Japanese the shop indexes (`gundam` to `ガンダム`, `nendoroid` to `ねんどろいど`). Without it those words find far fewer items, or none. Only whole listed words are swapped, so part numbers go through as typed, and `searchTermUsed` says what was searched. It does not change what you are charged.

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

Off by default: a run costs a flat $0.02 per search word for the summary. Turn it on to also get one row per item (name, code, link, price, list price, discount, stock tags, units left, release line) at +$0.002 per row. The rows are the items on the pages set below, 60 to a page.

## `maxItemPages` (type: `integer`):

How many pages of items to return when the item list above is on, cheapest first, 60 items to a page. This is the cap on rows charged at $0.002 each: 1 page is at most 60 rows, 3 pages at most 180. It has no effect while the item list is off, and it never changes the summary numbers.

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

Adds USD figures next to the yen ones using today's exchange rate. A failed rate lookup never fails the run — you simply get the yen numbers on their own. It does not change what you are charged.

## Actor input object example

```json
{
  "keywords": [
    "HGUC"
  ],
  "category": "gunpla",
  "inStockOnly": true,
  "useJapaneseAliases": true,
  "includeIndividualItems": false,
  "maxItemPages": 1,
  "convertToUsd": true
}
```

# Actor output Schema

## `stockPriceSummaries` (type: `string`):

One row per search word with the in-stock count out of all found, the price range and the usual discount off the Japanese list price.

# 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": [
        "HGUC"
    ],
    "category": "gunpla",
    "inStockOnly": true,
    "useJapaneseAliases": true,
    "includeIndividualItems": false,
    "maxItemPages": 1,
    "convertToUsd": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("jpmarketdata/hobbysearch-japan-stock-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": ["HGUC"],
    "category": "gunpla",
    "inStockOnly": True,
    "useJapaneseAliases": True,
    "includeIndividualItems": False,
    "maxItemPages": 1,
    "convertToUsd": True,
}

# Run the Actor and wait for it to finish
run = client.actor("jpmarketdata/hobbysearch-japan-stock-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": [
    "HGUC"
  ],
  "category": "gunpla",
  "inStockOnly": true,
  "useJapaneseAliases": true,
  "includeIndividualItems": false,
  "maxItemPages": 1,
  "convertToUsd": true
}' |
apify call jpmarketdata/hobbysearch-japan-stock-price-checker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jpmarketdata/hobbysearch-japan-stock-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/N4nZ5L4nA2av54AVR/builds/83m8ZBqaaYyU9zdR9/openapi.json
