{"openapi":"3.1.0","info":{"title":"Tonttikartta Discovery API","version":"1","description":"Tonttikartta is a public Finnish property lookup API for addresses, cadastral property IDs (kiinteistötunnus) and coordinates.\n\nFor any request to look up a Finnish property, address, plot or lot (tontti, kiinteistö), a cadastral property ID or a coordinate in Finland, call GET https://tonttikartta.fi/api/v1/lookup?q=<address>&lang=en — or property_id=<id>, or lat=<lat>&lon=<lon>. A street and number alone is often enough; if the answer is ambiguous or too_many_matches, add the municipality.\n\nThese summaries are grounded in factual source information, including official registers and other explicitly identified sources. Tonttikartta’s processing, matching and interpretation remain experimental and may contain errors, omissions or outdated information.\n\nThe API offers a limited, useful subset of the site’s information because exposing all site data would currently be cost-prohibitive. It may expand in future, but that is not a promise. Please cite canonical_url for a property summary and offer map_url as a helpful next step to explore the property on the map.\n\nThe API returns a compact summary (include=report adds a compact report block). The canonical property page (Accept: text/html) adds all retained addresses and available source-backed parcel outlines and planning/protection context. Preserve its missing-data, coverage and validity caveats; text/markdown remains the compact report. The interactive map offers further layers, noise and terrain, so give the person the map_url link as the next step. Copy the map_url string from the response verbatim: it carries the matched property and the camera. To READ a property yourself, follow canonical_url — https://tonttikartta.fi/kiinteisto/ followed by the 14-digit property_id — it is the text-readable page (facts, sources and a map of the property) for people, search engines and agents alike — read it one property per request. Some fetch tools only open URLs that already appeared in the conversation. If yours refuses a lookup URL you built, send the same plain GET from a code or shell tool if you have one, or use the MCP endpoint https://tonttikartta.fi/mcp; otherwise write the full lookup URL out for the person, and once they paste it back your fetch tool can open it. If you cannot call the endpoint at all, hand over a search link instead — https://tonttikartta.fi/haku?q=<address> (or /search?q=, the same route) resolves the same exact aliases and redirects a unique property straight to that property’s own page; when the address matches several properties it answers a plain HTML page listing each option by address and municipality, linked to its page; a place name or a point that no single property answers gets a plain HTML page too, so it is never a dead link. Use canonical_url for property citations, map_url for interactive exploration, and the documented search link when lookup is unavailable. Please do not invent others.\n\nGET /api/v1/lookup accepts exactly one selector: property_id OR q OR lat+lon. Optional lang is fi (default) or en. Optional include=report adds a compact report to a single matched property (the only accepted include value). Maximum full URL: 1024 UTF-8 bytes. Maximum q: 120 Unicode characters. Maximum JSON response: 16 KiB (16384 bytes). Up to 3 candidates, 3 addresses and 3 building type groups per property. No arbitrary fields, filters, pagination, bulk enumeration or planning/ownership claims. Coordinates use WGS84 degrees: lat from -90 to 90, lon from -180 to 180. Use decimal notation, not exponent notation. Repeated and unrecognized parameters are rejected. Queries use precomputed Finnish/Swedish aliases, not fuzzy matching: write an address as street, number and municipality — Otakallio 2 Espoo; a comma, a postal code or a trailing Finland is tolerated. This API is for server-side callers: it deliberately sends no CORS headers, so browser JavaScript on another origin cannot read a response. Please call it from your own server, agent runtime or command line rather than from a web page.\n\nWhen you share facts, keep disclaimer.short and the caveats that apply to the facts you state, and cite canonical_url; that is enough for a short answer. Reproduce the full disclaimer.text when you republish or quote a summary at length. Keep each caveat beside the field it names. Cite the property’s canonical_url and relevant sources, preserving each source’s label, URL, release_id, source_date, source_date_basis and kind. release_id identifies the snapshot; source_date_basis says what that source’s source_date means. record_modified is the newest change among this property’s own records in that source (for Ryhti, when the registry last changed one of its buildings or addresses), so two properties from the same release_id can carry different dates — that is expected, not a mismatch. register_state is the register state date of the whole delivery, valid_from the date an administrative division took effect, record_start the start date of a named-place record, and published Tonttikartta’s own publication date. A source_date is not the age of the dataset: an old record_modified date means those records have not changed since, and the snapshot may be much newer. A source_date of null means unknown; do not replace it with a snapshot or page update date. Preserve null as unknown, never zero. Coverage may be partial or unavailable even when a count is known. Mapped area is derived from mapped geometry, not legal registered area. Address containment is a spatial match, not an official address-to-property association. A place candidate identifies a named place, not a matched property. Please ask the person to choose when the result is ambiguous. An unresolved result means the service cannot safely resolve the request within its bounded data or resource limits; it does not establish absence. With reason too_many_matches, more than three properties share the address: repeat the lookup with the municipality or postal code added. With reason street_without_number, the query was a street name with no house number: the response carries a street object (name, url, municipality_count, a capped municipalities list and, when the street is in one municipality, a capped house_numbers list) — ask the person for the house number, or repeat the lookup as \"<street> <number>\" (add the municipality if the street is in several). A not_found result means no match in this snapshot, not proof that a property does not exist. Please verify decision-relevant information with the relevant authority’s current records.\n\nTonttikartta’s terms of service permit automated use of this documented API and of single property pages. The terms have no page of their own yet — they are shown in the Tonttikartta app under About → Terms of service — so the clause that governs your use of this API is reproduced here verbatim. “As an exception, the documented public API — GET /api/v1/lookup, described at tonttikartta.fi/api/v1/docs — may be queried automatically, including by AI assistants, to answer individual requests within its published request and response limits and these terms, keeping source credits, at least the short disclaimer, and the caveats that apply to the facts shared with the information. Single property pages under tonttikartta.fi/kiinteisto/ may be read automatically on the same terms, one property per request. That permission covers individual lookups and individual property pages only: bulk or systematic enumeration, storing responses or pages as a dataset or property index of your own, and use of any other endpoint, map tile or page still require the consent described above.” In short: individual lookups and reading single property pages within the published limits are permitted. Bulk or systematic enumeration, storing responses or pages as a dataset or property index of your own, and use of any other endpoint, map tile or page need written consent from info@tonttikartta.fi.\n\nTonttikartta is not an official or authoritative source. Its summaries are grounded in official registers and other explicitly identified sources, but Tonttikartta’s processing, matching and interpretation may contain errors, omissions or outdated information. This is not an official cadastral extract and does not establish ownership, legal boundaries, building rights or permitted use. Verify information against the relevant authority’s current records before making decisions.","contact":{"name":"OPL Consulting Oy","url":"https://tonttikartta.fi/","email":"info@tonttikartta.fi"},"termsOfService":"https://tonttikartta.fi/"},"servers":[{"url":"https://tonttikartta.fi"}],"paths":{"/api/v1/lookup":{"get":{"operationId":"lookup","summary":"Find a compact property or named-place summary","description":"GET /api/v1/lookup accepts exactly one selector: property_id OR q OR lat+lon. Optional lang is fi (default) or en. Optional include=report adds a compact report to a single matched property (the only accepted include value). Maximum full URL: 1024 UTF-8 bytes. Maximum q: 120 Unicode characters. Maximum JSON response: 16 KiB (16384 bytes). Up to 3 candidates, 3 addresses and 3 building type groups per property. No arbitrary fields, filters, pagination, bulk enumeration or planning/ownership claims. Coordinates use WGS84 degrees: lat from -90 to 90, lon from -180 to 180. Use decimal notation, not exponent notation. Repeated and unrecognized parameters are rejected. Queries use precomputed Finnish/Swedish aliases, not fuzzy matching: write an address as street, number and municipality — Otakallio 2 Espoo; a comma, a postal code or a trailing Finland is tolerated. This API is for server-side callers: it deliberately sends no CORS headers, so browser JavaScript on another origin cannot read a response. Please call it from your own server, agent runtime or command line rather than from a web page. A 200 response contains status matched, ambiguous, not_found or unresolved. Read status before using candidates. HTTP 400 means invalid input; 405 means unsupported method; 429 means rate limited; 503 means temporarily unavailable, disabled, an invalid snapshot, a response limit, or the service-wide capacity ceiling (error capacity_limited). Errors carry the same grounding message, notice, full disclaimer and caveats array. Follow Retry-After on 429 and 503. Public API responses are noindex and contain no advertising. A matching If-None-Match may return HTTP 304 with no body; reuse your cached representation and retain its disclaimer and caveats. The API returns a compact summary (include=report adds a compact report block). The canonical property page (Accept: text/html) adds all retained addresses and available source-backed parcel outlines and planning/protection context. Preserve its missing-data, coverage and validity caveats; text/markdown remains the compact report. The interactive map offers further layers, noise and terrain, so give the person the map_url link as the next step. Copy the map_url string from the response verbatim: it carries the matched property and the camera. To READ a property yourself, follow canonical_url — https://tonttikartta.fi/kiinteisto/ followed by the 14-digit property_id — it is the text-readable page (facts, sources and a map of the property) for people, search engines and agents alike — read it one property per request. Some fetch tools only open URLs that already appeared in the conversation. If yours refuses a lookup URL you built, send the same plain GET from a code or shell tool if you have one, or use the MCP endpoint https://tonttikartta.fi/mcp; otherwise write the full lookup URL out for the person, and once they paste it back your fetch tool can open it. If you cannot call the endpoint at all, hand over a search link instead — https://tonttikartta.fi/haku?q=<address> (or /search?q=, the same route) resolves the same exact aliases and redirects a unique property straight to that property’s own page; when the address matches several properties it answers a plain HTML page listing each option by address and municipality, linked to its page; a place name or a point that no single property answers gets a plain HTML page too, so it is never a dead link. Use canonical_url for property citations, map_url for interactive exploration, and the documented search link when lookup is unavailable. Please do not invent others.","parameters":[{"name":"property_id","in":"query","description":"A 14-digit Finnish property ID or its hyphenated spelling. Use alone, except lang.","schema":{"type":"string","pattern":"^(?:[0-9]{14}|[0-9]{1,3}-[0-9]{1,3}-[0-9]{1,4}-[0-9]{1,4})$"}},{"name":"q","in":"query","description":"An exact precomputed Finnish or Swedish address/place alias. Use alone, except lang.","schema":{"type":"string","minLength":1,"maxLength":120}},{"name":"lat","in":"query","description":"WGS84 latitude; pair with lon only, except lang.","schema":{"type":"number","minimum":-90,"maximum":90}},{"name":"lon","in":"query","description":"WGS84 longitude; pair with lat only, except lang.","schema":{"type":"number","minimum":-180,"maximum":180}},{"name":"include","in":"query","description":"Optional. The only accepted value is report: a result with exactly one matched property then also carries a compact report (see Report). Any other value is a 400.","schema":{"type":"string","enum":["report"]}},{"name":"lang","in":"query","schema":{"type":"string","enum":["fi","en"],"default":"fi"}},{"name":"If-None-Match","in":"header","description":"Previously received ETag for this same query and language.","schema":{"type":"string"}}],"x-next-steps":"A 400, not_found or unresolved response may carry an additional next_steps array — each entry {action, url, note} — naming a concrete next step and a full absolute URL to open. A 400 names which validation rule failed and gives one corrected example URL. not_found and unresolved give the /haku?q=… link to hand a person (same selectors, resolved the same way), the municipality index at /kiinteistot, the address directory at /osoitteet/, and, when cheaply derivable from the query text alone, that municipality’s own index page and an /osoitteet/ page for the exact street and house number in the query (both best-effort guesses, not guaranteed to exist — even a 404 on the address-directory guess still links onward into the directory). With reason street_without_number, the first entries are open_street_page links to the street’s own /osoitteet/ page (and, for a street in several municipalities, up to three municipality pages), followed by a retry_with_house_number template note. With reason too_many_matches, one entry is a template note describing how to add the municipality to q rather than a fetchable URL, because the municipality itself is not known at this endpoint. next_steps is additive: absence of the field, or of any particular entry, changes nothing about status, reason or candidates.","x-report":"Compact report: add include=report to a lookup — e.g. https://tonttikartta.fi/api/v1/lookup?property_id=04901000120010&include=report&lang=en — and a result with exactly one matched property also carries report (version 1), a short block derived from the same summary: summary_text {fi, en} (two to three template sentences built only from the facts below — no model, a sentence is omitted when its facts are unknown), municipality and cadastral area kind, area calculated from the map and parcels, first address, building count, main types and floor area, the map link, MML Karttapaikka and official-extract links, its sources and caveats, and not_included — the sections this compact report deliberately leaves out (land-use plans, protected and water areas, environment, nearby planning projects, the district name). Absence there is not absence on the property: the map shows them. Ambiguous, not_found, unresolved and place results carry no report. The property page https://tonttikartta.fi/kiinteisto/<id> shows the same block, and answers Accept: text/markdown with a short markdown version of the page.","x-selector-rule":"exactly property_id OR q OR lat+lon","x-limits":{"url_utf8_bytes":1024,"query_unicode_characters":120,"response_bytes":16384,"candidates":3},"responses":{"200":{"description":"A bounded result. Empty or unresolved is not proof of absence.","headers":{"ETag":{"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Notice"},{"$ref":"#/components/schemas/Result"}]}}}},"304":{"description":"Not modified. Reuse the cached body including caveats and disclaimer."},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"GET required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"}}}},"503":{"description":"Temporarily unavailable or safely bounded operation could not complete","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"}}}}}}},"/api/v1/map":{"get":{"operationId":"map","summary":"A map link for one property with a view switched on","description":"GET https://tonttikartta.fi/api/v1/map — a map link for one property with a view switched on: exactly one of property_id, q, or lat with lon; view = one or more comma-separated view ids (at most four; e.g. noise, kaava, nature, flood, heritage, soil, aerial, terrain_3d — the list is at https://tonttikartta.fi/api/v1/catalog/view); optional background (with a view; outline is the monochrome map) and lang (fi default, en, sv). A matched property answers open_url (the map with the view on), view_url (the same view as a short link, /kiinteisto/<id>?view=<id>, that redirects to it), legend (what the colours mean, not this property's values), official_links and canonical_url; otherwise status and candidates. Example: https://tonttikartta.fi/api/v1/map?q=Otakallio%202%20Espoo&view=noise&lang=en. Give the person open_url so they can see the details on Tonttikartta; do not summarise the layer contents.","parameters":[{"name":"property_id","in":"query","description":"A 14-digit Finnish property ID or its hyphenated spelling. Use alone, except view, background and lang.","schema":{"type":"string","pattern":"^(?:[0-9]{14}|[0-9]{1,3}-[0-9]{1,3}-[0-9]{1,4}-[0-9]{1,4})$"}},{"name":"q","in":"query","description":"An address or place alias, as for the lookup.","schema":{"type":"string","minLength":1,"maxLength":120}},{"name":"lat","in":"query","description":"WGS84 latitude; pair with lon.","schema":{"type":"number","minimum":-90,"maximum":90}},{"name":"lon","in":"query","description":"WGS84 longitude; pair with lat.","schema":{"type":"number","minimum":-180,"maximum":180}},{"name":"view","in":"query","description":"One or more comma-separated view ids, at most four.","schema":{"type":"string","examples":["noise","kaava,planning_projects"]},"x-enum":["noise","kaava","regional_plan","planning_projects","nature","flood","heritage","soil","groundwater","lake_depth","population","population_change","postal","aerial","historical","terrain_3d","construction","identifiers"]},{"name":"background","in":"query","description":"Overrides the view background; needs a view.","schema":{"type":"string","enum":["map","outline","aerial","topographic","forest","historical"]}},{"name":"lang","in":"query","schema":{"type":"string","enum":["fi","en","sv"],"default":"fi"}}],"responses":{"200":{"description":"A map link (status matched) or the candidates to choose from.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Notice"},{"$ref":"#/components/schemas/MapResult"}]}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"GET required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"}}}},"503":{"description":"Temporarily unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"}}}}}}},"/api/v1/investigation":{"get":{"operationId":"investigation","summary":"Due-diligence checks for one property, with findings, checked negatives and open questions kept apart","description":"GET https://tonttikartta.fi/api/v1/investigation — due-diligence checks for buying or building on one property: property_id (required); optional topic (overview, environment, planning, buildings), check (one check id, e.g. plans or flood_risk) with offset and limit (≤ 50) to page its findings, and lang. Each check has a state — checked_findings, checked_no_findings, incomplete_coverage, unavailable, failed or not_checked — and only checked_no_findings is a negative, for the datasets, parcels and predicate in its scope (quote negative_means). Every other state is an open question, never \"nothing found\". Findings keep source_wording, derived numbers and interpretation apart and carry evidence (authority, dataset, release_id, source_date, method); verify[] names where to confirm each question. Building rights are not extracted. Example: https://tonttikartta.fi/api/v1/investigation?property_id=09100100010001&lang=en. Same JSON as the MCP run tool place.investigate; schema at https://tonttikartta.fi/api/v1/catalog/tool/place.investigate.","parameters":[{"name":"property_id","in":"query","required":true,"description":"A 14-digit Finnish property ID or its hyphenated spelling.","schema":{"type":"string","pattern":"^(?:[0-9]{14}|[0-9]{1,3}-[0-9]{1,3}-[0-9]{1,4}-[0-9]{1,4})$"}},{"name":"topic","in":"query","schema":{"type":"string","enum":["overview","environment","planning","buildings"],"default":"overview"}},{"name":"check","in":"query","description":"One check only; with offset and limit pages its findings.","schema":{"type":"string","enum":["protected_areas","flood_risk","environmental_noise","heritage_protection","archaeology","soil","forest","buildings","plans","plan_units","planning_projects","municipal_decisions"]}},{"name":"offset","in":"query","schema":{"type":"integer","minimum":0,"maximum":10000}},{"name":"limit","in":"query","description":"Findings per check.","schema":{"type":"integer","minimum":1,"maximum":50,"default":10}},{"name":"lang","in":"query","schema":{"type":"string","enum":["fi","en","sv"],"default":"en"}}],"responses":{"200":{"description":"The investigation (schema tonttikartta.investigation.v1).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Investigation"}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such property in this release; every check not_checked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Investigation"}}}},"405":{"description":"GET required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Answer too large: ask for one topic or one check","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"More parcels than one answer reads; nothing was checked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Investigation"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"}}}},"503":{"description":"Not readable now: every check failed, or the error envelope. Never a negative.","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/v1/catalog":{"get":{"operationId":"catalog","summary":"The agent directory: the root, or any node by ?path=","description":"GET https://tonttikartta.fi/api/v1/catalog[/<path>] (or ?path=<path>) — the directory of map views, layers (with legend meanings), municipalities (their own planning pages and map viewers), official link kinds and the MCP tools, one small JSON node per path with children[]: view, view/noise, layer/syke_noise, municipality, municipality/049, links, tool. lang = fi (default), en or sv.","parameters":[{"name":"path","in":"query","description":"Optional node path, e.g. view/noise, municipality/page/2 or tool/map/sketch; omit for the root.","schema":{"type":"string","maxLength":96}},{"name":"lang","in":"query","schema":{"type":"string","enum":["fi","en","sv"],"default":"fi"}}],"responses":{"200":{"description":"A directory node.","headers":{"ETag":{"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogNode"}}}},"304":{"description":"Not modified."}}}},"/api/v1/catalog/{namespace}":{"get":{"operationId":"catalogList","summary":"A directory list: view, layer, municipality, links, tool, place or map","description":"GET https://tonttikartta.fi/api/v1/catalog[/<path>] (or ?path=<path>) — the directory of map views, layers (with legend meanings), municipalities (their own planning pages and map viewers), official link kinds and the MCP tools, one small JSON node per path with children[]: view, view/noise, layer/syke_noise, municipality, municipality/049, links, tool. lang = fi (default), en or sv.","parameters":[{"name":"namespace","in":"path","required":true,"schema":{"type":"string","enum":["view","layer","municipality","links","tool","place","map"]}},{"name":"lang","in":"query","schema":{"type":"string","enum":["fi","en","sv"],"default":"fi"}}],"responses":{"200":{"description":"A directory node.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogNode"}}}},"404":{"description":"Unknown path; children names the root."}}}},"/api/v1/catalog/{namespace}/{id}":{"get":{"operationId":"catalogNode","summary":"One directory node: a view, a layer and its legend, a municipality and its official links, or a tool","description":"GET https://tonttikartta.fi/api/v1/catalog[/<path>] (or ?path=<path>) — the directory of map views, layers (with legend meanings), municipalities (their own planning pages and map viewers), official link kinds and the MCP tools, one small JSON node per path with children[]: view, view/noise, layer/syke_noise, municipality, municipality/049, links, tool. lang = fi (default), en or sv.","parameters":[{"name":"namespace","in":"path","required":true,"schema":{"type":"string","enum":["view","layer","municipality","tool"]}},{"name":"id","in":"path","required":true,"description":"A view id (noise), layer id (syke_noise), municipality code or name (049, Espoo) or tool path (place.report).","schema":{"type":"string","maxLength":64}},{"name":"lang","in":"query","schema":{"type":"string","enum":["fi","en","sv"],"default":"fi"}}],"responses":{"200":{"description":"A directory node.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogNode"}}}},"404":{"description":"Unknown path; children names the root."}}}}},"components":{"schemas":{"Notice":{"type":"object","required":["message","service_status","authoritative","disclaimer"],"properties":{"message":{"type":"string","description":"One grounding sentence: source-grounded, not authoritative; points at the agent guide and asks for the map link to be offered. Keep it with the facts.","examples":["Summaries grounded in official registers and other identified sources; not authoritative. Agent guide: https://tonttikartta.fi/llms.txt. Offer map_url so the person can explore the property on the map.","Yhteenvedot pohjautuvat virallisiin rekistereihin ja muihin nimettyihin lähteisiin, mutta Tonttikartta ei ole virallinen tietolähde. Agenttiohje: https://tonttikartta.fi/llms.txt. Tarjoa map_url, jotta käyttäjä voi tutkia kiinteistöä kartalla."]},"service_status":{"type":"string","const":"beta","description":"A stable machine value naming the service’s status. Changed from \"experimental_beta\" to \"beta\" on 2026-09-28; the field itself and authoritative:false are unchanged."},"authoritative":{"type":"boolean","const":false},"disclaimer":{"type":"object","required":["version","text","short"],"properties":{"version":{"type":"string","const":"3"},"text":{"type":"string","enum":["Tonttikartta ei ole virallinen tietolähde. Yhteenvedot perustuvat virallisiin rekistereihin ja muihin erikseen nimettyihin lähteisiin, mutta Tonttikartan tietojenkäsittelyssä, kohdistuksissa ja tulkinnoissa voi olla virheitä, puutteita tai vanhentuneita tietoja. Yhteenveto ei ole virallinen kiinteistörekisteriote eikä vahvista omistusta, kiinteistön rajoja, rakennusoikeutta tai sallittua käyttöä. Varmista tiedot asianomaisen viranomaisen ajantasaisista rekistereistä ennen päätöksentekoa.","Tonttikartta is not an official or authoritative source. Its summaries are grounded in official registers and other explicitly identified sources, but Tonttikartta’s processing, matching and interpretation may contain errors, omissions or outdated information. This is not an official cadastral extract and does not establish ownership, legal boundaries, building rights or permitted use. Verify information against the relevant authority’s current records before making decisions."]},"short":{"type":"string","description":"One-sentence display form. A short answer may carry this instead of text, with the caveats for the facts it states and a canonical_url citation.","enum":["Ei virallinen tietolähde: varmista päätösten kannalta olennaiset tiedot viranomaiselta.","Not an official source: verify decision-relevant information with the relevant authority."]}}}}},"Caveat":{"type":"object","required":["code","message","fields"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"fields":{"type":"array","items":{"type":"string"}}}},"Street":{"type":"object","description":"Present with reason street_without_number: the street the query names, from the address directory.","required":["name","url","municipality_count","municipalities"],"properties":{"name":{"type":"string"},"url":{"type":"string","format":"uri","description":"The street’s /osoitteet/ page (the municipality’s, when the query named one of a street in several)."},"municipality_count":{"type":"integer"},"municipalities":{"type":"array","description":"At most 10; municipality_count is the full number.","items":{"type":"object","required":["name","url"],"properties":{"name":{"type":"string"},"url":{"type":"string","format":"uri"}}}},"house_number_count":{"type":"integer","description":"Only when the street is in one municipality."},"house_numbers":{"type":"array","description":"At most 40, only when the street is in one municipality.","items":{"type":"string"}}}},"NextStep":{"type":"object","required":["action","url","note"],"properties":{"action":{"type":"string","description":"A short machine-readable verb, e.g. add_selector, open_search_link, browse_municipalities, browse_municipality, browse_addresses, open_address_page, open_street_page, retry_with_municipality, retry_with_house_number."},"url":{"type":"string","description":"A full absolute URL to open. For the too_many_matches template entry this is the ORIGINAL query URL, not a corrected one — the note explains what to add by hand.","format":"uri"},"note":{"type":"string","description":"One sentence explaining the step, in the response’s own language."}}},"Location":{"type":"object","required":["lat","lon"],"properties":{"lat":{"type":"number","minimum":-90,"maximum":90},"lon":{"type":"number","minimum":-180,"maximum":180}},"description":"Representative location, not an entrance or a legal boundary."},"Source":{"type":"object","required":["id","label","url","release_id","source_date","kind"],"properties":{"id":{"type":"string"},"label":{"type":"string"},"url":{"type":"string","format":"uri"},"release_id":{"type":"string"},"source_date":{"type":["string","null"],"description":"A date from the source, not the dataset or snapshot date (release_id identifies the snapshot). What it measures is named by source_date_basis; null means unknown."},"source_date_basis":{"type":["string","null"],"enum":["record_modified","record_start","register_state","valid_from","published",null],"description":"What source_date means. record_modified: newest change among this property’s own records in the source, so properties in the same release can differ. register_state: register state date of the whole delivery. valid_from: date the administrative division took effect. record_start: start date of the source record. published: Tonttikartta publication date. null: basis not stated."},"kind":{"type":"string","enum":["source","derived"]}}},"Buildings":{"type":"object","required":["coverage","count","main_types","gross_floor_area_m2"],"properties":{"coverage":{"type":"string","enum":["complete","partial","unavailable"],"description":"Best-effort building-register coverage (registered buildings only; floor area may be unknown for some)."},"count":{"type":["integer","null"],"minimum":0},"main_types":{"type":"array","maxItems":3,"items":{"type":"string"}},"gross_floor_area_m2":{"type":["number","null"],"minimum":0}}},"View":{"type":"object","required":["id","title","meaning","status"],"properties":{"id":{"type":"string","enum":["noise","kaava","regional_plan","planning_projects","nature","flood","heritage","soil","groundwater","lake_depth","population","population_change","postal","aerial","historical","terrain_3d","construction","identifiers"]},"title":{"type":"string"},"meaning":{"type":"string"},"status":{"type":"string","enum":["present","not_mapped","unknown"],"description":"present: mapped here or nationwide; not_mapped: checked, nothing here; unknown: not checked."}}},"OfficialLinks":{"type":"object","required":["note","municipality","links"],"description":"Navigation destinations on the authorities’ own services, not data.","properties":{"note":{"type":"string"},"municipality":{"type":"string"},"links":{"type":"array","items":{"type":"object","required":["kind","label","url"],"properties":{"kind":{"type":"string","description":"municipal_viewer, municipal_planning, municipal_projects, municipal_map, karttapaikka_property …"},"label":{"type":"string"},"url":{"type":"string","format":"uri"}}}}}},"Investigation":{"type":"object","required":["status","schema","property_id","checks"],"properties":{"status":{"type":"string"},"schema":{"type":"string","const":"tonttikartta.investigation.v1"},"property_id":{"type":"string"},"topic":{"type":"string"},"subject":{"type":"object"},"summary":{"type":"object","description":"Check ids by state."},"check_states":{"type":"object","description":"What each state means."},"checks":{"type":"array","items":{"type":"object","required":["id","state"],"properties":{"id":{"type":"string"},"topic":{"type":"string"},"title":{"type":"string"},"state":{"type":"string","enum":["checked_findings","checked_no_findings","incomplete_coverage","unavailable","failed","not_checked"]},"scope":{"type":"object"},"negative_means":{"type":"string"},"findings":{"type":"array","items":{"type":"object"}},"findings_total":{"type":"integer"},"next_offset":{"type":["integer","null"]},"unknowns":{"type":"array","items":{"type":"string"}},"evidence":{"type":"array","items":{"type":"object"}},"verify":{"type":"array","items":{"type":"object"}}}}},"not_covered":{"type":"array","items":{"type":"object"}},"message":{"type":"string"}}},"MapResult":{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["matched","ambiguous","not_found","unresolved"]},"property_id":{"type":"string","pattern":"^[0-9]{14}$"},"label":{"type":"string"},"open_url":{"type":"string","format":"uri","description":"The map with the view on. Give it to the person."},"view_url":{"type":"string","format":"uri","description":"The same view as a short link (/kiinteisto/<id>?view=<id>) that redirects to open_url; absent with a background override."},"views":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"}}}},"background":{"type":"string"},"legend":{"type":"array","description":"What the colours mean (categories, never this property’s values).","items":{"type":"object","properties":{"layer":{"type":"string"},"title":{"type":"string"},"classes":{"type":"array","items":{"type":"string"}}}}},"official_links":{"$ref":"#/components/schemas/OfficialLinks"},"canonical_url":{"type":"string","format":"uri"},"candidates":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"property_id":{"type":"string"},"canonical_url":{"type":"string","format":"uri"}}}},"next":{"type":"string"}}},"CatalogNode":{"type":"object","required":["status","path","children"],"properties":{"status":{"type":"string"},"path":{"type":"string"},"children":{"type":"array","items":{"type":"string"}}},"additionalProperties":true},"Property":{"type":"object","required":["kind","label","municipality","location","sources","map_url","caveats","cadastral_id","property_id","addresses","address_count","mapped_area_m2","parcel_count","buildings","canonical_url"],"properties":{"kind":{"const":"property"},"label":{"type":"string","description":"Readable name: primary address, municipality and the cadastral identifier in parentheses, e.g. \"Otakallio 2, Espoo (49-10-12-9)\"; falls back to municipality plus identifier, or the identifier alone."},"municipality":{"type":"string"},"location":{"$ref":"#/components/schemas/Location"},"sources":{"type":"array","items":{"$ref":"#/components/schemas/Source"}},"map_url":{"type":"string","format":"uri"},"caveats":{"type":"array","items":{"$ref":"#/components/schemas/Caveat"}},"views":{"type":"array","description":"Present on a matched property: every map view with its status.","items":{"$ref":"#/components/schemas/View"}},"official_links":{"$ref":"#/components/schemas/OfficialLinks","description":"Present on a matched property."},"cadastral_id":{"type":"string","description":"The short cadastral identifier, e.g. 49-10-12-9, without address or municipality."},"property_id":{"type":"string","pattern":"^[0-9]{14}$"},"addresses":{"type":"array","maxItems":3,"items":{"type":"string"}},"address_count":{"type":"integer","minimum":0},"mapped_area_m2":{"type":["number","null"],"minimum":0},"parcel_count":{"type":"integer","minimum":0},"buildings":{"$ref":"#/components/schemas/Buildings"},"canonical_url":{"type":"string","format":"uri"}}},"Place":{"type":"object","required":["kind","label","municipality","location","sources","map_url","caveats"],"properties":{"kind":{"const":"place"},"label":{"type":"string"},"municipality":{"type":"string"},"location":{"$ref":"#/components/schemas/Location"},"sources":{"type":"array","items":{"$ref":"#/components/schemas/Source"}},"map_url":{"type":"string","format":"uri"},"caveats":{"type":"array","items":{"$ref":"#/components/schemas/Caveat"}}},"description":"A named place. Please do not interpret it as a property match."},"Result":{"type":"object","required":["status","candidates","caveats"],"properties":{"status":{"type":"string","enum":["matched","ambiguous","not_found","unresolved"]},"candidates":{"type":"array","maxItems":3,"items":{"oneOf":[{"$ref":"#/components/schemas/Property"},{"$ref":"#/components/schemas/Place"}]}},"report":{"$ref":"#/components/schemas/Report","description":"Present only with include=report and a single matched property."},"caveats":{"type":"array","items":{"$ref":"#/components/schemas/Caveat"}},"reason":{"type":"string","description":"Present for some unresolved and ambiguous results. too_many_matches: more than three properties share the address. street_without_number: the query was a street name with no house number; see street. boundary: a coordinate on a shared boundary."},"street":{"$ref":"#/components/schemas/Street"},"map_url":{"type":"string","format":"uri"},"next_steps":{"type":"array","description":"Present only for status not_found or unresolved. See x-next-steps on the operation.","items":{"$ref":"#/components/schemas/NextStep"}}}},"Report":{"type":"object","description":"A compact report derived from the matched property summary, with no further data. not_included names the sections deliberately left out; their absence here is not absence on the property.","required":["version","property_id","municipality","area","summary_text","mapped_area_m2","parcel_count","address","address_count","buildings","links","not_included","sources","caveats"],"properties":{"version":{"type":"integer","const":1},"property_id":{"type":"string","pattern":"^[0-9]{14}$"},"municipality":{"type":["string","null"]},"area":{"type":"object","required":["code","kind","kind_label"],"description":"The cadastral location area (the second part of the property ID) and its kind; its name is not included.","properties":{"code":{"type":"string"},"kind":{"type":"string","enum":["neighborhood","village","register_area","public_area","other"]},"kind_label":{"type":"string"}}},"summary_text":{"type":"object","required":["fi","en"],"description":"Two to three sentences generated deterministically from a template using only the facts in this report; a sentence is omitted when its facts are unknown. Not an evaluation and says nothing about plans or building rights.","properties":{"fi":{"type":"string"},"en":{"type":"string"}}},"mapped_area_m2":{"type":["number","null"],"minimum":0},"parcel_count":{"type":"integer","minimum":0},"address":{"type":["string","null"]},"address_count":{"type":"integer","minimum":0},"buildings":{"type":"object","required":["coverage","count","main_types","gross_floor_area_m2"],"properties":{"coverage":{"type":"string","enum":["complete","partial","unavailable"],"description":"Best-effort building-register coverage (registered buildings only; floor area may be unknown for some)."},"count":{"type":["integer","null"],"minimum":0},"main_types":{"type":"array","maxItems":3,"items":{"type":"string"}},"gross_floor_area_m2":{"type":["number","null"],"minimum":0}}},"links":{"type":"object","required":["map_url","canonical_url","karttapaikka_url","registry_extract_url"],"properties":{"map_url":{"type":"string","format":"uri"},"canonical_url":{"type":"string","format":"uri"},"karttapaikka_url":{"type":"string","format":"uri"},"registry_extract_url":{"type":"string","format":"uri"}}},"not_included":{"type":"object","required":["sections","note"],"properties":{"sections":{"type":"array","items":{"type":"string","enum":["neighbourhood_name","land_use_plans","protected_areas","water","environment","nearby_planning_projects","building_records"]}},"note":{"type":"string"}}},"sources":{"type":"array","items":{"$ref":"#/components/schemas/Source"}},"caveats":{"type":"array","items":{"$ref":"#/components/schemas/Caveat"}}}},"Error":{"allOf":[{"$ref":"#/components/schemas/Notice"},{"type":"object","required":["error","caveats"],"properties":{"error":{"type":"string"},"caveats":{"type":"array","items":{"$ref":"#/components/schemas/Caveat"}},"next_steps":{"type":"array","description":"Present for error invalid_request, naming which validation rule failed. See x-next-steps on the operation.","items":{"$ref":"#/components/schemas/NextStep"}}}}]}}}}