Japan Real Estate API & Scraper
The Japan Real Estate API returns Japanese property listings as clean JSON.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
The primary search endpoint returns items with listing id, URL, Japanese title and address, price (JPY), madori (layout) and area (m2), and you can pull a detail, areas and a separate listings search and detail. It is built for real-estate tools and Japanese property analytics that need this data without a scraper. One ReefAPI key, one shared credit pool, the standard envelope.
Reading a Japanese listing without misplacing four zeros
Japanese property prices are quoted in man-yen (units of 10,000). The number you get back is not. price_jpy is already multiplied out into ordinary yen, while the filter you send, max_price_man, is still in man-yen. Getting those two the wrong way round is a factor of 10,000. All values measured on 2026-08-27.
| Field or parameter | Unit and meaning | Measured |
|---|---|---|
| price_jpy | Ordinary yen, already expanded out of man-yen | Rent price_ja '7.5万円' returned price_jpy 75000. Sale price_ja '498万円' returned price_jpy 4980000. |
| max_price_man | Your filter, in MAN-YEN, not yen | 10 means 100,000 yen a month for rent; 5000 means 50,000,000 yen for a sale |
| area_m2 | Square metres. SUUMO publishes m2, not tsubo, so nothing is converted | 17.62 on a Tokyo 1K rental, 52.54 on an Osaka 1LDK resale |
| madori | The Japanese layout code, returned as published | 1K, 1LDK, 3LDK, and ワンルーム for a studio |
| listing_id, rentals | 12 digits, zero-padded. URL is /chintai/jnc_<id>/ | 000109252250 |
| listing_id, sales | 8 digits. The URL is path-based, /ms/chuko/<pref>/sc_<ward>/nc_<id>/ | 20227675. `detail` needs the url for sales; an id alone returns MISSING_PARAM |
| station_access[] | One entry per line, with walk_minutes parsed from the Japanese string | A Tokyo rental returned three: 1, 10 and 16 minutes on three different lines |
| areas.ar | SUUMO region code, 9 values from 010 to 090 | tokyo 030, osaka 060, fukuoka 090 |
| areas.ta | JIS prefecture code, 01 to 47 | hokkaido 01, tokyo 13, osaka 27, okinawa 47 |
| admin_fee_jpy | Monthly management fee on rentals, separate from rent | 10000 on a 75,000 yen apartment, i.e. the real monthly outlay is 85,000 |
One page is not a fixed 30 rows. A single rent page for Tokyo returned 52 items, because SUUMO lists several units under one building block and each unit becomes its own row. Two rows can therefore share title_ja, address_ja, area_m2 and building_age_years while carrying different listing_id, bukken_code and price_jpy. Deduplicate on listing_id, never on building name.
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/japan-re/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"prefecture": "tokyo",
"listing_type": "rent",
"max_pages": 1
}
}{
"ok": true,
"meta": {
"api": "japan-re",
"endpoint": "search",
"mode": "live",
"latency_ms": 6552.8,
"record_count": 66,
"bytes": 493478,
"cache_hit": false,
"completeness_pct": 100,
"stop_reason": "max_pages",
"method": "suumo_ssr",
"prefecture": "tokyo",
"listing_type": "rent",
"page": 1,
"filters_applied": {}
},
"data": {
"items": [
{
"listing_id": "[redacted-phone]",
"bukken_code": "[redacted-phone]",
"source": "suumo",
"listing_type": "rent",
"transaction_type": "rent",
"url": "https://suumo.jp/chintai/jnc_[redacted-phone]/?bc=[redacted-phone]",
"title_ja": "YOU I COURT",
"address_ja": "東京都杉並区浜田山3",
"price_jpy": 115000,
"price_ja": "11.5万円",
"admin_fee_jpy": null,
"madori": "1K",
"madori_ja": "1K",
"area_m2": 25.25,
"station_access": [
{
"access_ja": "[trimmed-depth]",
"walk_minutes": "[trimmed-depth]",
"bus_minutes": "[trimmed-depth]"
},
{
"access_ja": "[trimmed-depth]",
"walk_minutes": "[trimmed-depth]",
"bus_minutes": "[trimmed-depth]"
},
{
"access_ja": "[trimmed-depth]",
"walk_minutes": "[trimmed-depth]",
"bus_minutes": "[trimmed-depth]"
}
],
"building_age_years": 7,
"photos": [
"https://img01.suumo.com/front/gazo/fr/bukken/560/[redacted-phone]/[redacted-phone]_ro.jpg",
"https://img01.suumo.com/front/gazo/fr/bukken/560/[redacted-phone]/[redacted-phone]_co.jpg",
"https://img01.suumo.com/front/gazo/fr/bukken/560/[redacted-phone]/[redacted-phone]_go.jpg"
]
},
{
"listing_id": "[redacted-phone]",
"bukken_code": "[redacted-phone]",
"source": "suumo",
"listing_type": "rent",
"transaction_type": "rent",
"url": "https://suumo.jp/chintai/jnc_[redacted-phone]/?bc=[redacted-phone]",
"title_ja": "京王新線 初台駅 3階建 築21年",
"address_ja": "東京都渋谷区本町2",
"price_jpy": 148000,
"price_ja": "14.8万円",
"admin_fee_jpy": 6000,
"madori": "1LDK",
"madori_ja": "1LDK",
"area_m2": 37.44,
"station_access": [
{
"access_ja": "[trimmed-depth]",
"walk_minutes": "[trimmed-depth]",
"bus_minutes": "[trimmed-depth]"
},
{
"access_ja": "[trimmed-depth]",
"walk_minutes": "[trimmed-depth]",
"bus_minutes": "[trimmed-depth]"
},
{
"access_ja": "[trimmed-depth]",
"walk_minutes": "[trimmed-depth]",
"bus_minutes": "[trimmed-depth]"
}
],
"building_age_years": 21,
"photos": [
"https://img01.suumo.com/front/gazo/fr/bukken/218/[redacted-phone]/[redacted-phone]_ro.jpg",
"https://img01.suumo.com/front/gazo/fr/bukken/218/[redacted-phone]/[redacted-phone]_co.jpg",
"https://img01.suumo.com/front/gazo/fr/bukken/218/[redacted-phone]/[redacted-phone]_go.jpg"
]
},
{
"listing_id": "[redacted-phone]",
"bukken_code": "[redacted-phone]",
"source": "suumo",
"listing_type": "rent",
"transaction_type": "rent",
"url": "https://suumo.jp/chintai/jnc_[redacted-phone]/?bc=[redacted-phone]",
"title_ja": "グリーンヒル",
"address_ja": "東京都八王子市川口町",
"price_jpy": 66000,
"price_ja": "6.6万円",
"admin_fee_jpy": 4000,
"madori": "1LDK",
"madori_ja": "1LDK",
"area_m2": 40.07,
"station_access": [
{
"access_ja": "[trimmed-depth]",
"walk_minutes": "[trimmed-depth]",
"bus_minutes": "[trimmed-depth]"
},
{
"access_ja": "[trimmed-depth]",
"walk_minutes": "[trimmed-depth]",
"bus_minutes": "[trimmed-depth]"
},
{
"access_ja": "[trimmed-depth]",
"walk_minutes": "[trimmed-depth]",
"bus_minutes": "[trimmed-depth]"
}
],
"building_age_years": 17,
"photos": [
"https://img01.suumo.com/front/gazo/fr/bukken/337/[redacted-phone]/[redacted-phone]_go.jpg",
"https://img01.suumo.com/front/gazo/fr/bukken/337/[redacted-phone]/[redacted-phone]_co.jpg",
"https://img01.suumo.com/front/gazo/fr/bukken/337/[redacted-phone]/[redacted-phone]_ro.jpg"
]
}
],
"count": 66,
"prefecture": "tokyo",
"listing_type": "rent",
"page": 1,
"pages_fetched": 1,
"has_next_page": true,
"next_page": 2
}
}What the Japan Real Estate API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | Search SUUMO property listings in any of Japan's 47 prefectures — rentals or homes for sale (used house / used condo / land / new house) — filtered by max price (万円), min area (m²), max station walk-time, building age and a free-text station/area keyword. Paginate with page + max_pages. | Real-estate investors call search to search SUUMO property listings in any of Japan's 47 prefectures. | prefecture, listing_type, page, max_pages, max_price_man, ... |
| detail | Full detail for one SUUMO listing — rent/deposit/key-money or sale price, madori layout, floor area, floor, orientation, building structure & age, station access and the photo gallery. For RENT pass listing_id; for SALE pass the listing's `url` from a search result (SUUMO sale pages have no id-only URL). listing_type picks the right parser. | Brokerage tools call detail to get full detail for one SUUMO listing. | listing_id, url, listing_type |
| areas | List Japan's 47 prefectures with their romaji slug, kanji name and SUUMO region/JIS codes — use it to discover or validate the `prefecture` value before searching. Pass an optional query to filter by name. | Property dashboards call areas to list Japan's 47 prefectures with their romaji slug, kanji name and SUUMO region/JIS codes. | query |
| listings/search | Legacy name for `search`, kept so older integrations keep working. It runs the exact same code and returns the exact same body (verified byte-for-byte, 2026-08-28). New code should call `search`. | Lead-generation teams call listings/search to get legacy name for `search`, kept so older integrations keep working. | prefecture, listing_type, page, max_pages, max_price_man, ... |
| listings/detail | Legacy name for `detail`, kept so older integrations keep working. It runs the exact same code and returns the exact same body. New code should call `detail`. | Real-estate investors call listings/detail to get legacy name for `detail`, kept so older integrations keep working. | listing_id, url, listing_type |
Call search from your stack
curl -X POST https://api.reefapi.com/japan-re/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"prefecture":"tokyo","listing_type":"rent","max_pages":1}'import requests
r = requests.post(
"https://api.reefapi.com/japan-re/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"prefecture": "tokyo",
"listing_type": "rent",
"max_pages": 1
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/japan-re/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"prefecture": "tokyo",
"listing_type": "rent",
"max_pages": 1
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.japan-re.search with {"prefecture":"tokyo","listing_type":"rent","max_pages":1}.Who uses this API and why
- Investors call search to track Japanese listing prices by area.
- Dashboards use detail and madori to enrich a property.
- Analysts use areas to size a Japanese market.
Questions developers ask before integrating
Is price_jpy in man-yen or in yen?
In yen, already multiplied out, and both transaction types were checked. A Tokyo rental showing price_ja '7.5万円' returned price_jpy 75000, and an Osaka resale showing price_ja '498万円' returned price_jpy 4980000. You never need to multiply by 10,000. The one place man-yen survives is the filter: max_price_man is in man-yen, so 10 caps rent at 100,000 yen a month and 5000 caps a sale at 50 million yen.
Why does `detail` reject my sale listing_id?
Because SUUMO sale pages have no id-only URL to reconstruct. Rentals live at /chintai/jnc_<12-digit id>/ and can be fetched by listing_id alone; sales live at a path that includes the prefecture and the ward, such as /ms/chuko/osaka/sc_osakasayama/nc_20227675/, which cannot be derived from the id. Passing a sale listing_id returned MISSING_PARAM saying exactly that. Copy the `url` from the search result instead and pass it with the matching listing_type.
What extra fields does a sale detail carry over a search row?
The recurring costs and the building facts a buyer needs, and they arrive as Japanese strings rather than parsed numbers: management_fee_ja ('8600円/月(委託(通勤))'), repair_fund_ja ('4130円/月'), total_units_ja ('293戸'), zoning_ja ('2種住居'), handover_ja ('即引渡可') and updated_ja ('2026年8月2日'). Those five are not advertised in the action's declared return shape but were present on the sale listing measured. Budget for the monthly fees separately: on that 4.98 million yen apartment they came to 12,730 yen a month before anything else.
Why does title_ja change between search and detail on a sale listing?
Because the two pages title the same property differently. The search row carried the agent's marketing headline, and the detail page for the same listing carried a generated title of building name, price and layout. property_name_ja is the field that stayed identical across both, so use it as the building's name and treat title_ja as display copy. On rentals the two agree, since a rental row is titled with the building name in both places.
How do I find the right prefecture value?
Call `areas`, which returns all 47 with four fields each: a romaji slug, the kanji name, ar and ta. The slug or the kanji both work as the `prefecture` parameter. ar is the SUUMO region grouping, only nine values from 010 to 090, so tokyo and kanagawa share 030 while kyoto and osaka share 060. ta is the JIS prefecture code, unique per prefecture, 01 for hokkaido through 47 for okinawa. Pass `query` to filter, for example 'osa' returned only osaka.
Why are deposit_jpy and key_money_jpy null?
They came back null on all three Tokyo rentals sampled, along with deposit_ja and key_money_ja. SUUMO does not print shikikin and reikin on every listing page, and where the page does not print them there is nothing to parse, so the field is null rather than zero. Read null as unknown, not as 'no deposit required'. admin_fee_jpy is more reliably present on search rows, at 8,000 to 10,000 yen a month on the listings measured.
How much does one page actually return, and how do I get more?
It varies by listing type. A Tokyo rent page returned 52 items and an Osaka buy_apartment page returned 30, both with max_pages 1, because rentals list every available unit under one building block. has_next_page and next_page tell you whether to continue, and max_pages up to 20 merges pages in a single call, stopping early on an empty page. meta.stop_reason says which limit ended the run.
What do station_access entries look like, and is walk_minutes reliable?
Each entry has access_ja, the raw Japanese line naming the railway line and station, plus walk_minutes and bus_minutes parsed out of it. Search rows return every line a property is near: one Tokyo rental came back with three entries at 1, 10 and 16 minutes on the Hanzomon, Oedo and Shinjuku lines, each number matching its own access_ja string. The formatting differs slightly between rent and sale pages, so keep access_ja as the source of truth and treat walk_minutes as the sortable convenience field.
What is the Japan Real Estate API?
Japan Real Estate API is a ReefAPI endpoint group for japan property listings and details. It returns live JSON through POST requests under /japan-re/v1.
Is the Japan Real Estate API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. Japan Real Estate calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Japan Real Estate login or account?
No login to Japan Real Estate is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Japan Real Estate data?
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Japan Real Estate API use?
Japan Real Estate actions currently cost 1 credit per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.
Can I call Japan Real Estate from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call japan-re actions with the same key, credit pool and JSON envelope used by normal REST requests.