# Tokyu Livable Scraper — Japan Property Data & API (`sian.agency/tokyu-livable-property-scraper`) Actor

Tokyu Livable (livable.co.jp) scraper & Japan real estate data API. For-sale apartments, houses & land: price (JPY), layout, area, floor, building age, fees, lat/lng, station access, photos — clean JSON/CSV, one row per listing. Fast overview or full detail. No account needed.

- **URL**: https://apify.com/sian.agency/tokyu-livable-property-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** Real estate, Automation, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 overview listing extracteds

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## Tokyu Livable Scraper — Japan Property Data & API 🏯

[![SIÁN Agency Store](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![SUUMO Property Scraper](https://img.shields.io/badge/Store-SUUMO%20Property%20Scraper-1AE392)](https://apify.com/sian.agency/suumo-property-scraper?fpr=sian) [![Immobiliare.it Scraper](https://img.shields.io/badge/Store-Immobiliare.it%20Scraper-1AE392)](https://apify.com/sian.agency/immobiliare-property-scraper?fpr=sian) [![Trip.com Scraper](https://img.shields.io/badge/Store-Trip.com%20Scraper-2577E3)](https://apify.com/sian.agency/trip-com-scraper?fpr=sian)

#### 🎉 Turn one of Japan's leading for-sale property portals into clean, structured data — every listing with price, layout, area, GPS, fees and photos
##### For real-estate investors, market analysts, relocation agents, and data teams working the Japanese property market

---

### 📋 Overview

**Need Japanese for-sale property listings as clean data instead of endless scrolling?** This scraper turns Tokyu Livable (livable.co.jp) results into structured JSON/CSV — for-sale apartments (中古・新築マンション), houses (戸建) and land (土地), one clean row per listing, exactly how you'd analyze them.

**Why analysts and agencies choose us:**
- ✅ **Clean per-listing rows**: price (JPY), layout, area, floor, building age, address — ready for a spreadsheet
- ⚡ **Fast & lightweight**: direct extraction from the page's embedded data, no slow headless browser, no proxy overhead
- 🎯 **40+ data points**: price normalised to integer JPY, price-per-m², fees, total units, land rights, builder/developer, structure, GPS coordinates, station access, full photo set
- 💴 **Pay-per-result**: only pay for listings you actually receive — transparent and cheap
- 💎 **Two depths**: fast *overview* for whole-market sweeps, full *detail* for the building spec table (fees, units, land rights, GPS, structure, equipment)
- ✨ **Three ways in**: by ward area, by pasted livable.co.jp search URL (keeps every filter), or by listing URL

---

### ✨ Features

- 🏢 **For-sale listings, done right** — apartments, houses and land, one clean row per property
- 💴 **Money normalised** — headline price as integer JPY, ready for math
- 📐 **Price-per-m² built in** — yield and comparison math ready out of the box
- 🌐 **GPS coordinates** — latitude/longitude on detail records for mapping
- 🚉 **Station access** — every line/walk-time string captured
- 🔎 **Detail enrichment** — management fees, total units, land rights, builder, developer, structure, balcony area, equipment, full photo set
- 🔗 **Paste-a-URL mode** — apply filters in the livable.co.jp UI, paste the link, every filter is preserved
- 📦 **Clean exports** — JSON, CSV, Excel straight from the dataset

---

### 🎬 Quick Start

Pick a mode, give it a ward area or a livable.co.jp search URL, and run. Listings stream into your dataset as clean rows. Export as JSON, CSV, or Excel.

```bash
curl -X POST https://api.apify.com/v2/acts/sian.agency~tokyu-livable-property-scraper/runs?token=YOUR_TOKEN \
-H 'Content-Type: application/json' \
-d '{"scrapeMode": "overview", "searchMode": "byArea", "propertyType": "chuko-mansion", "pref": "tokyo", "areaIds": ["a13103"]}'
````

***

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Choose your input

Enter a prefecture + ward area id (e.g. `tokyo` + `a13103` for Minato), paste a livable.co.jp search URL, or list specific listing URLs.

#### Step 2: Pick depth

`overview` for fast whole-market listing cards, or `detail` for the full building spec table.

#### Step 3: Run & export

Start the run and download your results as JSON, CSV, or Excel.

**That's it! In under a minute, you'll have:**

- A clean, per-listing dataset
- Prices normalised to JPY plus computed price-per-m²
- Layout, area, floor, building age, fees, GPS, station access, and photos

***

### 📥 Input Configuration

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| scrapeMode | string | No | `overview` (fast cards) or `detail` (full spec table) |
| searchMode | string | No | `byArea`, `bySearchUrl`, or `byListingUrl` |
| propertyType | string | No | `chuko-mansion`, `chuko-kodate`, `shinchiku-mansion`, `tochi`, etc. |
| pref | string | No | Prefecture slug, e.g. `tokyo` |
| areaIds | array | No | Ward area ids, e.g. `["a13103"]` (Minato) |
| searchUrls | array | No | Pasted livable.co.jp search URLs (filters preserved) |
| listingUrls | array | No | Listing URLs or property codes (detail mode) |
| sort | string | No | `newer`, `price_low_to_high`, `walk`, etc. |
| filters | array | No | Extra query filters as `key=value` |
| maxResults | integer | No | Max listings per run (FREE: 25, PAID: unlimited) |

**Example — overview by ward area:**

```json
{
  "scrapeMode": "overview",
  "searchMode": "byArea",
  "propertyType": "chuko-mansion",
  "pref": "tokyo",
  "areaIds": ["a13103"],
  "maxResults": 200
}
```

**Example — detail by listing URLs:**

```json
{
  "scrapeMode": "detail",
  "searchMode": "byListingUrl",
  "listingUrls": ["https://www.livable.co.jp/mansion/C13266W50/", "C13266W50"]
}
```

***

### 📤 Output

Results are saved to the Apify dataset with **40+ fields** per listing, including:

| Field | Type | Description |
|-------|------|-------------|
| listingId | string | Tokyu Livable property code |
| url | string | Canonical listing URL |
| price | number | Sale price in JPY |
| price\_per\_sqm\_jpy | number | Computed price per m² |
| layout | string | 間取り, e.g. `2LDK` |
| area\_sqm | number | 専有面積 in m² |
| balcony\_sqm | number | バルコニー面積 in m² |
| floor / facing | string | 所在階数 / 向き |
| built\_date / built\_year | string / number | 築年月 / parsed year |
| total\_units / structure | number / string | 総戸数 / 建物構造 |
| management\_fee / repair\_reserve | string | 管理費 / 修繕積立金 |
| developer / builder | string | 分譲会社 / 施工会社 |
| latitude / longitude | number | GPS coordinates (detail) |
| address | string | 所在地 |
| access | array | Station / walk-time lines |
| equipment | array | 設備・条件 amenities |
| images | array | Photo URLs |

**Example:**

```json
{
  "listingId": "C13266W50",
  "url": "https://www.livable.co.jp/mansion/C13266W50/",
  "propertyTitle": "アークヒルズ仙石山レジデンス",
  "property_type": "中古マンション",
  "price": 1100000000,
  "price_per_sqm_jpy": 8422664,
  "layout": "2LDK",
  "area_sqm": 130.6,
  "balcony_sqm": 21.66,
  "built_date": "2012年8月",
  "total_units": 243,
  "land_rights": "所有権",
  "developer": "森ビル株式会社",
  "latitude": 35.6627903,
  "longitude": 139.7412512,
  "address": "東京都港区六本木１丁目9-18",
  "image_count": 33
}
```

***

### 💼 Use Cases & Examples

#### 1. Property Investment Analysis

**Investors comparing yields across buildings.**
**Input:** a filtered livable.co.jp search URL · **Output:** price-per-m² on every listing · **Use:** rank candidate properties by value.

#### 2. Real-Estate Market Research

**Analysts mapping prices by ward.**
**Input:** prefecture + ward area ids · **Output:** per-listing dataset with price & m² · **Use:** build a price heatmap by ward and station.

#### 3. Relocation & Buyer Search

**Agents shortlisting homes for clients.**
**Input:** prefecture + layout/budget filters · **Output:** clean rows with fees, station walk-time, GPS · **Use:** hand clients a tidy comparison sheet.

#### 4. Real-Estate Lead Generation

**Agencies building prospect lists of active listings.**
**Input:** broad search by area · **Output:** building, address, layout, contact-ready records · **Use:** feed CRM pipelines.

#### 5. Price & Trend Monitoring

**Data teams tracking price movements over time.**
**Input:** scheduled runs on the same search · **Output:** snapshots to diff week-over-week · **Use:** detect price changes and new inventory.

#### 6. Academic & Policy Research

**Researchers studying Japanese housing markets.**
**Input:** multiple prefectures · **Output:** structured, reproducible datasets · **Use:** quantitative housing studies.

***

### 🔗 Integration Examples

#### JavaScript/Node.js

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('sian.agency/tokyu-livable-property-scraper').call({
  scrapeMode: 'overview', searchMode: 'byArea', propertyType: 'chuko-mansion', pref: 'tokyo', areaIds: ['a13103']
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')

run = client.actor('sian.agency/tokyu-livable-property-scraper').call(
    run_input={'scrapeMode': 'overview', 'searchMode': 'byArea', 'propertyType': 'chuko-mansion', 'pref': 'tokyo', 'areaIds': ['a13103']}
)

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item)
```

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~tokyu-livable-property-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"scrapeMode": "overview", "searchMode": "byArea", "propertyType": "chuko-mansion", "pref": "tokyo", "areaIds": ["a13103"]}'
```

#### Automation Workflows (N8N / Zapier / Make)

1. **Trigger**: Schedule or webhook
2. **HTTP Request**: Call the actor API
3. **Process**: Handle the JSON results
4. **Action**: Save to a sheet, notify, or sync to CRM

***

### 📊 Performance & Pricing

#### FREE Tier (Try It Now)

- **25 listings** per run — full feature access, same quality
- No credit card required
- Perfect for testing and small projects

#### PAID Tier (Production Ready)

- **Unlimited** listings per run
- Pay-per-result: only charged for listings you actually receive

💴 **Cheap by design** — direct extraction with no proxy overhead keeps the per-listing price among the lowest for Japanese real-estate data.

🔗 [View current pricing](https://apify.com/sian.agency/tokyu-livable-property-scraper?fpr=sian)

***

### ❓ Frequently Asked Questions

**Q: How many listings can I scrape?**
A: FREE tier: 25 per run. PAID tier: unlimited.

**Q: Which property types are supported?**
A: Used and new apartments (マンション), used and new houses (戸建), and land (土地) — plus an "everything" option.

**Q: Do I need an account or API key?**
A: No. Just provide a ward area or a search URL.

**Q: What output formats are available?**
A: JSON, CSV, and Excel — export directly from the Apify dataset.

**Q: Are GPS coordinates included?**
A: Yes — latitude and longitude are extracted on detail records, along with address and station access.

**Q: What's the difference between overview and detail?**
A: Overview is the fast listing-card data. Detail fetches each listing's full page for extra specs (fees, total units, land rights, builder, developer, GPS, structure, equipment) and merges them in.

***

### 🐛 Troubleshooting

**No results returned**

- Check the prefecture slug (e.g. `tokyo`) and ward area id (e.g. `a13103`), or that the pasted URL is a livable.co.jp ward results page.

**Fewer rows than expected**

- FREE tier caps at 25 listings per run — upgrade for unlimited.
- Narrow filters in the UI may simply return fewer listings.

**A specific listing failed in detail mode**

- The listing may have expired or been delisted; the run continues and skips it.

***

### ⚖️ Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the **GDPR** in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

> **Disclaimer:** This is an independent tool and is not affiliated with, endorsed by, or sponsored by Tokyu Livable, Inc. or its parent companies. "Tokyu Livable" and "東急リバブル" are trademarks of their respective owners. Use this actor in compliance with livable.co.jp's terms of service and all applicable laws.

***

### 🤝 Support

[![Telegram Support](https://img.shields.io/badge/Telegram-Support%20Group-0088cc?logo=telegram)](https://t.me/+vyh1sRE08sAxMGRi)

**Join our active support community**

- For issues or questions, open an issue in the actor's repository
- Check the [SIÁN Agency Store](https://apify.com/sian.agency?fpr=sian) for more automation tools
- 📧 <apify@sian-agency.online>

***

**Built by [SIÁN Agency](https://www.sian-agency.online)** | **[More Tools](https://apify.com/sian.agency?fpr=sian)**

# Actor input Schema

## `scrapeMode` (type: `string`):

🧭 **OVERVIEW** (cheap, primary): listing cards from the ward results — one row per property with price, layout, area, floor, building age, address, station access & photos.

🔎 **DETAIL** (enrich): fetches each listing's full page for the spec table — fees, total units, land rights, builder/developer, balcony area, GPS coordinates, structure, transaction type, full image set, equipment. Detail merges overview + detail into one record.

## `searchMode` (type: `string`):

🔀 How listings are discovered.

- **byArea** — give a prefecture slug (e.g. `tokyo`) + one or more ward area ids (e.g. `a13103` for Minato).
- **bySearchUrl** — paste a ready-made livable.co.jp ward results URL with your filters applied in the UI (most reliable).
- **byListingUrl** — fetch specific listings directly (DETAIL only).

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

🏘️ Which Tokyu Livable for-sale vertical to scrape (the `/kounyu/<type>/` segment).

## `pref` (type: `string`):

🗾 **BY AREA:** Prefecture slug, e.g. `tokyo`, `kanagawa`, `osaka`, `aichi`, `fukuoka`. Used with `areaIds`.

## `areaIds` (type: `array`):

📍 **BY AREA:** Tokyu Livable ward area ids to scrape (e.g. `a13103` = Minato, `a13113` = Shibuya). Find them in the URL on a livable.co.jp ward results page.

💡 **TIP:** For precise filtering, use **bySearchUrl** instead — apply your filters in the livable.co.jp UI and paste the URL.

## `searchUrls` (type: `array`):

🔗 **BY SEARCH URL:** Paste one or more livable.co.jp ward results URLs (the `/kounyu/<type>/<pref>/<areaId>/` pages). Apply all your filters in the UI first, then copy the address — every filter and sort is preserved.

## `listingUrls` (type: `array`):

🏠 **BY LISTING URL (DETAIL ONLY):** Paste livable.co.jp detail URLs (e.g. `https://www.livable.co.jp/mansion/C13266W50/`) or bare property codes (e.g. `C13266W50`). Used with scrapeMode = detail.

## `sort` (type: `string`):

↕️ Result sort order (applied to byArea searches).

## `filters` (type: `array`):

🎛️ **OPTIONAL:** Extra livable.co.jp query filters as `key=value`, applied to byArea searches. Examples: `priceTo=8000` (max price 万円), `areaFrom=50` (min m²), `ageTo=10` (max building age), `walkTo=10` (max walk minutes), `facing=south`.

## `maxResults` (type: `integer`):

🔢 Maximum listings to return per run. **FREE users:** capped at 25 · **PAID users:** unlimited.

## `useProxy` (type: `boolean`):

🌐 Route requests through a Japan residential proxy. **Off by default** — livable.co.jp is reachable without a proxy, so leaving this off keeps runs fast and cheap. Enable only if you hit a geo-block.

## Actor input object example

```json
{
  "scrapeMode": "overview",
  "searchMode": "byArea",
  "propertyType": "chuko-mansion",
  "pref": "tokyo",
  "areaIds": [
    "a13103"
  ],
  "sort": "newer",
  "maxResults": 100,
  "useProxy": false
}
```

# Actor output Schema

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

All scraped Tokyu Livable listings as a clean JSON/CSV dataset.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/tokyu-livable-property-scraper").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/tokyu-livable-property-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call sian.agency/tokyu-livable-property-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=sian.agency/tokyu-livable-property-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Tokyu Livable Scraper — Japan Property Data & API",
        "description": "Tokyu Livable (livable.co.jp) scraper & Japan real estate data API. For-sale apartments, houses & land: price (JPY), layout, area, floor, building age, fees, lat/lng, station access, photos — clean JSON/CSV, one row per listing. Fast overview or full detail. No account needed.",
        "version": "1.0",
        "x-build-id": "aGwabagJ1fFbpp1Va"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/sian.agency~tokyu-livable-property-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-sian.agency-tokyu-livable-property-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/sian.agency~tokyu-livable-property-scraper/runs": {
            "post": {
                "operationId": "runs-sync-sian.agency-tokyu-livable-property-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/sian.agency~tokyu-livable-property-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-sian.agency-tokyu-livable-property-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "scrapeMode": {
                        "title": "🧭 Scrape mode",
                        "enum": [
                            "overview",
                            "detail"
                        ],
                        "type": "string",
                        "description": "🧭 **OVERVIEW** (cheap, primary): listing cards from the ward results — one row per property with price, layout, area, floor, building age, address, station access & photos.\n\n🔎 **DETAIL** (enrich): fetches each listing's full page for the spec table — fees, total units, land rights, builder/developer, balcony area, GPS coordinates, structure, transaction type, full image set, equipment. Detail merges overview + detail into one record.",
                        "default": "overview"
                    },
                    "searchMode": {
                        "title": "🔀 Search mode",
                        "enum": [
                            "byArea",
                            "bySearchUrl",
                            "byListingUrl"
                        ],
                        "type": "string",
                        "description": "🔀 How listings are discovered.\n\n- **byArea** — give a prefecture slug (e.g. `tokyo`) + one or more ward area ids (e.g. `a13103` for Minato).\n- **bySearchUrl** — paste a ready-made livable.co.jp ward results URL with your filters applied in the UI (most reliable).\n- **byListingUrl** — fetch specific listings directly (DETAIL only).",
                        "default": "byArea"
                    },
                    "propertyType": {
                        "title": "🏘️ Property type",
                        "enum": [
                            "chuko-mansion",
                            "chuko-kodate",
                            "shinchiku-mansion",
                            "shinchiku-kodate",
                            "mansion",
                            "kodate",
                            "tochi",
                            "bukken-all"
                        ],
                        "type": "string",
                        "description": "🏘️ Which Tokyu Livable for-sale vertical to scrape (the `/kounyu/<type>/` segment).",
                        "default": "chuko-mansion"
                    },
                    "pref": {
                        "title": "🗾 Prefecture",
                        "type": "string",
                        "description": "🗾 **BY AREA:** Prefecture slug, e.g. `tokyo`, `kanagawa`, `osaka`, `aichi`, `fukuoka`. Used with `areaIds`.",
                        "default": "tokyo"
                    },
                    "areaIds": {
                        "title": "📍 Ward area ids",
                        "type": "array",
                        "description": "📍 **BY AREA:** Tokyu Livable ward area ids to scrape (e.g. `a13103` = Minato, `a13113` = Shibuya). Find them in the URL on a livable.co.jp ward results page.\n\n💡 **TIP:** For precise filtering, use **bySearchUrl** instead — apply your filters in the livable.co.jp UI and paste the URL.",
                        "default": [
                            "a13103"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "searchUrls": {
                        "title": "🔗 Search URLs",
                        "type": "array",
                        "description": "🔗 **BY SEARCH URL:** Paste one or more livable.co.jp ward results URLs (the `/kounyu/<type>/<pref>/<areaId>/` pages). Apply all your filters in the UI first, then copy the address — every filter and sort is preserved.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "listingUrls": {
                        "title": "🏠 Listing URLs",
                        "type": "array",
                        "description": "🏠 **BY LISTING URL (DETAIL ONLY):** Paste livable.co.jp detail URLs (e.g. `https://www.livable.co.jp/mansion/C13266W50/`) or bare property codes (e.g. `C13266W50`). Used with scrapeMode = detail.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "sort": {
                        "title": "↕️ Sort order",
                        "enum": [
                            "newer",
                            "address",
                            "route",
                            "walk",
                            "price_low_to_high"
                        ],
                        "type": "string",
                        "description": "↕️ Result sort order (applied to byArea searches).",
                        "default": "newer"
                    },
                    "filters": {
                        "title": "🎛️ Extra filters",
                        "type": "array",
                        "description": "🎛️ **OPTIONAL:** Extra livable.co.jp query filters as `key=value`, applied to byArea searches. Examples: `priceTo=8000` (max price 万円), `areaFrom=50` (min m²), `ageTo=10` (max building age), `walkTo=10` (max walk minutes), `facing=south`.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxResults": {
                        "title": "🔢 Max results",
                        "minimum": 1,
                        "type": "integer",
                        "description": "🔢 Maximum listings to return per run. **FREE users:** capped at 25 · **PAID users:** unlimited.",
                        "default": 100
                    },
                    "useProxy": {
                        "title": "🌐 Use Japan residential proxy",
                        "type": "boolean",
                        "description": "🌐 Route requests through a Japan residential proxy. **Off by default** — livable.co.jp is reachable without a proxy, so leaving this off keeps runs fast and cheap. Enable only if you hit a geo-block.",
                        "default": false
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
