Search and pagination
GET /japan/api/v1/assets is the search endpoint. Every parameter is optional; call it with none and you get the first page of every building JMAD has recorded.
curl "https://dnk.co/japan/api/v1/assets?q=丸ビル"Parameters
| Parameter | Type | Filters on |
|---|---|---|
q | string | Public ID, JA/EN names, Japanese address, or one alias; every whitespace-separated term must match |
prefecture | slug | Prefecture, e.g. tokyo |
ward | slug | Ward within the prefecture |
machiAza | slug | 町字 machi-aza (town-block) within the ward |
type | string | Asset type. A building matches when any of its asset types does, and the value is resolved to a category first, so type=residential and type=apartments return the same buildings. See the field dictionary for the category table |
page | integer | 1-indexed page number, defaults to 1 |
Combine them freely. prefecture=tokyo&ward=chiyoda&type=office narrows to buildings in Chiyoda with an office use — including mixed-use buildings that are also retail.
A page that is not a positive integer (0, -1, abc, 1.5) or a slug that does not decode is a 400 with an ApiProblem body; see rate limits and errors.
Matching and ordering
Building text search covers the public ID, Japanese and English names, Japanese address, and every alias. Queries are trimmed, normalized with Unicode NFKC, lowercased using JavaScript Unicode rules, and split on whitespace. Every term must appear as a literal substring of the same searchable value. Stored searchable values use the same normalization. Full-width Latin letters and half-width kana therefore match their normalized forms. Search does not transliterate romaji, equate hiragana with katakana, or perform fuzzy matching.
The characters %, _, and backslash are literal query text. Terms cannot be split across values: a query cannot match one term in the name and another in the address, or span two aliases.
Web area filtering and the assets API share this text-matching rule. Their result ordering and pagination remain specific to each view. The assets API orders records by recorded time descending, then public ID ascending for ties.
Homepage search suggestions return at most five building and area rows combined. An exact building ID ranks first, then names or aliases that start with the full query, then buildings where every term appears within one searchable value. Building ties use the public ID; area ties use the full prefecture/ward/machi-aza path. Area suggestions match when every term appears in the displayed Japanese area name. Their counts include every published building in the area, regardless of the query.
The result envelope
{
"items": [
{
"id": "DNK-JP-13-01000000",
"path": "/japan/tokyo/chiyoda/marunouchi/DNK-JP-13-01000000",
"assetTypes": [
{
"value": "office",
"category": "office",
"tier": "free",
"provenance": {
"source": "osm",
"extractionMethod": "osm-tag",
"retrievedAt": "2026-08-30T04:00:00Z",
"confidence": 0.75
}
}
],
"fields": {
"floorsAbove": {
"value": 37,
"unit": null,
"tier": "free",
"provenance": {
"source": "wikidata",
"extractionMethod": "wikidata-claim",
"retrievedAt": "2026-08-30T04:00:00Z",
"confidence": 0.85
},
"conflict": null,
"estimated": false
},
"heightM": {
"value": 179.2,
"unit": "m",
"tier": "free",
"provenance": {
"source": "wikidata",
"extractionMethod": "wikidata-claim",
"retrievedAt": "2026-08-30T04:00:00Z",
"confidence": 0.85
},
"conflict": { "value": 18, "unit": "m", "source": "osm" },
"estimated": false
}
}
}
],
"page": 1,
"total": 1,
"totalCapped": false
}(Each item is a full BuildingPage record. The excerpt above trims fields down to two entries and drops location, aliases, footprint, sources, venues, nearby, history, and counters for space; see the field dictionary and provenance and precedence for the rest.)
items holds full building page records for that page, in the same shape as GET /japan/api/v1/assets/{id} (see the field dictionary for what each field contains). page echoes the page you requested (or the default), and total is the count of matching buildings across every page, not just this one.
Without q, total is exact. With q, counting stops at 1,000: a broad term such as 東京 or 渋谷 matches most addresses in a ward, and counting every match would be slow. When a text search matches more than 1,000 buildings, total is 1000 and totalCapped is true. Show it as "1,000+" and suggest a narrower query or a prefecture, ward or machiAza filter. totalCapped is always false when there is no q.
Asset types are a list
assetTypessits at the top level of a record, besidealiases, not insidefields. A building always has at least one and can have several — an office tower with ground-floor shops publishes both. Read the list rather than expecting a single value.
Page size is fixed at 20 results. There is no parameter to change it. If total is 47 and you asked for page=1, you have items 1 through 20; page=2 gets you 21 through 40, and page=3 the remaining 7.
The highest page that returns results is page=50, so one query reaches at most 1,000 buildings. To go further, narrow the query by area: split a prefecture into its wards, and a ward into its machi-aza (the area endpoints list the children and their building counts). A machi-aza that still holds more than 1,000 buildings can be split further with type.
NoteAn out-of-range page number, higher than the number of pages
totalimplies or higher than 50, returns an emptyitemsarray with thepageandtotalyou asked for, not an error. Checkitems.lengthrather than expecting a 404 at the end of a result set.
Owner and area endpoints
GET /japan/api/v1/owners/{name}/assets returns every building whose recorded public owner matches name, in the same envelope shape as search (an OwnerPortfolio with owner and items, no pagination since portfolios are expected to stay small).
Area endpoints give you the hierarchy without a building list: GET /japan/api/v1/areas/{prefecture}, /areas/{prefecture}/{ward}, and /areas/{prefecture}/{ward}/{machiAza} each return a summary of that area (building count, most recent record time), its child areas, and per-field coverage counts. Use these to build a browser, or to check how complete a ward's data is before you query into it. An area slug that decodes but has no published buildings is a 404, the same as an unknown asset ID.
Browsing on the page surface
The home page at /japan and the area lists provide location selectors for prefecture, municipality or ward, and machi-aza. Selecting a location filters in place: the home page reloads as /japan?prefecture=…&ward=…&machiAza=…, and an area list, including a hub page such as /japan/tokyo/chiyoda, opens /japan/areas?prefecture=…&ward=…&machiAza=…. Hub paths such as /japan/tokyo stay canonical in sitemaps, breadcrumbs and markdown links. See Areas and coverage for how the selectors work.
HTML area lists accept q, type, and page, plus:
floorsMinandfloorsMaxfor the floor range.heightMinandheightMaxfor the height range in metres.builtMinandbuiltMaxfor the construction-year range.haswithowner,yearBuilt,noConflict, orvenues.sortwithfootprint,height,floors,built, orname.prefecture,ward, andmachiAzaon/japan/areasto filter by location.
Multiple values of one filter can be sent comma-separated, such as type=office,commercial, or as repeated keys, such as type=office&type=commercial. Type aliases normalize to their canonical categories. The asset type facets shown in the filter rail are categories, and a building with two uses is counted under each of them. A selected type stays active even when no building in the new area carries it; the list shows no matches instead of silently removing that filter.
On an area list, changing location preserves the text search, asset types, ranges, data-availability filters, and sort order. Results restart at page 1. For example, choosing Chūō from /japan/tokyo/chiyoda?type=office&heightMin=50&sort=height&page=3 opens /japan/areas?prefecture=tokyo&ward=chuo&type=office&heightMin=50&sort=height.
The home-page search box and quick-filter links do not carry the location; they search all Japan at /japan/areas. Use the JSON API above when you need the records as data.
Search suggestions in the browser
On the /japan homepage search box, clearing the input, pressing Escape or moving focus outside the search control dismisses suggestions and cancels any pending request. A delayed response from an earlier query cannot reopen the list. Typing a new query starts a new request after a short pause. Focusing a nonempty input reopens the suggestions already loaded for that text, or requests them if none are current.
During Japanese IME composition, suggestions from the previous text are cleared and Enter does not activate an old option. Suggestions resume for the completed composition. Outside composition, arrow keys, Home and End select options and Enter opens the selected result; with no option selected, Enter submits the search to /japan/areas?q=…. Moving focus to an option inside the search control keeps it available.
Next
- Field dictionary for what a result item contains.
- Areas and coverage for the prefecture/ward/machi-aza hierarchy behind these filters.
- Rate limits and errors for the API's 120 requests/min limit.
Updated about 21 hours ago
