# Kakaku.com Japan Lowest Prices — Shops, Rank, Rating (`jpmarketdata/kakaku-japan-price-checker`) Actor

Type a product keyword and get what it costs on Kakaku.com, Japan's largest price-comparison site. You get the lowest listed price, how many shops sell it, its popularity rank and review score, plus the typical price across matching products. $0.02 per keyword, no results = no charge. Unofficial.

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

## Kakaku.com Japan Lowest Prices — Shops, Rank, Rating

> **Unofficial** — independent tool, **not affiliated with, endorsed by, or sponsored by Kakaku.com**. 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 product keyword and get what it costs new in Japan on Kakaku.com — lowest price, how many shops sell it, popularity rank, review score.

**You enter:** one or more keywords — a model number like `LUMIX TZ99`, or the Japanese name `カメラ` (camera). A weekly ranking page can be given instead, on its own.

**You get:** one row per keyword: lowest price (typical and lowest–highest) over the products read, shops per product, review score, the top match's rank (`1` of `2,246`), the site's own price band table over every priced hit, and the site's hit counts.

**Price:** $0.02 per keyword — a weekly ranking page counts as one keyword. +$0.002 per row if you also want one row per product. No results = no charge.

**Example:** enter `LUMIX TZ99` → 1,129 hits · 1 catalogue product and 39 shop listings read · lowest price ¥70,074 at 40 shops · rank 1 of 2,246 · review 4.13 from 53 people · the typical priced hit is only ¥2,588 because cases and filters match the same words (real run, 2026-09-08)

> Unofficial — not affiliated with Kakaku.com. Reads public pages only.

### Pricing — $0.02 per keyword

| Event | Price | When |
|---|---|---|
| Keyword price summary | **$0.02** | Per keyword, and per weekly ranking page |
| Individual product | **$0.002** | Only if you turn on **Include individual products** |

A default run (1 keyword, summary only) costs **$0.02** and makes 2 requests to the site. You pay per keyword; there is no monthly fee. **A keyword that returns zero listings is never charged**, and neither is one the site answers with its "0 件" page.

Two limits meet a long list, and the time one arrives first: the run's default time limit is 300 seconds, which at ≥1.6 s per request is about 80 keywords at one page each with the rank lookup on, while the platform's **Maximum cost per run** ($3.00 by default) buys 150 summaries. Keywords the run has no time left for are skipped — not read, not charged, and named in the log. Raise either limit in the run options, or split the list across runs.

### Input

| Field | Example | Notes |
|---|---|---|
| `keywords` | `["LUMIX TZ99"]` | Model numbers as printed (`ILCE-7M4`) or Japanese names (`カメラ`). Each keyword costs $0.02. Give keywords, `rankingUrls`, or both — at least one of the two |
| `rankingUrls` | `["https://kakaku.com/camera/digital-camera/ranking_0050/"]` | Optional, and usable on its own without any keyword: Kakaku.com's weekly best-seller lists. Each address costs $0.02, like a keyword. Only this exact address form is read |
| `category` | `"0003_0001"` | Optional. One category only: `0003_0001` digital cameras, `0003` cameras, `0005` phones, `0001` computers. Changes the hit count, the price bands and which products are measured |
| `pagesPerKeyword` | `1` | 1–5. One page = up to 40 products in popularity order = 1 request. Default 1 |
| `sortBy` | `"standard"` | `standard` (popularity, the site's own order), `price_asc`, `price_desc`. Use the price orders only together with a `category` — see below |
| `priceMin` / `priceMax` | `50000` / `100000` | Optional yen limits. They narrow the hit count and the price bands as well as the products measured |
| `includeTopProductRank` | `true` | On by default. Adds the top match's `rank` / `rankOf` from its product page (1 extra request per keyword, no extra charge) |
| `includeIndividualItems` | `false` | Turn on to also get one row per product read (+$0.002 each) |
| `convertToUsd` | `true` | Adds US$ figures at today's rate. A failed rate lookup never fails the run |

### Which number covers what

Two different price numbers come back, and they answer two different questions. Both carry a label so you never have to guess:

| Field | Label | What it covers |
|---|---|---|
| `priceJpy` | `priceJpyBasis: "sampled_catalog_products"` | The lowest price of each catalogue product actually read (up to 40 per page). `count` says how many products that was |
| `priceBands` / `bandMedian` | `priceBandsBasis: "all_priced_hits_including_accessories"` | The site's **own** 56-band count over every priced hit for the keyword — shop listings, cases, filters and spare batteries included |

That is why the example above shows ¥70,074 next to ¥2,588: the first is the camera, the second is the middle of everything the words `LUMIX TZ99` match on the site. `pricedListings` (the bands' total) next to `totalListingsFound` tells you how much of the result set carries a price at all — 1,129 of 1,129 here, 96% for a broad word like `カメラ`.

`productsSampled` and `mallListingsSampled` split what was read: catalogue products (the ones with a shop count, a rank and a review score) and single-shop listings, which are counted but never returned as rows and never followed — those links point into a part of the site that robots.txt closes.

### When a keyword comes back empty

`keywordStatus` is `ok` as soon as a catalogue product was read, `not_found` when the site declares 0 hits, and `unknown` when there are hits but all of them are shop listings, so there is no lowest price, shop count or rank to report. The last two come with a one-sentence `hint` naming the next thing to try (`null` otherwise). **Neither a `not_found` keyword nor a failed run is charged.**

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

Measured on 2026-09-08 (real run, `{"keywords": ["LUMIX TZ99"], "pagesPerKeyword": 1, "includeTopProductRank": true, "includeIndividualItems": false}`). The whole row, nothing shortened — including all 56 price bands exactly as the site counted them.

```json
{
  "type": "keyword_price_summary",
  "keyword": "LUMIX TZ99",
  "keywordStatus": "ok",
  "sortUsed": "standard",
  "categoryUsed": null,
  "totalListingsFound": 1129,
  "pricedListings": 1129,
  "sampledListings": 40,
  "productsSampled": 1,
  "mallListingsSampled": 39,
  "priceJpy": {
    "min": 70074,
    "p25": 70074,
    "median": 70074,
    "p75": 70074,
    "max": 70074,
    "average": 70074,
    "count": 1
  },
  "priceJpyBasis": "sampled_catalog_products",
  "priceUsd": {
    "min": 453.8,
    "p25": 453.8,
    "median": 453.8,
    "p75": 453.8,
    "max": 453.8,
    "average": 453.8
  },
  "exchangeRateJpyUsd": 0.006476,
  "shopCount": { "min": 40, "median": 40, "max": 40 },
  "rating": { "average": 4.13, "ratedProducts": 1 },
  "priceBands": [
    { "from": null, "to": 199, "count": 0 },
    { "from": 200, "to": 399, "count": 0 },
    { "from": 400, "to": 599, "count": 8 },
    { "from": 600, "to": 799, "count": 4 },
    { "from": 800, "to": 999, "count": 58 },
    { "from": 1000, "to": 1199, "count": 89 },
    { "from": 1200, "to": 1399, "count": 108 },
    { "from": 1400, "to": 1599, "count": 59 },
    { "from": 1600, "to": 1799, "count": 73 },
    { "from": 1800, "to": 1999, "count": 61 },
    { "from": 2000, "to": 2249, "count": 19 },
    { "from": 2250, "to": 2499, "count": 63 },
    { "from": 2500, "to": 2999, "count": 128 },
    { "from": 3000, "to": 3499, "count": 113 },
    { "from": 3500, "to": 3999, "count": 121 },
    { "from": 4000, "to": 4499, "count": 30 },
    { "from": 4500, "to": 4999, "count": 13 },
    { "from": 5000, "to": 5999, "count": 26 },
    { "from": 6000, "to": 6999, "count": 9 },
    { "from": 7000, "to": 7999, "count": 1 },
    { "from": 8000, "to": 8999, "count": 1 },
    { "from": 9000, "to": 9999, "count": 1 },
    { "from": 10000, "to": 12499, "count": 0 },
    { "from": 12500, "to": 14999, "count": 0 },
    { "from": 15000, "to": 17499, "count": 0 },
    { "from": 17500, "to": 19999, "count": 0 },
    { "from": 20000, "to": 22499, "count": 0 },
    { "from": 22500, "to": 24999, "count": 0 },
    { "from": 25000, "to": 27499, "count": 0 },
    { "from": 27500, "to": 29999, "count": 0 },
    { "from": 30000, "to": 32499, "count": 0 },
    { "from": 32500, "to": 34999, "count": 0 },
    { "from": 35000, "to": 37499, "count": 0 },
    { "from": 37500, "to": 39999, "count": 0 },
    { "from": 40000, "to": 42499, "count": 0 },
    { "from": 42500, "to": 44999, "count": 0 },
    { "from": 45000, "to": 47499, "count": 0 },
    { "from": 47500, "to": 49999, "count": 0 },
    { "from": 50000, "to": 54999, "count": 0 },
    { "from": 55000, "to": 59999, "count": 0 },
    { "from": 60000, "to": 64999, "count": 0 },
    { "from": 65000, "to": 69999, "count": 0 },
    { "from": 70000, "to": 74999, "count": 2 },
    { "from": 75000, "to": 79999, "count": 71 },
    { "from": 80000, "to": 84999, "count": 28 },
    { "from": 85000, "to": 89999, "count": 13 },
    { "from": 90000, "to": 94999, "count": 8 },
    { "from": 95000, "to": 99999, "count": 9 },
    { "from": 100000, "to": 124999, "count": 5 },
    { "from": 125000, "to": 149999, "count": 3 },
    { "from": 150000, "to": 174999, "count": 3 },
    { "from": 175000, "to": 199999, "count": 2 },
    { "from": 200000, "to": 299999, "count": 0 },
    { "from": 300000, "to": 399999, "count": 0 },
    { "from": 400000, "to": 499999, "count": 0 },
    { "from": 500000, "to": null, "count": 0 }
  ],
  "priceBandsBasis": "all_priced_hits_including_accessories",
  "bandMedian": 2588,
  "topProduct": {
    "id": "J0000046783",
    "name": "LUMIX DC-TZ99",
    "maker": "パナソニック",
    "category": "デジタルカメラ",
    "lowestPrice": 70074,
    "shopCount": 40,
    "rating": 4.13,
    "reviewCount": 53,
    "releaseDate": "2025-02-20",
    "url": "https://kakaku.com/item/J0000046783/",
    "rank": 1,
    "rankOf": 2246
  },
  "hint": null,
  "truncatedForTimeLimit": false,
  "sourceUrl": "https://search.kakaku.com/LUMIX%20TZ99/?sort=standard&page=1",
  "checkedAt": "2026-09-08T12:25:36.245453+00:00"
}
```

With `includeIndividualItems` on you also get one `type: "item"` row per product read: `productId`, `name`, `maker`, `category`, `lowestPrice`, `shopCount`, `rating`, `reviewCount`, `releaseDate`, `url`, `rankInSearch`, `page`. A ranking address instead returns one `type: "ranking_summary"` row: `rankingUrl`, `updatedOn`, `aggregateWindow` (the week the site counted), `rankedProducts`, `pricedProducts`, `priceJpy`, `rating`, and `top` — the first 10 products with their rank, maker, lowest price and score.

### What this Actor does not do

- **No sold prices.** These are shop prices you could pay today, not what anything actually sold for. Kakaku.com publishes no sale records
- **No shop-by-shop price list.** The row says how many shops sell a product, not which ones or at what price each
- **No price history.** The site's price-history endpoint is closed to automated readers by its robots.txt, so it is never touched
- **No shop listing links.** Single-shop offers are counted (`mallListingsSampled`) but their links leave the site through a path robots.txt closes, so no such address is ever read or returned
- **No reviews, images or product descriptions.** Only facts and figures: names, makers, prices, shop counts, ranks, scores, release dates
- **No login-only pages, and nothing is kept.** Every run reads public pages live

### Notes on the data

- **"0 hits" arrives as an HTTP 404** with a complete page — measured 2026-09-08, a keyword the site does not carry returns 404 and 20,746 bytes of ordinary HTML. That is reported as `not_found`, not as a failure. A 404 from a ranking page or a product page is treated as a real miss instead
- **The hit count includes shop listings.** `totalListingsFound` is the site's own number (`1,129件`) and counts catalogue products plus single-shop offers, which is why a model keyword can show thousands of hits and a single product. It also drifts by a few hundred between requests on very broad words
- **One result page holds 40 products** (plus up to 10 `[PR]` cards, which are always dropped). A page is 250–310 KB, a product page up to 571 KB
- **Cheapest-first is a trap on model keywords.** Measured 2026-09-08: `LUMIX TZ99` sorted cheapest-first returns 40 cards of ¥400–800 cases and filters and not one camera. Popularity order is the default for that reason, and `sortUsed` always says which order produced the row
- **Ranks are weekly.** A ranking row carries `updatedOn` and `aggregateWindow` — e.g. updated 2026-09-08 from the week 2026-09-01 to 2026-09-07. Ranks can tie, and a ranked product with no shop price today shows `¥―` on the site and `lowestPrice: null` here; those rows are counted but stay out of the price figures (`pricedProducts` says how many had a price)
- **A brand-new product can have a price and no score yet** (`rating: null`, `reviewCount: null`); `rating.ratedProducts` says how many of the products read had a score at all
- **Release dates** are converted to `2025-02-20` form; a product announced only by month keeps `2025-02`, and one with no date at all stays empty
- **Every page is Shift\_JIS** and is read as `cp932` with replacement for the handful of characters that break strict decoding. The keyword itself travels UTF-8 percent-encoded inside the address
- Requests are throttled to ≥1.6 s and the run carries two wall-clock marks. At 90 seconds the extra pages and the rank lookup are dropped, and the rows that were cut say so (`truncatedForTimeLimit: true`); at 240 seconds no new keyword is started, so the run finishes inside the platform's 300-second limit instead of being killed — the keywords it did not reach are listed in the log and are never charged

### 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)
- [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)
- [KOMEHYO Japan Luxury Resale Prices by Condition](https://apify.com/jpmarketdata/komehyo-luxury-market-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 Kakaku.com**. 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`):

The model number as printed on the box (`LUMIX TZ99`, `ILCE-7M4`) or the Japanese product name (`カメラ`). Each returns one summary row and is charged $0.02; one that finds nothing is not charged. Give keywords, ranking pages or both; at least one is required. About 80 keywords fit a run's default limits (300-second time limit, $3.00 Maximum cost per run); extras are skipped, not charged.

## `rankingUrls` (type: `array`):

Optional, and usable on its own without any keyword: Kakaku.com's weekly best-seller lists, e.g. `https://kakaku.com/camera/digital-camera/ranking_0050/`. Each address returns one row of the ranked products with their rank, maker, lowest price and review score, and is charged $0.02, the same as a keyword. Only addresses of that exact form are read; anything else is skipped with a note in the log.

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

Optional. Narrows the search to one Kakaku.com category, which changes the hit count, the price band table and which products are measured. Examples: `0003_0001` digital cameras, `0003` cameras, `0005` phones, `0001` computers. Leave empty to search the whole site. These codes are not the numbers you see in a `ranking_NNNN` address.

## `pagesPerKeyword` (type: `integer`):

How many result pages to read per keyword. One page holds up to 40 products in popularity order and costs one request, so more pages means the price, shop-count and review numbers are measured over more products and the run takes longer. It does not change what a keyword costs; with individual product rows turned on it does change how many rows you get (+$0.002 each).

## `sortBy` (type: `string`):

Which order the site returns matches in, and therefore which products are measured. Popularity is the site's own order and the only one that works on a model keyword: cheapest-first on `LUMIX TZ99` returns 40 cases, filters and straps and not one camera. Use the price orders together with a category code.

## `priceMin` (type: `integer`):

Optional. Drops everything below this yen price from the search, so the hit count, the price band table and the measured products all shrink to that band. Leave empty for no lower limit.

## `priceMax` (type: `integer`):

Optional. Drops everything above this yen price from the search, so the hit count, the price band table and the measured products all shrink to that band. Leave empty for no upper limit.

## `includeTopProductRank` (type: `boolean`):

On by default. Reads the product page of the most popular match and adds where it sits in Kakaku.com's weekly best-seller list (`rank`, `rankOf` — e.g. 1 of 2,246; empty when the product is not ranked). Costs one extra request per keyword and does not change what you are charged. Turn it off for the shortest possible run.

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

Off by default: a run costs a flat $0.02 per keyword summary. Turn it on to also get one row per product read — name, maker, lowest price, how many shops sell it, review score, release date and link — at +$0.002 per row. Shop-only listings are never returned as rows, only counted.

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

Adds US$ figures next to the yen ones using today's exchange rate (open.er-api.com). A failed rate lookup never fails the run — you simply get the yen numbers on their own.

## Actor input object example

```json
{
  "keywords": [
    "LUMIX TZ99"
  ],
  "rankingUrls": [],
  "category": "",
  "pagesPerKeyword": 1,
  "sortBy": "standard",
  "includeTopProductRank": true,
  "includeIndividualItems": false,
  "convertToUsd": true
}
```

# Actor output Schema

## `priceSummaries` (type: `string`):

One row per keyword: the lowest listed price in yen and US$ over the products read, how many shops sell each of them, the review score, the top match's popularity rank, and the site's own price band table over every match that carries a 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": [
        "LUMIX TZ99"
    ],
    "rankingUrls": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("jpmarketdata/kakaku-japan-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": ["LUMIX TZ99"],
    "rankingUrls": [],
}

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

```

## MCP server setup

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