# SUUMO Scraper & Japan Real Estate Monitor (`neverempty/suumo-japan-real-estate-monitor`) Actor

Japan property listings from SUUMO (suumo.jp) by prefecture, city or station: used condos, houses, land and rentals. Price in yen as a number, m², layout, year built, station and walk minutes, agency. Monitoring returns only new listings and price drops. Unofficial.

- **URL**: https://apify.com/neverempty/suumo-japan-real-estate-monitor.md
- **Developed by:** [NeverEmpty](https://apify.com/neverempty) (community)
- **Categories:** Real estate, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 listing returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## SUUMO Scraper & Japan Real Estate Monitor

Pull Japanese property listings from **SUUMO (suumo.jp)** — one of Japan's largest real estate portals — as clean JSON with English column names: the price in yen as a number, floor and land area in m², layout (1LDK, 3LDK ...), year built, nearest line, station and walking minutes, address and the listing agency. Search by **prefecture + city/ward** or by **station**, for **used condos, new houses, used houses, land and rentals**.

Turn on monitoring and every later run returns only **new listings and price drops** since the last run, with the previous price.

*Unofficial. This Actor is not affiliated with, endorsed by, or sponsored by SUUMO or Recruit Co., Ltd. All product names are trademarks of their respective owners.*

No API key, no login. Reads the same public list pages a visitor sees, at a gentle pace, and checks suumo.jp/robots.txt on every run.

***

### Who uses this

- **Overseas investors** watching Tokyo, Osaka or Fukuoka condos and land for new stock and price cuts.
- **Proptech and data teams** building price-per-m² comparisons by ward or station.
- **Relocation and rental services** collecting rents, deposits and key money by station.

### Monitoring: run it daily, get only what changed

Set `monitoringMode: true` and schedule the Actor:

1. **First run** — every listing in the search is remembered with its price. Nothing is returned and nothing is charged.
2. **Every later run** — only listings that are **new** (`changeType: "new"`) or **cheaper than last time** (`changeType: "price-drop"`, with `previousPriceYen`) are returned.
3. Every page compared that returned no change is charged one **search-checked** event (one per page, not per listing). A run where nothing changed returns one free note row plus those page checks; a run that returns changes is charged for the rows plus the pages that held no change. Narrow the search (a ward or a station) to compare fewer pages.

SUUMO's default order is not by date (and its sort parameter is disallowed in its robots.txt), so monitoring reads the whole search, up to `maxPages` (default 50 pages = about 1,000 sale listings). For a very large search, narrow it to a ward or station so the whole search fits; the log tells you if it did not.

Rows the run could not deliver (for example when your maximum charge is reached) are not remembered and come back on the next run.

### What makes the data usable

- **Japanese values kept, English numbers added.** `priceText: "1億2000万円"` stays as SUUMO writes it, and `priceYen: 120000000` is the number. `専有面積 24.9m²（7.53坪）（壁芯）` becomes `floorAreaSqm: 24.9`, `floorAreaBasis: "壁芯"` (wall-center measurement).
- **Ranges stay ranges.** New houses and land plots are often sold as `8489万円～1億247万円`: you get `priceMinYen` and `priceMaxYen` and `priceIsRange: true`, never a made-up single price.
- **No guessing.** `未定` (price not decided) and `1億3000万円台（予定）` (approximate) come back with `priceYen: null` and the original text.
- **Station and walk time as numbers.** `都営大江戸線「牛込神楽坂」徒歩1分` → `lineName`, `stationName`, `walkMinutes: 1`. Bus routes give `busMinutes` too.
- **Rentals: one row per room**, with `rentYen`, `managementFeeYen`, `depositYen`, `keyMoneyYen` (礼金), floor, layout, area, building age and every station listed.
- **Every row is from the search you asked for** — the listing id and URL come from SUUMO's own list for that ward or station.
- **No personal data.** The agency's company name is returned; the sales staff names and phone numbers shown on SUUMO are not.

### Input

| Field | Example | Notes |
|---|---|---|
| `propertyType` | `used-condo` | `used-condo` (中古マンション), `new-house` (新築一戸建て), `used-house` (中古一戸建て), `land` (土地), `rent` (賃貸) |
| `prefecture` | `tokyo` | SUUMO's romaji prefecture name: `tokyo`, `osaka`, `kanagawa`, `aichi`, `fukuoka` ... |
| `city` | `shinjuku` or `新宿区` | SUUMO's romaji ward/city name, or the Japanese name (looked up on SUUMO's prefecture page) |
| `station` | `ek_01820` | Optional SUUMO station code (Iidabashi), from a SUUMO station page address |
| `searchUrl` | `https://suumo.jp/chintai/tokyo/sc_shinjuku/` | Optional. Paste any SUUMO list page of the five types; overrides the fields above |
| `maxListings` | `20` | Rows to return (rentals: rooms) |
| `minPrice` / `maxPrice` | `50000000` | Yen. Rentals: monthly rent |
| `minAreaSqm` / `maxAreaSqm` | `40` | Floor area (land: land area) |
| `maxWalkMinutes` | `10` | Walk to the first station SUUMO lists |
| `minBuiltYear` | `1981` | Built in or after (Japan's new earthquake standard started in 1981) |
| `layouts` | `["2LDK","3LDK"]` | Layout contains one of these |
| `keywords` | `["タワー"]` | Name, headline, address, station or agency contains one of these |
| `monitoringMode` | `true` | Return only new listings and price drops |

Filters run on the listings already read, so they never change what SUUMO is asked for. A listing whose value is unknown (for example a price of `未定`) is kept, not dropped.

Example — used condos in Shinjuku, Tokyo:

```json
{ "propertyType": "used-condo", "prefecture": "tokyo", "city": "shinjuku", "maxListings": 20 }
```

Example — rentals near Iidabashi station under ¥150,000, checked daily:

```json
{ "propertyType": "rent", "prefecture": "tokyo", "station": "ek_01820", "maxPrice": 150000, "monitoringMode": true }
```

### Output

A used condo:

```json
{
  "status": "ok",
  "listingId": "21410687",
  "url": "https://suumo.jp/ms/chuko/tokyo/sc_shinjuku/nc_21410687/",
  "propertyType": "used-condo",
  "propertyTypeEn": "used condominium",
  "propertyTypeJa": "中古マンション",
  "propertyName": "メイジャー神楽坂",
  "priceText": "2499万円",
  "priceYen": 24990000,
  "priceMinYen": 24990000,
  "priceMaxYen": 24990000,
  "priceIsRange": false,
  "currency": "JPY",
  "address": "東京都新宿区岩戸町",
  "lineName": "都営大江戸線",
  "stationName": "牛込神楽坂",
  "walkMinutes": 1,
  "layout": "ワンルーム",
  "floorAreaSqm": 24.9,
  "floorAreaBasis": "壁芯",
  "balconyAreaSqm": 1.72,
  "builtYear": 1977,
  "builtMonth": 2,
  "agencyName": "東宝ハウスライフソリューションズグループ(株)東宝ハウス大田東京",
  "searchedArea": "東京都新宿区の中古マンション購入情報",
  "totalOnSuumo": 2170,
  "changeType": null,
  "previousPriceYen": null
}
```

Measured on SUUMO pages read on 2026-10-09 (Shinjuku and Setagaya, Tokyo): used condos and used houses had a numeric price, station walk time, year built, area and agency on 40/40 and 20/20 listings. New houses had a single numeric price on 4/20 and a numeric range on 8 more (the rest were `未定` or approximate). Land had a numeric price or range on 20/20 and agency on 19/20. Rentals (265 rooms) had a numeric rent, walk time, building age and area on every room.

#### Rows that are never charged

| `status` | Meaning |
|---|---|
| `no-results` | SUUMO answered and said nothing matches this search |
| `no-such-search` | SUUMO does not know this prefecture, city or station code (HTTP 404) — not a claim that there are no properties |
| `no-filter-match` | Listings were read but your filters removed all of them |
| `no-new-listings` | Monitoring: nothing new and no price drop since the last run |
| `monitoring-started` | Monitoring: first run, listings remembered |
| `unreadable` / `blocked` | A page could not be read or SUUMO did not serve it; nothing is guessed and no check is solved |
| `disallowed-by-robots` | The address is disallowed in suumo.jp/robots.txt and was not requested |

### Pricing

Pay per event: you pay for each listing row returned (`listing-returned`). In monitoring mode only, each list page that was compared with the remembered listings and held no new listing or price drop is charged one `search-checked` event. Pages are not charged outside monitoring mode, the first monitoring run (which only remembers) is free, runs where a page could not be read charge no checks, and every note row above is free. If your maximum charge is reached, rows come first and no checks are charged beyond the limit. See the Pricing tab for the current prices.

### Notes

- New condominium projects (新築マンション) use a different page layout and are not covered yet.
- SUUMO shows 20 properties per page for sales and about 20 buildings (100+ rooms) per page for rentals.
- On rentals, `-` for deposit, key money or management fee usually means none; the text is kept and the number is left empty.
- The same rental room can be listed by several agencies; SUUMO gives each its own listing id.

### Thanks for using this Actor

We build these tools for people who run them every day, and we improve them from what users tell us.

- **Missing a field, or need another filter?** Tell us in the **Issues** tab. If the data is there, we add it.
- **Found a bug or a wrong value?** Post the run ID in the **Issues** tab. Wrong data is the thing we fix first.

If this Actor saved you time, a short review helps other people find it.

# Actor input Schema

## `propertyType` (type: `string`):

What to search on SUUMO: used condos (中古マンション), new houses (新築一戸建て), used houses (中古一戸建て), land (土地) or rentals (賃貸, one row per room). Ignored when a SUUMO search URL is given.

## `prefecture` (type: `string`):

SUUMO's romaji prefecture name as it appears in its addresses, e.g. tokyo, osaka, kanagawa, aichi, fukuoka. Required unless a SUUMO search URL is given.

## `city` (type: `string`):

The city or ward: SUUMO's romaji name (shinjuku, minato, osakashikita) or the Japanese name (新宿区, 横浜市西区), which is looked up on SUUMO's prefecture page first. Leave empty when you search by station or paste a URL.

## `station` (type: `string`):

A SUUMO station code such as ek_01820 (Iidabashi), copied from a SUUMO station page address. When set, the search is around that station instead of the city. Leave empty to search by city.

## `searchUrl` (type: `string`):

Paste a SUUMO list page, e.g. https://suumo.jp/ms/chuko/tokyo/sc_shinjuku/ or https://suumo.jp/chintai/tokyo/ek_01820/. Only the type and the area/station are used. When set, property type, prefecture, city and station are ignored. Leave empty to use the fields above.

## `maxListings` (type: `integer`):

How many listings to return (rentals: rooms). You are charged only for rows you receive. SUUMO shows 20 properties per page; empty = 20.

## `maxPages` (type: `integer`):

Hard cap on list pages requested. 0 or empty = decided from maxListings (monitoring: 50 pages). Outside monitoring, reading pages is free and only returned listings are charged; in monitoring mode each page compared without a change is charged one search-checked event.

## `minPrice` (type: `integer`):

Keep listings at or above this price in yen (rentals: monthly rent). 0 or empty = no minimum. Listings whose price SUUMO does not give as a number are kept.

## `maxPrice` (type: `integer`):

Keep listings at or below this price in yen, e.g. 50000000 for 5,000万円 (rentals: monthly rent, e.g. 150000). 0 or empty = no maximum.

## `minAreaSqm` (type: `number`):

Floor area for condos, houses and rentals; land area for land. 0 or empty = no minimum.

## `maxAreaSqm` (type: `number`):

Floor area for condos, houses and rentals; land area for land. 0 or empty = no maximum.

## `maxWalkMinutes` (type: `integer`):

Keep listings whose nearest station (as SUUMO lists it first) is at most this many minutes on foot. 0 or empty = any.

## `minBuiltYear` (type: `integer`):

Keep buildings built in this year or later, e.g. 1981 for Japan's new earthquake standard. Rentals use SUUMO's age in years. 0 or empty = any.

## `layouts` (type: `array`):

Keep listings whose layout contains one of these, e.g. 1LDK, 2LDK, ワンルーム. Empty = any layout.

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

Keep listings whose name, headline, address, station or agency contains one of these words (Japanese or romaji as SUUMO writes it). Empty = no keyword filter.

## `monitoringMode` (type: `boolean`):

On: the first run remembers every listing and its price (free); every later run returns only listings that are new or cheaper since the last run, with changeType and previousPriceYen. Off: return the current listings.

## `resetMonitoringState` (type: `boolean`):

On: forget what monitoring remembered for this search, so the next monitoring run starts again from a free baseline. Off: keep the memory.

## Actor input object example

```json
{
  "propertyType": "used-condo",
  "prefecture": "tokyo",
  "city": "shinjuku",
  "maxListings": 20,
  "monitoringMode": false,
  "resetMonitoringState": false
}
```

# Actor output Schema

## `results` (type: `string`):

One row per SUUMO listing (rentals: one row per room): listing id and URL, property type in English and Japanese, name, price text as SUUMO shows it plus the price in yen as a number (ranges as min/max), address, nearest line, station and walk minutes, layout, floor and land area in m², year built, agency name. Monitoring rows add changeType (new or price-drop) and previousPriceYen. Searches with no results, unknown areas, filters that matched nothing and pages that could not be read come back as their own rows and are not charged.

# 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 = {
    "propertyType": "used-condo",
    "prefecture": "tokyo",
    "city": "shinjuku",
    "maxListings": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("neverempty/suumo-japan-real-estate-monitor").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 = {
    "propertyType": "used-condo",
    "prefecture": "tokyo",
    "city": "shinjuku",
    "maxListings": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("neverempty/suumo-japan-real-estate-monitor").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 '{
  "propertyType": "used-condo",
  "prefecture": "tokyo",
  "city": "shinjuku",
  "maxListings": 20
}' |
apify call neverempty/suumo-japan-real-estate-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,neverempty/suumo-japan-real-estate-monitor"
        }
    }
}
```

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/Ddoz6EkxrZYAA4aLY/builds/nSGRJbXOf9DWVKY2W/openapi.json
