# LIFULL HOME'S Scraper — Japan Property Data & API (`sian.agency/lifull-homes-property-scraper`) Actor

LIFULL HOME'S scraper & real estate data API for homes.co.jp, a top Japan property portal. Rent & sale: rent, layout, area, floor, deposit, key money, building age, station access, equipment, photos — clean JSON/CSV, one row per room. Fast overview or full detail. No account needed.

- **URL**: https://apify.com/sian.agency/lifull-homes-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

## LIFULL HOME'S 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 Scraper](https://img.shields.io/badge/Store-SUUMO%20Scraper-1AE392)](https://apify.com/sian.agency/suumo-property-scraper?fpr=sian) [![Immobiliare Scraper](https://img.shields.io/badge/Store-Immobiliare%20Scraper-E60023)](https://apify.com/sian.agency/immobiliare-property-scraper?fpr=sian) [![Zillow Scraper](https://img.shields.io/badge/Store-Zillow%20Scraper-1F4E79)](https://apify.com/sian.agency/zillow-property-scraper?fpr=sian)

#### 🎉 Turn Japan's rental market into a clean spreadsheet — one row per room, photos, rent, layout, area & station access in seconds
##### Built for real-estate analysts, relocation services, proptech teams & investors who need fresh Japanese property data on tap

---

### 📋 Overview

**Researching the Japanese rental market by hand is slow** — homes.co.jp lists every building, and each building hides several rentable rooms behind a table. This scraper does the unfolding for you: it turns any prefecture, search, or listing into a clean, structured dataset with **one row per room** — rent, layout, area, floor, deposit, key money, building age, station access and photos, ready for Excel, Google Sheets, or your database.

**Why teams choose this scraper:**
- ✅ **One row per room**: buildings are exploded into individual rentable units — no manual unfolding
- ⚡ **Fast & lightweight**: pulls room-level cards straight from search pages, no slow browser farm
- 🎯 **Clean, normalized data**: rent in integer JPY, area in m², dual rent-per-m² already computed
- 💰 **Pay-per-result**: only pay for listings you actually receive — generous free tier to test
- 💎 **Two depths**: a cheap fast Overview, or a rich Detail pass with structure, orientation, equipment, contract terms & the full image set
- ✨ **No account, no API key**: paste a prefecture or a search URL and run

---

### ✨ Features

- 🏢 **Per-room extraction**: every building's room table is expanded into separate, comparable rows
- 🧭 **Two scrape modes**: Overview (cheap, high-volume) and Detail (full spec table)
- 🔀 **Three ways to search**: by prefecture slug, by pasted search URL (keeps all your filters), or by direct listing URL
- 🗺️ **Rich attributes**: layout (間取り), area, floor, deposit, key money, building age, equipment, orientation
- 🚉 **Station access**: line, station name and walking minutes
- 📐 **Computed rent-per-m²**: instant value comparison across listings
- 📷 **Full photo sets**: deduped image URLs, thumbnail-first
- 💴 **JPY normalization**: 万円 strings parsed to clean integer yen
- 📤 **Export anywhere**: JSON, CSV, Excel straight from the dataset

---

### 🎬 Quick Start

Pick a prefecture (or paste a search URL), choose Overview or Detail, and run. Results stream into a clean dataset you can export in one click.

```bash
curl -X POST "https://api.apify.com/v2/acts/sian.agency~lifull-homes-property-scraper/runs?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"scrapeMode":"overview","searchMode":"byPlace","places":["tokyo"],"maxResults":50}'
````

***

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Choose what to scrape

Enter a prefecture slug (e.g. `tokyo`, `osaka`, `kanagawa`) — or paste a homes.co.jp search URL with your filters applied.

#### Step 2: Pick a depth

**Overview** for fast, cheap room-level cards. **Detail** to enrich each listing with structure, equipment, contract terms and the full image set.

#### Step 3: Run & export

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

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

- A clean table with one row per rentable room
- Rent, layout, area, floor, deposit, building age & station access
- Photos and a computed rent-per-m² for instant comparison

***

### 📥 Input Configuration

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| scrapeMode | string | No | `overview` (fast cards) or `detail` (full spec). Default `overview`. |
| searchMode | string | No | `byPlace`, `bySearchUrl`, or `byListingUrl` (detail only). |
| vertical | string | No | `rent` (賃貸, full coverage) or `mansion` (used mansion). Default `rent`. |
| places | array | No | Prefecture/region slugs, e.g. `["tokyo","osaka"]`. |
| searchUrls | array | No | homes.co.jp search-results URLs (keeps your filters). |
| listingUrls | array | No | Listing URLs or 40-char room hashes (detail mode). |
| sort | string | No | Result ordering (cheapest, newest, largest, …). |
| filters | array | No | Extra `key=value` query filters (price, area, walk minutes). |
| maxResults | integer | No | Listings per run. FREE: 25 · PAID: unlimited. |

**Example — overview by prefecture:**

```json
{
  "scrapeMode": "overview",
  "searchMode": "byPlace",
  "places": ["tokyo"],
  "sort": "fee",
  "maxResults": 100
}
```

**Example — detail by listing URL:**

```json
{
  "scrapeMode": "detail",
  "searchMode": "byListingUrl",
  "listingUrls": ["https://www.homes.co.jp/chintai/room/086345eeb9fb0097804f58b7092da0ce3d50346c/"]
}
```

***

### 📤 Output

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

| Field | Type | Description |
|-------|------|-------------|
| listingId | string | Room hash or building id |
| propertyTitle | string | Building name |
| rent | number | Rent normalized to integer JPY |
| price\_per\_sqm\_jpy | number | Computed rent per m² |
| layout | string | 間取り (ワンルーム / 1K / 2LDK …) |
| area\_sqm | number | 専有面積 in m² |
| floor / floors\_total | string | Room floor & building floors |
| deposit / key\_money | string | 敷金 / 礼金 |
| build\_age / build\_date | string | Building age & exact build month |
| structure | string | 建物構造 (detail) |
| equipment | array | 設備・条件 features (detail) |
| address / access | string | 所在地 & station access |
| images | array | All photo URLs |

**Example:**

```json
{
  "listingId": "086345eeb9fb0097804f58b7092da0ce3d50346c",
  "propertyTitle": "プレシャス方南町",
  "bukken_type": "賃貸マンション",
  "rent": 83000,
  "rent_man": "8.3",
  "price_per_sqm_jpy": 5210,
  "admin_fee": 3000,
  "deposit": "無",
  "key_money": "無",
  "layout": "ワンルーム",
  "area_sqm": 15.93,
  "floor": "3階",
  "floors_total": "3階建",
  "build_age": "1年",
  "address": "東京都杉並区堀ノ内2丁目13-13",
  "access": "東京メトロ丸ノ内線 方南町駅 徒歩8分",
  "url": "https://www.homes.co.jp/chintai/room/086345eeb9fb0097804f58b7092da0ce3d50346c/"
}
```

***

### 💼 Use Cases & Examples

#### 1. Rental market research

**Analysts tracking rent levels across Tokyo wards.**
**Input:** prefecture `tokyo`, sort by cheapest. **Output:** per-room rents with area & layout. **Use:** build rent-per-m² benchmarks by neighborhood.

#### 2. Relocation & corporate housing

**Relocation services shortlisting units near a station.**
**Input:** a filtered search URL (walk minutes, budget). **Output:** ranked rooms with access times. **Use:** present clients a clean comparison sheet.

#### 3. Proptech & data products

**Teams powering a rental search app.**
**Input:** multiple prefectures on a schedule. **Output:** fresh structured listings. **Use:** keep your own database current automatically.

#### 4. Investment & yield analysis

**Investors comparing rental yields.**
**Input:** target areas + detail mode. **Output:** rent, area, structure, building age. **Use:** estimate gross yields and spot mispriced units.

#### 5. Competitive & agency intelligence

**Agencies monitoring new listings.**
**Input:** sort by newly-listed. **Output:** the latest rooms on market. **Use:** react fast to fresh inventory.

***

### 🔗 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/lifull-homes-property-scraper').call({
  scrapeMode: 'overview',
  searchMode: 'byPlace',
  places: ['tokyo'],
  maxResults: 50,
});

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/lifull-homes-property-scraper').call(
    run_input={'scrapeMode': 'overview', 'searchMode': 'byPlace', 'places': ['osaka'], 'maxResults': 50}
)

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

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~lifull-homes-property-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"scrapeMode":"overview","searchMode":"byPlace","places":["tokyo"]}'
```

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

1. **Trigger**: Schedule (e.g. daily) or webhook
2. **HTTP Request**: Call the actor API
3. **Process**: Handle the JSON dataset
4. **Action**: Save to a sheet/database or send a notification

***

### 📊 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
- Faster runs, no caps
- Pay-per-result: you're only charged for listings you actually receive

💰 **Transparent pay-per-result pricing** — the cheap Overview event powers high-volume jobs, Detail adds the full spec table only when you need it.

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

***

### ❓ Frequently Asked Questions

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

**Q: What's the difference between Overview and Detail?**
A: Overview is the fast, cheap room-level card (rent, layout, area, floor, address). Detail fetches each listing's full page to add structure, orientation, balcony, equipment, contract terms, agency and the full image set.

**Q: Can I keep my homes.co.jp filters?**
A: Yes — apply filters in the homes.co.jp UI, copy the search URL, and use `searchMode: bySearchUrl`. Every `cond[...]` filter is preserved.

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

**Q: Is the rent normalized?**
A: Yes — Japanese 万円 strings are parsed to clean integer JPY, and rent-per-m² is computed for you.

**Q: Is this legal?**
A: We only extract publicly available data. See the legal note below.

***

### 🐛 Troubleshooting

**No results returned**

- Check the prefecture slug spelling (e.g. `tokyo`, not `Tokyo-to`)
- If using a search URL, make sure it's a `/list/` results page, not a single listing

**Fewer rows than expected**

- FREE tier caps each run at 25 listings — upgrade for unlimited
- Narrow filters (price/area/walk minutes) reduce the result pool

**Detail run is slow**

- Detail fetches one page per listing; lower `maxResults` or use Overview for high volume

***

### ⚖️ 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/).

> **Trademark notice:** LIFULL HOME'S and homes.co.jp are trademarks of LIFULL Co., Ltd. This actor is an independent tool and is **not affiliated with, endorsed by, or sponsored by** LIFULL Co., Ltd. All product names, logos, and brands are property of their respective owners and are used for identification purposes only.

***

### 🤝 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 [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): room-level cards from the search results — one row per rentable unit, with rent, layout, area, floor, deposit, key money, building age, address & station access.

🔎 **DETAIL** (enrich): fetches each listing's full page for the complete spec table — structure, exact build month, orientation, balcony, parking, equipment list, contract terms, agency & the full image set. Detail merges overview + detail into one record.

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

🔀 How listings are discovered.

- **byPlace** — give one or more prefecture/region slugs (e.g. `tokyo`, `osaka`, `kanagawa`) + a vertical.
- **bySearchUrl** — paste a ready-made homes.co.jp search URL with your filters applied in the UI (most reliable).
- **byListingUrl** — fetch specific listings directly (DETAIL only).

## `vertical` (type: `string`):

🏘️ Which LIFULL HOME'S vertical to scrape.

- **rent** (賃貸) — fully supported; explodes each building into one row per room.
- **mansion** (中古マンション, used mansion) — sale vertical (partial coverage; use `rent` for the richest data).

## `places` (type: `array`):

📍 **BY PREFECTURE:** homes.co.jp prefecture/region slugs to scrape. Common slugs: `tokyo` (東京), `osaka` (大阪), `kanagawa` (神奈川), `aichi` (愛知), `fukuoka` (福岡), `hokkaido` (北海道).

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

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

🔗 **BY SEARCH URL:** Paste one or more homes.co.jp search-results URLs (the `/chintai/{pref}/list/` or `/mansion/chuko/{pref}/list/` pages). Apply all your filters in the homes.co.jp UI first, then copy the address — every `cond[...]` filter is preserved.

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

🏠 **BY LISTING URL (DETAIL ONLY):** Paste homes.co.jp detail URLs (e.g. `https://www.homes.co.jp/chintai/room/086345…/`) or bare 40-character room hashes. Used with scrapeMode = detail.

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

↕️ **OPTIONAL:** Result ordering (homes.co.jp `cond[sortby]`), applied to byPlace searches.

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

🎛️ **OPTIONAL:** Extra homes.co.jp query filters as `key=value`, applied to byPlace searches. Examples: `cond[priceLow]=70000` (min rent JPY), `cond[priceHigh]=120000` (max rent), `cond[houseAreaLow]=20` (min m²), `cond[walkMinutes]=10` (max walk to station).

## `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** — homes.co.jp is reachable without a proxy, so leaving this off keeps runs fast and cheap. Enable only if you hit a rate- or geo-block.

## Actor input object example

```json
{
  "scrapeMode": "overview",
  "searchMode": "byPlace",
  "vertical": "rent",
  "places": [
    "tokyo"
  ],
  "maxResults": 100,
  "useProxy": false
}
```

# Actor output Schema

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

All scraped LIFULL HOME'S 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/lifull-homes-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/lifull-homes-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/lifull-homes-property-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "LIFULL HOME'S Scraper — Japan Property Data & API",
        "description": "LIFULL HOME'S scraper & real estate data API for homes.co.jp, a top Japan property portal. Rent & sale: rent, layout, area, floor, deposit, key money, building age, station access, equipment, photos — clean JSON/CSV, one row per room. Fast overview or full detail. No account needed.",
        "version": "1.0",
        "x-build-id": "sp8yYoCQLpafAUI55"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/sian.agency~lifull-homes-property-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-sian.agency-lifull-homes-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~lifull-homes-property-scraper/runs": {
            "post": {
                "operationId": "runs-sync-sian.agency-lifull-homes-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~lifull-homes-property-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-sian.agency-lifull-homes-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): room-level cards from the search results — one row per rentable unit, with rent, layout, area, floor, deposit, key money, building age, address & station access.\n\n🔎 **DETAIL** (enrich): fetches each listing's full page for the complete spec table — structure, exact build month, orientation, balcony, parking, equipment list, contract terms, agency & the full image set. Detail merges overview + detail into one record.",
                        "default": "overview"
                    },
                    "searchMode": {
                        "title": "🔀 Search mode",
                        "enum": [
                            "byPlace",
                            "bySearchUrl",
                            "byListingUrl"
                        ],
                        "type": "string",
                        "description": "🔀 How listings are discovered.\n\n- **byPlace** — give one or more prefecture/region slugs (e.g. `tokyo`, `osaka`, `kanagawa`) + a vertical.\n- **bySearchUrl** — paste a ready-made homes.co.jp search URL with your filters applied in the UI (most reliable).\n- **byListingUrl** — fetch specific listings directly (DETAIL only).",
                        "default": "byPlace"
                    },
                    "vertical": {
                        "title": "🏘️ Vertical",
                        "enum": [
                            "rent",
                            "mansion"
                        ],
                        "type": "string",
                        "description": "🏘️ Which LIFULL HOME'S vertical to scrape.\n\n- **rent** (賃貸) — fully supported; explodes each building into one row per room.\n- **mansion** (中古マンション, used mansion) — sale vertical (partial coverage; use `rent` for the richest data).",
                        "default": "rent"
                    },
                    "places": {
                        "title": "📍 Prefecture / region slugs",
                        "type": "array",
                        "description": "📍 **BY PREFECTURE:** homes.co.jp prefecture/region slugs to scrape. Common slugs: `tokyo` (東京), `osaka` (大阪), `kanagawa` (神奈川), `aichi` (愛知), `fukuoka` (福岡), `hokkaido` (北海道).\n\n💡 **TIP:** For precise filtering, use **bySearchUrl** instead — apply your filters in the homes.co.jp UI and paste the URL.",
                        "default": [
                            "tokyo"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "searchUrls": {
                        "title": "🔗 Search URLs",
                        "type": "array",
                        "description": "🔗 **BY SEARCH URL:** Paste one or more homes.co.jp search-results URLs (the `/chintai/{pref}/list/` or `/mansion/chuko/{pref}/list/` pages). Apply all your filters in the homes.co.jp UI first, then copy the address — every `cond[...]` filter is preserved.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "listingUrls": {
                        "title": "🏠 Listing URLs",
                        "type": "array",
                        "description": "🏠 **BY LISTING URL (DETAIL ONLY):** Paste homes.co.jp detail URLs (e.g. `https://www.homes.co.jp/chintai/room/086345…/`) or bare 40-character room hashes. Used with scrapeMode = detail.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "sort": {
                        "title": "↕️ Sort",
                        "enum": [
                            "recommend",
                            "fee",
                            "-fee",
                            "area_house",
                            "period",
                            "newdate",
                            "addr"
                        ],
                        "type": "string",
                        "description": "↕️ **OPTIONAL:** Result ordering (homes.co.jp `cond[sortby]`), applied to byPlace searches."
                    },
                    "filters": {
                        "title": "🎛️ Extra filters",
                        "type": "array",
                        "description": "🎛️ **OPTIONAL:** Extra homes.co.jp query filters as `key=value`, applied to byPlace searches. Examples: `cond[priceLow]=70000` (min rent JPY), `cond[priceHigh]=120000` (max rent), `cond[houseAreaLow]=20` (min m²), `cond[walkMinutes]=10` (max walk to station).",
                        "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** — homes.co.jp is reachable without a proxy, so leaving this off keeps runs fast and cheap. Enable only if you hit a rate- or 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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
