# able Property Scraper — Japan Rental Data & API (`sian.agency/able-property-scraper`) Actor

able (エイブル) rental scraper & real estate data API for able.co.jp. Apartment & house rent listings: rent, layout, area, floor, deposit, key money, brokerage fee, building age & structure, station access, photos — clean JSON/CSV, one row per unit. Fast overview or full detail. No account needed.

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

## able Property Scraper — Japan Rental 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) [![goo Housing Scraper](https://img.shields.io/badge/Store-goo%20Housing%20Scraper-1AE392)](https://apify.com/sian.agency/goo-housing-property-scraper?fpr=sian) [![Trip.com Scraper](https://img.shields.io/badge/Store-Trip.com%20Scraper-93D500)](https://apify.com/sian.agency/trip-com-scraper?fpr=sian)

#### 🎉 Turn able.co.jp (エイブル) rental listings into clean, structured data — one row per unit, ready for analysis
##### For real-estate analysts, investors, relocation agents, and data teams working the Japanese rental market

---

### 📋 Overview

**Need Japanese rental listings as clean data instead of endless scrolling?** This scraper turns able.co.jp search results into structured JSON/CSV — one clean record per listing, with rent normalised to JPY, layout, area, deposit, key money, brokerage fee, station access and photos.

**Why analysts and agencies choose us:**
- ✅ **One clean row per unit** — every result card becomes a structured record, no nested mess
- ⚡ **Fast & lightweight** — direct extraction, no slow headless browser, no proxy overhead
- 🎯 **40+ data points** — rent (normalised to JPY), 万円 raw text, layout, area, floor, deposit, key money, brokerage fee, building age & structure, station access, photos
- 🤝 **Brokerage fee captured** — surfaces each unit's 仲介手数料 (a headline able selling point), so tenants and analysts can compare true move-in cost
- 💴 **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 spec table (orientation, building type, latitude/longitude, equipment, security, room features, full photo gallery)
- ✨ **Three ways in** — by pasted able search URL (keeps every filter), by area (prefecture + city codes), or by listing URL

---

### ✨ Features

- 🏢 **Listings, done right** — clean per-unit records from the area list
- 💴 **Money normalised** — `21.2万円` becomes `212000` JPY *and* keeps the original string
- 📐 **Rent-per-m² built in** — yield and comparison math ready out of the box
- 🚉 **Station access** — every line + station + walk-minute captured
- 🤝 **Brokerage fee** — the per-unit 仲介手数料 fragment, ideal for true move-in-cost comparison
- 🔎 **Detail enrichment** — orientation, building type, structure, latitude/longitude, equipment, security, room features, full photo set
- 🔗 **Paste-a-URL mode** — apply filters in able's UI, paste the link, every supported filter is preserved
- 📦 **Clean exports** — JSON, CSV, Excel straight from the dataset
- 🌐 **Optional Japan proxy** — off by default, available as a one-click escape hatch

---

### 🎬 Quick Start

Pick a mode, give it an able search URL (or an area), 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~able-property-scraper/runs?token=YOUR_TOKEN \
-H 'Content-Type: application/json' \
-d '{"scrapeMode": "overview", "searchMode": "bySearchUrl", "searchUrls": ["https://www.able.co.jp/tokyo/area/13104/list/"]}'
````

***

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Choose your input

Paste an able area-list URL, give a prefecture + city codes, or list specific listing URLs.

#### Step 2: Pick depth

`overview` for fast whole-market unit cards, or `detail` for the full 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-unit dataset
- Rent normalised to JPY plus the raw 万円 strings
- Layout, area, floor, deposit, brokerage fee, station access, and photos

***

### 📥 Input Configuration

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| scrapeMode | string | No | `overview` (fast unit cards) or `detail` (full spec table) |
| searchMode | string | No | `bySearchUrl`, `byArea`, or `byListingUrl` |
| searchUrls | array | No | Pasted able area-list URLs (filters preserved) |
| pref | string | No | Prefecture slug, e.g. `tokyo` (byArea) |
| cityCodes | array | No | JIS municipal codes, e.g. `["13104"]` (byArea) |
| listingUrls | array | No | able detail URLs (detail mode) |
| order | string | No | able's sort/order parameter |
| rentMin / rentMax | string | No | Rent range filters |
| areaMin / areaMax | string | No | Floor-area range filters (m²) |
| buildingType | array | No | `1` mansion, `2` apartment, `3` house (repeatable) |
| maxResults | integer | No | Max listings per run (FREE: 25, PAID: unlimited) |

**Example — overview by search URL:**

```json
{
  "scrapeMode": "overview",
  "searchMode": "bySearchUrl",
  "searchUrls": ["https://www.able.co.jp/tokyo/area/13104/list/"],
  "maxResults": 200
}
```

**Example — detail by area:**

```json
{
  "scrapeMode": "detail",
  "searchMode": "byArea",
  "pref": "tokyo",
  "cityCodes": ["13104"]
}
```

***

### 📤 Output

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

| Field | Type | Description |
|-------|------|-------------|
| listingId | string | able property id |
| url | string | Canonical listing URL |
| propertyTitle | string | Building name |
| rent | number | Monthly rent in JPY |
| rent\_raw | string | Raw `21.2万円` string |
| price\_per\_sqm\_jpy | number | Computed rent per m² |
| layout | string | 間取り, e.g. `1K`, `1LDK` |
| area\_sqm | number | 専有面積 in m² |
| floor / total\_floors | string | Unit floor / building floors |
| deposit / key\_money / broker\_fee | string | 敷金 / 礼金 / 仲介手数料 |
| building\_age / building\_year / structure | string/number | Age / built year / structure |
| stations | array | Line + station + walk-time |
| address | string | 所在地 |
| images | array | Photo URLs |
| facing / building\_type / equipment / security | string/array | Detail-mode spec fields |

**Example:**

```json
{
  "listingId": "000000051506936046",
  "url": "https://www.able.co.jp/detail/Detail.do?bk=000000051506936046&prefkey=tokyo&g=13104",
  "propertyTitle": "ＺＯＯＭ東新宿",
  "rent": 212000,
  "rent_raw": "21.2万円",
  "price_per_sqm_jpy": 5209,
  "layout": "1LDK",
  "area_sqm": 40.7,
  "floor": "3階",
  "total_floors": "13階建",
  "facing": "東",
  "building_type": "マンション",
  "structure": "鉄筋コンクリート造",
  "broker_fee": "仲介手数料家賃の55%",
  "address": "東京都新宿区大久保１丁目",
  "stations": ["副都心線 / 東新宿駅 徒歩1分"],
  "image_count": 19
}
```

***

### 💼 Use Cases & Examples

#### 1. Rental Market Research

**Analysts mapping rent-by-area across a prefecture.**
**Input:** an able area-list URL · **Output:** per-unit dataset with rent & m² · **Use:** build a rent heatmap by ward and station.

#### 2. Property Investment Analysis

**Investors comparing yields across buildings.**
**Input:** a filtered able search URL · **Output:** rent-per-m² on every unit · **Use:** rank candidate buildings by gross yield.

#### 3. Relocation & Tenant Search

**Relocation agents shortlisting homes for clients.**
**Input:** area + layout/budget filters · **Output:** clean rows with deposit, key money, brokerage fee, station walk-time · **Use:** hand clients a tidy true-cost comparison sheet.

#### 4. Real-Estate Lead Generation

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

#### 5. Price & Trend Monitoring

**Data teams tracking rent 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 areas · **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/able-property-scraper').call({
  scrapeMode: 'overview', searchMode: 'bySearchUrl',
  searchUrls: ['https://www.able.co.jp/tokyo/area/13104/list/']
});

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/able-property-scraper').call(
    run_input={'scrapeMode': 'overview', 'searchMode': 'bySearchUrl',
               'searchUrls': ['https://www.able.co.jp/tokyo/area/13104/list/']}
)

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

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~able-property-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"scrapeMode": "overview", "searchMode": "bySearchUrl", "searchUrls": ["https://www.able.co.jp/tokyo/area/13104/list/"]}'
```

#### 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/able-property-scraper?fpr=sian)

***

### ❓ Frequently Asked Questions

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

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

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

**Q: Are GPS coordinates included?**
A: Detail pages include latitude/longitude where available; overview rows carry address and station access.

**Q: What's the difference between overview and detail?**
A: Overview is the fast result-card data. Detail fetches each listing's full page for extra specs (orientation, building type, latitude/longitude, equipment, security, room features, full photo gallery) and merges them in.

**Q: Is the brokerage fee included?**
A: Yes — detail mode surfaces each unit's 仲介手数料 (brokerage fee) fragment, useful for comparing true move-in cost.

***

### 🐛 Troubleshooting

**No results returned**

- Check that the pasted URL is an able.co.jp area-list page (`/{prefecture}/area/{citycode}/list/`), or that prefecture/city codes are valid.

**Fewer rows than expected**

- FREE tier caps at 25 listings per run — upgrade for unlimited.
- Narrow filters in the able 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 able, able.co.jp, or エイブル / its parent group. "able" / "エイブル" is a trademark of its respective owner. Use this actor in compliance with the site'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): unit-level cards from the area list — one row per listing, with rent, layout, area, floor, deposit, key money, building age, structure, station access & photos.

🔎 **DETAIL** (enrich): fetches each listing's full page for the spec table — full fee breakdown, brokerage fee, orientation, building type, latitude/longitude, equipment, security, room features, hi-res photo gallery. Detail merges overview + detail into one record.

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

🔀 How listings are discovered.

- **bySearchUrl** — paste a ready-made able area-list URL with your filters applied in the UI (most reliable).
- **byArea** — give a prefecture slug and one or more JIS municipal codes.
- **byListingUrl** — fetch specific listings directly (DETAIL only).

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

🔗 **BY SEARCH URL:** Paste one or more able area-list URLs (the `/{prefecture}/area/{citycode}/list/` pages). Apply all your filters in the able UI first, then copy the address — every supported filter is preserved.

💡 **TIP:** Example — `https://www.able.co.jp/tokyo/area/13104/list/`

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

🏯 **BY AREA:** Prefecture slug used in able URLs. Examples: `tokyo`, `osaka`, `kanagawa`, `aichi`, `fukuoka`.

## `cityCodes` (type: `array`):

🔢 **BY AREA:** One or more JIS municipal codes to scrape. Example: `13104` = Shinjuku-ku, Tokyo.

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

🏠 **BY LISTING URL (DETAIL ONLY):** Paste able detail URLs (e.g. `https://www.able.co.jp/detail/Detail.do?bk=000000051506936046&prefkey=tokyo&g=13104`). Used with scrapeMode = detail.

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

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

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

📄 Maximum area-list pages to paginate per search before stopping.

## `order` (type: `string`):

↕️ able's own sort/order parameter (`o`), carried verbatim. Leave blank for the default feed order.

## `rentMin` (type: `string`):

💴 Minimum rent filter (able `cf`).

## `rentMax` (type: `string`):

💴 Maximum rent filter (able `ct`).

## `areaMin` (type: `string`):

📐 Minimum floor area in m² (able `sf`).

## `areaMax` (type: `string`):

📐 Maximum floor area in m² (able `st`).

## `buildingType` (type: `array`):

🏢 Building-type filter (able `b`, repeatable): `1` = mansion, `2` = apartment, `3` = house.

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

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

## Actor input object example

```json
{
  "scrapeMode": "overview",
  "searchMode": "bySearchUrl",
  "searchUrls": [
    "https://www.able.co.jp/tokyo/area/13104/list/"
  ],
  "maxResults": 100,
  "maxPages": 5,
  "useProxy": false
}
```

# Actor output Schema

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

All scraped able rental 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 = {
    "searchUrls": [
        "https://www.able.co.jp/tokyo/area/13104/list/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/able-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 = { "searchUrls": ["https://www.able.co.jp/tokyo/area/13104/list/"] }

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/able-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 '{
  "searchUrls": [
    "https://www.able.co.jp/tokyo/area/13104/list/"
  ]
}' |
apify call sian.agency/able-property-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "able Property Scraper — Japan Rental Data & API",
        "description": "able (エイブル) rental scraper & real estate data API for able.co.jp. Apartment & house rent listings: rent, layout, area, floor, deposit, key money, brokerage fee, building age & structure, station access, photos — clean JSON/CSV, one row per unit. Fast overview or full detail. No account needed.",
        "version": "1.0",
        "x-build-id": "avMW5tvCp7cKgEeYM"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/sian.agency~able-property-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-sian.agency-able-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~able-property-scraper/runs": {
            "post": {
                "operationId": "runs-sync-sian.agency-able-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~able-property-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-sian.agency-able-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): unit-level cards from the area list — one row per listing, with rent, layout, area, floor, deposit, key money, building age, structure, station access & photos.\n\n🔎 **DETAIL** (enrich): fetches each listing's full page for the spec table — full fee breakdown, brokerage fee, orientation, building type, latitude/longitude, equipment, security, room features, hi-res photo gallery. Detail merges overview + detail into one record.",
                        "default": "overview"
                    },
                    "searchMode": {
                        "title": "🔀 Search mode",
                        "enum": [
                            "bySearchUrl",
                            "byArea",
                            "byListingUrl"
                        ],
                        "type": "string",
                        "description": "🔀 How listings are discovered.\n\n- **bySearchUrl** — paste a ready-made able area-list URL with your filters applied in the UI (most reliable).\n- **byArea** — give a prefecture slug and one or more JIS municipal codes.\n- **byListingUrl** — fetch specific listings directly (DETAIL only).",
                        "default": "bySearchUrl"
                    },
                    "searchUrls": {
                        "title": "🔗 Search URLs",
                        "type": "array",
                        "description": "🔗 **BY SEARCH URL:** Paste one or more able area-list URLs (the `/{prefecture}/area/{citycode}/list/` pages). Apply all your filters in the able UI first, then copy the address — every supported filter is preserved.\n\n💡 **TIP:** Example — `https://www.able.co.jp/tokyo/area/13104/list/`",
                        "default": [
                            "https://www.able.co.jp/tokyo/area/13104/list/"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "pref": {
                        "title": "🏯 Prefecture slug",
                        "type": "string",
                        "description": "🏯 **BY AREA:** Prefecture slug used in able URLs. Examples: `tokyo`, `osaka`, `kanagawa`, `aichi`, `fukuoka`."
                    },
                    "cityCodes": {
                        "title": "🔢 JIS city codes",
                        "type": "array",
                        "description": "🔢 **BY AREA:** One or more JIS municipal codes to scrape. Example: `13104` = Shinjuku-ku, Tokyo.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "listingUrls": {
                        "title": "🏠 Listing URLs",
                        "type": "array",
                        "description": "🏠 **BY LISTING URL (DETAIL ONLY):** Paste able detail URLs (e.g. `https://www.able.co.jp/detail/Detail.do?bk=000000051506936046&prefkey=tokyo&g=13104`). Used with scrapeMode = detail.",
                        "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
                    },
                    "maxPages": {
                        "title": "📄 Max pages",
                        "minimum": 1,
                        "type": "integer",
                        "description": "📄 Maximum area-list pages to paginate per search before stopping.",
                        "default": 5
                    },
                    "order": {
                        "title": "↕️ Sort order",
                        "type": "string",
                        "description": "↕️ able's own sort/order parameter (`o`), carried verbatim. Leave blank for the default feed order."
                    },
                    "rentMin": {
                        "title": "💴 Rent min",
                        "type": "string",
                        "description": "💴 Minimum rent filter (able `cf`)."
                    },
                    "rentMax": {
                        "title": "💴 Rent max",
                        "type": "string",
                        "description": "💴 Maximum rent filter (able `ct`)."
                    },
                    "areaMin": {
                        "title": "📐 Area min (m²)",
                        "type": "string",
                        "description": "📐 Minimum floor area in m² (able `sf`)."
                    },
                    "areaMax": {
                        "title": "📐 Area max (m²)",
                        "type": "string",
                        "description": "📐 Maximum floor area in m² (able `st`)."
                    },
                    "buildingType": {
                        "title": "🏢 Building type",
                        "type": "array",
                        "description": "🏢 Building-type filter (able `b`, repeatable): `1` = mansion, `2` = apartment, `3` = house.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "useProxy": {
                        "title": "🌐 Use Japan residential proxy",
                        "type": "boolean",
                        "description": "🌐 Route requests through a Japan residential proxy. **Off by default** — able.co.jp is reachable without a proxy, so leaving this off keeps runs fast and cheap. Enable only if you hit a rate-limit 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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
