# Japan Used Truck Prices — By Mileage, Not Just Year (`jpmarketdata/truckbank-japan-used-truck-checker`) Actor

Pick a truck maker and model and see what it costs used in Japan today, split by how far it has run. You get the typical price and range in yen for each mileage band, how many trucks that is, and the year mix. $0.02 per model, no results = no charge. Unofficial.

- **URL**: https://apify.com/jpmarketdata/truckbank-japan-used-truck-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 model 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

## Japan Used Truck Prices — By Mileage, Not Just Year

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

**What it does:** Pick a truck maker and model and get what a used one costs on Truck Bank Japan today, split by how far it has run.
**You enter:** A maker and a model — for example `ISUZU` and `ELF`. Years are optional.
**You get:** The typical vehicle price and range in yen; the same for each mileage band, with how many trucks stand in it; how many listings publish a price at all; the year mix; the prefectures. Read from 5 to 12 of the site's own pages.
**Price:** $0.02 per model. No results = no charge, and a model whose every listing says "ask the dealer" is not charged either. +$0.002 per truck if you also want the listings themselves, one row each (off by default).

**Example:** enter `ISUZU` / `ELF` → 1,105 of 1,786 listings publish a price · typical ¥3,080,000 · range ¥268,000–¥12,580,000 · under 200,000 km: 823 trucks, typical ¥3,400,000 · 200,000–500,000 km: 267 trucks, ¥2,398,000 · 500,000 km and over: 13 trucks, ¥1,958,000 (real run, 2026-09-10)

> Unofficial — not affiliated with Truck Bank. Reads public pages only.

### Why the split by distance run

Truck Bank publishes a price guide of its own, and it is a grid of **year against price band**. It has no distance axis at all. Yet distance run is what a used truck is priced on, and the site's own search filters on it — so the split exists in its data and nowhere in its published figures.

That is the whole of this Actor's claim: the year table is something the site already gives away, and the mileage table is not.

Measured on 2026-09-10, ISUZU ELF (real run):

| Distance run | Trucks | Cheapest | Typical |
|---|---|---|---|
| Up to 200,000 km | 823 | ¥268,000 | ¥3,400,000 |
| 200,000–500,000 km | 267 | ¥790,000 | ¥2,398,000 |
| 500,000 km and over | 13 | ¥968,000 | ¥1,958,000 |

### How the figures are taken

Truck Bank prints the matching count on every results page, accepts any row offset, and can order the results by vehicle price. So the truck standing at position N/4 of that order **is** the lower end of the middle 50%: reading it costs one page instead of the 56 pages a full sweep of that model would take.

Every figure in `priceJpy` is therefore one real listing read at its own place in the line — not an average over a sample. `priceBasis` says `ladder` when the figures were read that way and `exact` when the whole model fitted on one page and was read entire.

**The one way that can break is checked on every page.** The ordering is a search parameter, and this site ignores a value it does not recognise without saying so — measured 2026-09-10, both an unknown sort value and no sort at all answer with the site's newest-first default. A position read out of an unordered list would be a real price in the wrong column, so every page read is checked for climbing prices, the five published figures are checked against each other, and the run fails rather than publishing them. `sortCheck` in the record says it happened.

### What "price" means here

Nearly half of Truck Bank's stock carries no figure at all — it says "ask the dealer". Every statistic here is built on the listings that publish a price, and the record says how big the silent half was: `totalTrucks` counts every listing, `trucksWithPublishedPrice` counts the ones behind the figures, `publishedPriceRate` is the share. On the measured ELF search that was 1,105 of 1,786.

The main figures are the **vehicle price**. The total payable is published on only some listings, so it comes with `totalPayableCoverage` saying how many showed one, and it is taken over the rows the run read rather than off the ladder.

### Output

One row per model. `Measured on 2026-09-10 (real run, maker ISUZU / model ELF)`, trimmed:

```json
{
  "type": "used_truck_price_summary",
  "maker": "ISUZU", "model": "ELF",
  "makerOnSite": "いすゞ", "modelOnSite": "エルフ",
  "status": "ok",
  "totalTrucks": 1786,
  "trucksWithPublishedPrice": 1105,
  "publishedPriceRate": 0.6187,
  "trucksRead": 173,
  "priceJpy": {"min": 268000, "p25": 2200000, "median": 3080000,
               "p75": 4378000, "max": 12580000},
  "priceBasis": "ladder",
  "byMileageBand": [
    {"band": "Up to 200,000 km", "fromKm": null, "toKm": 200000,
     "trucks": 823, "minPriceJpy": 268000, "medianPriceJpy": 3400000,
     "maxPriceJpy": null, "trucksRead": 40, "priceBasis": "ladder"},
    {"band": "200,000–500,000 km", "fromKm": 200000, "toKm": 500000,
     "trucks": 267, "minPriceJpy": 790000, "medianPriceJpy": 2398000,
     "maxPriceJpy": null, "trucksRead": 40, "priceBasis": "ladder"},
    {"band": "500,000 km and over", "fromKm": 500000, "toKm": null,
     "trucks": 13, "minPriceJpy": 968000, "medianPriceJpy": 1958000,
     "maxPriceJpy": 5390000, "trucksRead": 13, "priceBasis": "exact"}
  ],
  "medianMileageBand": "Up to 200,000 km",
  "mileageKm": {"min": 1000, "p25": 67500, "median": 150000,
                "p75": 251500, "max": 1171000},
  "mileageBasis": "sample",
  "trucksWithAnImpossibleDistance": 2,
  "totalPayableJpy": {"min": 979910, "p25": 1638440, "median": 2640940,
                      "p75": 4430000, "max": 12780000},
  "totalPayableCoverage": 0.7457,
  "byYear": [{"year": 2026, "trucksRead": 1, "medianPriceJpy": 9757000}],
  "dealerPrefectures": [{"prefecture": "千葉県", "trucks": 27}],
  "countCheck": {"verdict": "mileage_bands_do_not_add_up",
                 "trucksCountedInThePage": 1105,
                 "trucksCountedInThePageDescription": 1105,
                 "countSources": "agree",
                 "trucksAcrossMileageBands": 1103,
                 "trucksInNoMileageBand": 2,
                 "mileageBands": "do_not_add_up"},
  "filterCheck": {"verdict": "narrowed",
                  "shareOfRowsPrintingTheModelAskedFor": 1.0,
                  "shareOfRowsCarryingAPublishedPrice": 1.0,
                  "shareOfBandRowsInsideTheirBand": 1.0},
  "sortCheck": {"verdict": "monotonic", "pagesChecked": 5,
                "pagesOutOfOrder": 0},
  "requestsUsed": 11,
  "fetchedAt": "2026-09-10T08:33:56+00:00"
}
```

The three columns that are taken over the rows the run read rather than from the site's own counts say so: `mileageBasis`, `byYearBasis` and `totalPayableBasis` all read `sample`. The band counts, the model counts and the price figures do not — they are the site's own numbers and its own listings.

`countCheck` is Truck Bank's arithmetic, checked. The site prints its count twice, in the page and in the page description, and the mileage bands ought to add back up to the model. Both hold most of the time and neither is quietly repaired: the ELF run above found 1,103 trucks across the three bands against 1,105 in the model — two listings that fall in no band — and said so rather than dropping the difference.

One more thing the site says and this Actor does not repeat: two ELF listings that day printed 129,482,000 km and 99,417,000 km, which is a dealer's typing rather than a truck. They stay in the band the site put them in and in the listing rows, and they are kept out of `mileageKm`, where one of them alone would print a range nobody could use. `trucksWithAnImpossibleDistance` counts them.

### Individual trucks

Turn on the listings and a second kind of row follows, one per truck: `maker`, `model`, `year`, `mileageKm`, `priceJpy`, `totalPayableJpy`, `bodyForm`, `inspection`, `dealerPrefecture`, `truckId` and a link to the site's own page. These are the listings already read for the summary, so they add rows and not waiting. At most 220 of them: eleven pages of twenty, less whatever a truck read twice takes off.

**No dealer name, no inquiry number and no phone number is returned**, on either kind of row. Every seller on Truck Bank is a dealer rather than a private person and the numbers on the page are call-forwarding lines, but none of it is read off the page at all, so the prefecture the truck stands in is the only thing here about who is selling it.

### What makes a run fail

A run that cannot answer honestly stops instead of returning an empty file, and says which of three things happened: the site did not answer, the site refused the page, or the site answered with something these figures cannot be built from. That last one covers a page with no count on it, a page that counts trucks and sends none, results that are not in price order, results that are not the model asked for, listings with no price arriving on a search for priced ones, mileage bands that came back unfiltered, and a model code the site has reassigned to a different truck.

A model with nothing listed is not a failure — it is an answer, it comes back with `status: not_found` and a note about what to try, and it is not charged. Nor is a model whose every listing says "ask the dealer": that comes back as `no_published_prices` with the count of trucks that are there, and it is not charged either.

### Load discipline

One page every 2.0 seconds, at most 12 pages a whole run, no login, no cookie, no browser and no proxy. Neither number can be reached from the input page. Individual truck pages are never opened — everything priced here is on the results page already — and nothing reads a member page, a saved search or a dealer's contact form.

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

- [Carsensor Japan Used Car Prices & Mileage by Model](https://apify.com/jpmarketdata/carsensor-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 Truck Bank**. 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

## `maker` (type: `string`):

Which maker's trucks to price. Everything in the run is measured over this maker's stock on Truck Bank, so the count, the typical price and the split by distance run all cover one maker and one model. It does not change what you are charged: one run is one model at a flat $0.02.

## `model` (type: `string`):

Which model of that maker to price — `ELF`, `CANTER`, `PROFIA`, `RANGER`. It has to be a model the maker above actually builds: Truck Bank answers a maker and model that do not go together with an empty page and no error at all, so a mismatched pair stops the run and prints that maker's own model list instead of returning nothing. It does not change what you are charged.

## `yearFrom` (type: `integer`):

Leave empty to cover every year on the site, which runs from 1996 to next year's models. Setting it drops everything older, so the count, the typical price and the split by distance run all cover the years you kept — and a truck's year moves its price more than anything else except how far it has run. It does not change what you are charged.

## `yearTo` (type: `integer`):

Leave empty to cover every year. Setting it drops everything newer. The two year boxes can be filled in either order — if the newer one arrives first they are swapped, because Truck Bank itself answers a reversed pair with an empty page and no error. It does not change what you are charged.

## `includeListings` (type: `boolean`):

Off by default: a run costs a flat $0.02 for the summary. Turn it on to also get one row per truck — year, distance run in km, vehicle price and total payable in yen, body shape, the prefecture it stands in and a link — at +$0.002 per row. The rows are the ones already read for the summary, at most 220 of them, so this adds rows, not waiting. No dealer name and no phone number is returned.

## Actor input object example

```json
{
  "maker": "ISUZU",
  "model": "ELF",
  "includeListings": false
}
```

# Actor output Schema

## `usedTruckPriceSummaries` (type: `string`):

One row per model with the typical price and range in yen, the same split by how far the truck has run, how many trucks sit in each band, and the year mix.

# 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 = {
    "maker": "ISUZU",
    "model": "ELF",
    "includeListings": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("jpmarketdata/truckbank-japan-used-truck-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 = {
    "maker": "ISUZU",
    "model": "ELF",
    "includeListings": False,
}

# Run the Actor and wait for it to finish
run = client.actor("jpmarketdata/truckbank-japan-used-truck-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 '{
  "maker": "ISUZU",
  "model": "ELF",
  "includeListings": false
}' |
apify call jpmarketdata/truckbank-japan-used-truck-checker --silent --output-dataset

```

## MCP server setup

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