ValidateResponse
Successful validation **or** centroid-fallback. The canonical form **always lives in `standardized`**. When value-changing corrections were applied, the response carries `status: "corrected"` with a human-readable `corrections` list, and `standardized` holds the corrected canonical form. When neither was attainable but SEG produced a centroid, the response carries `partial_match: true` with `lat`/`lng` set; `standardized` then echoes the caller's input for every component that could not be verified — only the components confirmed in `match_components` are reference data. All responses carry the match-quality contract (`match_type`, `match_score`, `match_components`, `input_corrected`).
Properties
| Name | Type | Description |
|---|---|---|
| standardized | object | |
| corrected | object | Reserved legacy key — not emitted. The corrected canonical form is returned in `standardized` (with `status: "corrected"` and the `corrections` list); read that instead. |
| status | string | `verified` = the street and house number matched exactly; postcode/locality repairs derived unambiguously from the matched premise may still appear in `corrections` (with `postcode_corrected: true` an |
| confidence | number | How strongly the match AND the returned coordinate are evidenced, 0–1. It is not the validity verdict: whether the address is valid is given by `status` (verified / corrected), `deliverable` and `conf |
| confidence_level | string | Plain confidence grade for bulk-CSV workflows. `high` = confirmed exact, `medium` = confirmed with safe corrections, `low` = partial/approximate (e.g. house number not found, or a locality/admin-area |
| corrections | array | Human-readable list of corrected input fields (e.g. `["Postal code", "City"]`). `"House number"` appears when the house number in the answer differs from the one you sent because the building was renu |
| accuracy_type | object | |
| point_coordinate | boolean | `true` when the coordinate identifies one address (`rooftop` or `arrival_point`), `false` for any derived/area tier. Branch on this rather than on `accuracy_type` literals — it stays correct when new |
| match_type | object | |
| match_score | number | |
| match_components | object | |
| input_corrected | boolean | |
| reasons | array | Present on `partial_match` responses: why full verification failed (e.g. `street_not_matched`, `house_number_unconfirmed`). The same codes appear on 404/422 error bodies. |
| truncated | boolean | Present (always `true`) when the search was cut short by its time limit; `reasons` then includes `search_budget_exhausted`. United States only on 200 answers: the answer is the best one found in time, |
| provided_components | object | **Always returned.** Echoes which components the caller actually supplied (non-empty after parsing), keyed identically to `match_components` (`house_number`, `street`, `city`, `zip`, `state`). Pair it |
| partial_match | boolean | `true` when the address could not be fully verified but a coordinate was still produced — at street level (`reasons` `house_number_unconfirmed` / `house_number_not_found`; pin `street_interpolated` / |
| nearby_house_numbers | object | Portugal only, optional. The street was matched but the house number you sent is not in the reference data (`street_centroid`, or `street_interpolated` between the nearest same-parity numbers with `co |
| street_postcodes | array | Netherlands only, optional. Present only on STREET-LEVEL answers (`accuracy_type` `street_centroid`, `street_segment_centroid` or `street_interpolated`): the postcodes the matched street covers, each |
| street_postcodes_total | integer | With `street_postcodes`, how many postcodes the street covers (not capped). |
| street_postcodes_truncated | boolean | With `street_postcodes`, `true` when the street covers more postcodes than are listed. |
| postcode_range | object | Netherlands only, optional. Sent with `street_postcodes` when the street covers MORE THAN ONE postcode: the lowest and highest postcode over the whole street (an outer bound, not a continuous run; `st |
| approximate | boolean | Portugal only, optional. `true` when the point is a town / area centre standing in for the address: a city- or neighbourhood-only request (reason `street_missing`), a street that could not be placed ( |
| resolved_level | object | Portugal only, with `approximate: true`: which kind of place the point stands for (`locality`, `postal_town`, `municipality`, `district`, `lisbon_parish`). |
| resolved_name | string | Portugal only, with `approximate: true`: the name of that place as spelled in the reference data (e.g. `Cascais`; `Lisboa` for a Lisbon neighbourhood). |
| enrichment | object | Free geographic enrichment, attached automatically (no extra charge, no request parameter) for eighteen countries — USA, Canada, Germany, Austria, Switzerland, France, United Kingdom, Belgium, Spain, |
| match_type_legacy | string | Retained for backward compatibility. New clients should use `match_type`. |
| match_score_legacy | string | Retained for backward compatibility. Human-readable label (e.g. `"Perfect match"`, `"Partial match (street only)"`). |
| suggestions | array | Ranked near-miss candidates (score ≥ 0.5, below the correction threshold). Appears on 200 `partial_match` responses where the street could not be matched — the closest real streets in the caller's pos |
| alternative_matches | array | Reserved — not currently emitted (disabled pending an index). Planned behaviour: same street + house number in a different state, USA / CAN `verified` matches, up to 5 items. |
| lat | number | |
| lng | number | |
| arrival_point | object | Entrance / access coordinate (arrival point) of the matched premise, returned beside the served coordinate on house-number-level matches when the reference row carries one. With `accuracy_type: roofto |
| landmark_used | object | Present ONLY with `accuracy_type: landmark_proximity` (India). The address itself resolved no further than its postcode/locality, so the served coordinate was taken from a landmark named in the input. |
| house_number_not_found | boolean | The house number you sent is not on file for the matched street — either flagged by the matcher itself, or caught by the input-vs-returned comparison (a fallback row carried a different number). stand |
| postcode_corrected | boolean | |
| deliverable | boolean | `true` only when the address verified confidently against the reference data — `confidence_level` high or medium AND not a partial/centroid fallback AND a premise is identified (a house number you sup |
| hno_range_verified | boolean | The house number was confirmed against an official numbering RANGE for the street, not an individual premise row (interpolated-tier evidence, e.g. Brazil's official street ranges). Caps `confidence_le |
| parsed | object | Always returned. For single-line `input`: the parser's field breakdown (informational echo; lowercase). For fielded input: an echo of the supplied fields. Keys include `street`, `house_number`, `city` |
| match_details | object | Per-component flags from the DB lookup — keys `street`, `house_number`, `city`, `postcode` (not `zip`), `state` (when applicable), plus a duplicated `postcode_corrected` boolean. Unlike `match_compone |
| unverified_fields | array | Components echoed from the caller's input that reference data could NOT confirm (e.g. `["unit"]` — reference rows carry no unit data). The match itself still stands; treat the listed components as unv |
| unit_verified | boolean | Spain, Latvia and Singapore only. Present and `true` only when the sub-building unit you sent is listed for the matched building. Spain: staircase / floor / door (e.g. `Esc. 1, 1º B`) listed for the m |
| former_address | object | Latvia only. The address you sent is a FORMER address of the matched building in the State Address Register: the street was renamed, the building was renumbered, or a named property got a street addre |
| tenant_name_matched | string | Singapore only. The tenant or shop name (e.g. `MCDONALD'S`) that text in your input matched at the returned building, exactly as we hold it. The name is not part of the standardized address and never |
| building_name_matched | string | Singapore only. The building name that text in your input matched at the returned building, when it differs from `standardized.building_name` (another name the same building is known by). Absent when |
| unit_check | string | Spain, Latvia and Singapore only. What the reference unit list could say about the unit you sent. `verified`: listed at this building. `not_in_list`: the building has a unit list and yours is not in i |
| postcode_unverified | boolean | The postcode was echoed from the caller, never read from a reference row. |
| locality_from_postcode | boolean | The city was derived from the postcode rather than typed by the caller. |
| city_backfilled_from_postcode | boolean | No city was sent; the one in `standardized.city` was derived from the postcode (or, Netherlands, from the postcode + house number). A disclosure, not a correction. Absent otherwise. |
| street_backfilled_from_postcode | boolean | Netherlands: no street was sent; the street in `standardized.street` is the one that holds the house number at the postcode sent. A disclosure, not a correction (`corrections` stays empty). Absent oth |
| matched_via_alias | boolean | The locality matched through a recognised alias (e.g. a USPS alternate city name) rather than the primary name. `usps_city` and `locality_note` disclose the specifics where applicable. |
| usps_city | string | USA: the USPS-preferred city name when it differs from the input. |
| locality_note | string | Human-readable note on how the locality was matched (alias / municipality disclosure). |
| city_mismatch_ignored | boolean | The typed city disagreed with the matched row but was overridden by stronger evidence (street + postcode); disclosed rather than silently dropped. |
| postcode_supplied | string | Postcode-repair forensics — the postcode the caller sent. Also present on its own (without `postcode_suggested`) when the reasons carry `postcode_not_matched` (Sweden): the typed postcode matched noth |
| postcode_suggested | string | Postcode-repair forensics — the reference postcode for the matched premise, when it differs from `postcode_supplied`. |
| postcode_incoherent | boolean | `true` when the supplied postcode does not fit the matched street/locality at all (rather than being a near-miss). |
| postcode_status | string | Malaysia: whether the postcode is held with addresses (`stocked`), real but with no addresses on file (`valid_not_stocked` — see the matching reason code), or unknown. Companion fields `postcode_place |
| accuracy_label | string | Human-readable form of the served tier (e.g. `"postcode centroid"`). Display-only; branch on `accuracy_type` / `point_coordinate`. |
| non_deliverable_type | string | Classification of non-deliverable input (e.g. `po_box`). Appears on the 400 rejection body, or on the 200 body under `iso20022: true`. Never set on a verified Canadian PO Box (see `address_type`). |
| address_type | string | Present when the answer is not a street address. Today only `po_box`, in Canada and Singapore. Canada: the input is a PO Box, matched against the reference lock-box ranges of Canada Post installations |
| address_class | string | Present when the matched address is real but not a postal delivery point. Today only `nonpostal` (Netherlands): the official BAG register holds the address exactly as you sent it (e.g. a wharf cellar |
| address_note | string | Plain-language explanation that accompanies `address_class`, e.g. "This address exists in the official BAG register but has no postcode; it is not a postal delivery point." |
| po_box | object | Canada, with `address_type: po_box`. The box: `number`, `station_type` (`STN`, `SUCC`, `RPO`, `PO`, ...), `station_name` (e.g. `A`, `CENTRAL`, `MAIN`), `station` (type and name together, empty for a p |
| po_box_alternatives | array | Canada, partial PO Box answers only (`po_box_ambiguous`, `po_box_postcode_town_mismatch`, and `po_box_not_in_range` when the town you sent is not the postal code's): the post offices whose ranges hold |
| verdict_note | string | Plain-language note on a component listed in `unverified_fields`, e.g. a Canadian PO Box whose station you named differently from the reference data (`po_box_station`). |
| uprn_match_m | number | UK only. Distance in metres between the Royal Mail PAF delivery point and the matched OS Open UPRN coordinate (0.0 is a real and best value). Present when extended UK fields are enabled (on by default |
| credits_remaining | integer | After keyed validation. |
| validation_credits_remaining | integer | |
| geocode_credits_remaining | integer | |
| key_accepted | boolean |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://artifacts.apis.io/acuris-geo-com/json-schema/acuris-geo-com-validate-response-schema.json",
"title": "ValidateResponse",
"description": "Successful validation **or** centroid-fallback. The canonical form\n**always lives in `standardized`**. When value-changing corrections were\napplied, the response carries `status: \"corrected\"` with a\nhuman-readable `corrections` list, and `standardized` holds the\ncorrected canonical form. When neither was attainable but SEG produced a\ncentroid, the response carries `partial_match: true` with `lat`/`lng`\nset; `standardized` then echoes the caller's input for every component\nthat could not be verified — only the components confirmed in\n`match_components` are reference data. All responses carry the\nmatch-quality contract (`match_type`, `match_score`, `match_components`,\n`input_corrected`).\n",
"x-generated": "2026-10-30",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/acuris-geo-com-openapi.json#/components/schemas/ValidateResponse",
"type": "object",
"additionalProperties": true,
"required": [
"match_type",
"match_score",
"match_components",
"input_corrected",
"accuracy_type"
],
"properties": {
"standardized": {
"$ref": "#/$defs/StandardizedAddress"
},
"corrected": {
"deprecated": true,
"description": "Reserved legacy key — not emitted. The corrected canonical form is returned in `standardized` (with `status: \"corrected\"` and the `corrections` list); read that instead.",
"allOf": [
{
"$ref": "#/$defs/StandardizedAddress"
}
]
},
"status": {
"type": "string",
"enum": [
"verified",
"corrected"
],
"description": "`verified` = the street and house number matched exactly; postcode/locality repairs derived unambiguously from the matched premise may still appear in `corrections` (with `postcode_corrected: true` and `confidence_level` capped at `medium`) without demoting status. `corrected` = the street or city itself required a value-changing correction (fuzzy match above the 0.85 similarity threshold, or standardized fields). Omitted (with `partial_match: true`) when the address could not be verified. Standardization is never a correction: for a city-state (Singapore, Monaco) the city implied by the country — filled in when you omit it, or typed as an alias such as `SG` / `Republic of Singapore` — does not appear in `corrections` and does not make the status `corrected`; nor do Singapore street-type abbreviations (`Jln` = Jalan, `Bt` = Bukit, `Ave`, `Cres`, `Cl`, …). A genuinely different city or a misspelt street is still reported."
},
"confidence": {
"type": "number",
"format": "float",
"description": "How strongly the match AND the returned coordinate are evidenced, 0–1. It is not the validity verdict: whether the address is valid is given by `status` (verified / corrected), `deliverable` and `confidence_level`. The number starts at 1.0 for a verified match (the similarity score, 0.85–1.0, for a corrected one) and is then capped by the precision of the coordinate: every `accuracy_type` has a ceiling — e.g. `rooftop` / `arrival_point` 1.0, `street_interpolated` 0.9, `street_centroid` 0.75, `postcode_centroid` 0.6, `locality_centroid` 0.5, `admin_centroid` 0.4, Canadian `po_box` 0.9 and `po_box_postcode_area` 0.5 — so a verified address with a coarse pin carries a lower number. Exception: when a house number you supplied was confirmed on a premise row, the coordinate ceiling is not applied (the address itself is proved; `accuracy_type` still states the pin). The number is also capped at match_score (0.2–0.6) whenever a street or house number you PROVIDED could not be confirmed against the matched record (e.g. the match fell back to a different street, or the house number is not on file); confidence_level is demoted to `low` in those cases."
},
"confidence_level": {
"type": "string",
"enum": [
"high",
"medium",
"low",
"none"
],
"description": "Plain confidence grade for bulk-CSV workflows. `high` = confirmed exact, `medium` = confirmed with safe corrections, `low` = partial/approximate (e.g. house number not found, or a locality/admin-area centroid only), `none` = no match. The grade of a confirmed address does not depend on the coordinate: an address the register holds without a coordinate (derived pin, `point_coordinate: false`) is still `high`."
},
"corrections": {
"type": "array",
"description": "Human-readable list of corrected input fields (e.g. `[\"Postal code\", \"City\"]`). `\"House number\"` appears when the house number in the answer differs from the one you sent because the building was renumbered (Latvia, see `former_address`).",
"items": {
"type": "string"
}
},
"accuracy_type": {
"$ref": "#/$defs/AccuracyType"
},
"point_coordinate": {
"type": "boolean",
"description": "`true` when the coordinate identifies one address (`rooftop` or `arrival_point`), `false` for any derived/area tier. Branch on this rather than on `accuracy_type` literals — it stays correct when new tiers are added. Emitted on matches and street-tier partials; omitted on postcode/locality/admin-centroid fallbacks."
},
"match_type": {
"$ref": "#/$defs/MatchType"
},
"match_score": {
"type": "number",
"format": "float",
"minimum": 0,
"maximum": 1
},
"match_components": {
"$ref": "#/$defs/MatchComponents"
},
"input_corrected": {
"type": "boolean"
},
"reasons": {
"type": "array",
"items": {
"$ref": "#/$defs/FailureReason"
},
"description": "Present on `partial_match` responses: why full verification failed (e.g. `street_not_matched`, `house_number_unconfirmed`). The same codes appear on 404/422 error bodies."
},
"truncated": {
"type": "boolean",
"description": "Present (always `true`) when the search was cut short by its time limit; `reasons` then includes `search_budget_exhausted`. United States only on 200 answers: the answer is the best one found in time, and a finer pin may exist. Absent otherwise."
},
"provided_components": {
"$ref": "#/$defs/MatchComponents",
"description": "**Always returned.** Echoes which components the caller actually supplied (non-empty after parsing), keyed identically to `match_components` (`house_number`, `street`, `city`, `zip`, `state`). Pair it with `match_components` field-by-field to tell \"not provided\" apart from \"provided but not matched\"."
},
"partial_match": {
"type": "boolean",
"description": "`true` when the address could not be fully verified but a coordinate was still\nproduced — at street level (`reasons` `house_number_unconfirmed` /\n`house_number_not_found`; pin `street_interpolated` / `street_centroid`) or via\nthe SEG cascade (postcode / locality / admin\ncentroid). Absent or `false` on full verified/corrected matches. The response\nstill carries `standardized`, but it echoes the caller's input for every\ncomponent that could not be verified (only the components confirmed in\n`match_components` are reference data) — treat `lat`/`lng` as the only\ntrustworthy output, and check `reasons` for what could not be pinned down.\n"
},
"nearby_house_numbers": {
"allOf": [
{
"$ref": "#/$defs/NearbyHouseNumbers"
}
],
"description": "Portugal only, optional. The street was matched but the house number you sent is not in the reference data (`street_centroid`, or `street_interpolated` between the nearest same-parity numbers with `confidence` 0.8 and `deliverable: false`); names the nearest numbers that are held. Sent with reason `house_number_not_in_reference`."
},
"street_postcodes": {
"type": "array",
"description": "Netherlands only, optional. Present only on STREET-LEVEL answers (`accuracy_type` `street_centroid`, `street_segment_centroid` or `street_interpolated`): the postcodes the matched street covers, each with its house-number range. Sorted by `house_number_from`, then `postcode`; at most 50 entries (see `street_postcodes_total` and `street_postcodes_truncated`). Ranges count numeric house numbers only; addresses whose number carries letters are not counted. Absent on rooftop and other house-number-level answers.",
"items": {
"type": "object",
"properties": {
"postcode": {
"type": "string"
},
"house_number_from": {
"type": "integer"
},
"house_number_to": {
"type": "integer"
},
"parity": {
"type": "string",
"enum": [
"odd",
"even",
"both"
],
"description": "Which side(s) of the street the postcode covers within that range."
}
}
}
},
"street_postcodes_total": {
"type": "integer",
"description": "With `street_postcodes`, how many postcodes the street covers (not capped)."
},
"street_postcodes_truncated": {
"type": "boolean",
"description": "With `street_postcodes`, `true` when the street covers more postcodes than are listed."
},
"postcode_range": {
"type": "object",
"description": "Netherlands only, optional. Sent with `street_postcodes` when the street covers MORE THAN ONE postcode: the lowest and highest postcode over the whole street (an outer bound, not a continuous run; `street_postcodes` lists the exact ones). In that case `standardized.postcode` carries `text` instead of a single postcode and `standardized.formatted_address` prints it. Check for this field before treating `standardized.postcode` as one postcode.",
"properties": {
"from": {
"type": "string"
},
"to": {
"type": "string"
},
"text": {
"type": "string"
}
}
},
"approximate": {
"type": "boolean",
"description": "Portugal only, optional. `true` when the point is a town / area centre standing in for the address: a city- or neighbourhood-only request (reason `street_missing`), a street that could not be placed (reason `fell_back_to_locality`), or an estate / urbanisation name sent with a town we can place (reasons `street_not_found` + `fell_back_to_locality`). `accuracy_type` is then `locality_centroid` or `admin_centroid` and `confidence` is 0.4 or lower. Absent otherwise."
},
"resolved_level": {
"allOf": [
{
"$ref": "#/$defs/ResolvedLevel"
}
],
"description": "Portugal only, with `approximate: true`: which kind of place the point stands for (`locality`, `postal_town`, `municipality`, `district`, `lisbon_parish`)."
},
"resolved_name": {
"type": "string",
"description": "Portugal only, with `approximate: true`: the name of that place as spelled in the reference data (e.g. `Cascais`; `Lisboa` for a Lisbon neighbourhood)."
},
"enrichment": {
"type": "object",
"description": "Free geographic enrichment, attached automatically (no extra\ncharge, no request parameter) for eighteen countries — USA,\nCanada, Germany, Austria, Switzerland, France, United Kingdom,\nBelgium, Spain, Portugal, Ireland, Netherlands, Finland, Sweden,\nLuxembourg, Japan, Singapore and Hong Kong — whenever the result\nis precise\nenough for a small-area lookup to be trustworthy (gates below).\nOmitted otherwise — never null, never an empty object. Fields whose\ngeography does not apply to the point are likewise omitted, never\nnull. Sub-fields are country-specific; every layer is public\ngovernment data.\n\n**When it appears**\n\n- USA, Canada, Germany, Austria, Switzerland and the France admin\n fields need a street-accurate coordinate (`rooftop`,\n `arrival_point`, `street_interpolated` or `street_centroid` —\n never a postcode/locality/admin centroid, where the point could\n fall in the wrong small area).\n- The France `building` block and the whole UK block need a\n premise-level match (`rooftop` / `arrival_point`). The UK block\n is keyed on the matched address's `uprn` (ONS National Statistics\n UPRN Lookup). Great Britain only — Northern Ireland (BT\n postcodes) carries no block because NI statistical geography is\n separately licensed.\n- Finland and the Netherlands are keyed on the validated postcode;\n the block describes the whole postal area (see its `scope`\n field), not the individual household.\n- Japan derives the 500 m JIS X 0410 mesh cell from the\n coordinate.\n- Singapore joins on the standardized block number + street; HDB\n blocks only, so a miss on private housing is normal.\n- Belgium is keyed on the matched row's 9-character Statbel\n statistical sector (also emitted as `statistical_sector`); a\n Belgian postcode spans several sectors, so a postcode-grain join\n would attribute one sector's figures to all of them.\n- Spain resolves the 10-digit census section (CUSEC) from the INE\n Callejero — municipality + street + house-number range + parity —\n and falls back to municipality level when no range covers the\n number. The block's `scope` says which tier answered\n (`census_section` or `municipality`); the parity filter is\n load-bearing and refuses rather than assigning the wrong side of\n the street.\n- Portugal, Ireland, Sweden, Luxembourg and Hong Kong are\n point-in-polygon on the returned coordinate, each returning a\n `statistical_area` block whose `code` is that country's finest\n published unit: Portugal BGRI subsecção (11 chars, block-level),\n Ireland CSO Small Area (2022), Sweden DeSO, Luxembourg commune\n (LAU2), Hong Kong Small Subunit Group.\n- Three Irish Small Areas genuinely overlap (slivers of 38–433 m²\n from 20 m generalisation). A point inside one is reported as\n ambiguous rather than silently resolved — picking the smallest\n area would cross an electoral-district boundary in Carlow.\n\nEnrichment can accompany `partial_match: true` when the inferred\ncoordinate still reaches a qualifying tier (e.g.\n`street_centroid`); postcode-, locality- and admin-centroid\nfallbacks never carry it.\n\nStatistical layers respect the publisher's disclosure control:\nwithheld values are absent from the block — an absent value is not\na zero (Swiss hectare grid, Dutch PC6, Japanese age bands) — and\nGerman Zensus grid counts are Cell-Key perturbed. Each such block\nsays so in its `note`.\n",
"additionalProperties": true,
"properties": {
"state_fips": {
"type": "string",
"description": "USA: 2-digit state FIPS."
},
"county_fips": {
"type": "string",
"description": "USA: 5-digit county FIPS (state+county)."
},
"census_tract": {
"type": "string",
"description": "USA: 11-digit census tract GEOID. Canada: CTUID (urban areas only)."
},
"block_group": {
"type": "string",
"description": "USA: 12-digit block-group GEOID."
},
"cbsa": {
"type": "object",
"description": "USA: Core-Based Statistical Area (metro/micro). Omitted (not null) outside any CBSA.",
"properties": {
"code": {
"type": "string"
},
"name": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"metro",
"micro"
]
}
}
},
"congressional_district": {
"type": "object",
"description": "USA: 119th-Congress district (`00` at-large; `98`/`99` non-voting).",
"properties": {
"state_fips": {
"type": "string"
},
"district": {
"type": "string"
},
"congress": {
"type": "integer"
}
}
},
"school_district": {
"type": "object",
"description": "USA: school district.",
"properties": {
"name": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"unified",
"elementary",
"secondary"
]
}
}
},
"dissemination_area": {
"type": "string",
"description": "Canada: 8-digit Dissemination Area UID (province + census division + DA)."
},
"province_code": {
"type": "string",
"description": "Canada: 2-digit province/territory (SGC)."
},
"census_division": {
"type": "string",
"description": "Canada: 4-digit census division UID."
},
"census_subdivision": {
"type": "object",
"description": "Canada: census subdivision (municipality).",
"properties": {
"code": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"cma_ca": {
"type": "object",
"description": "Canada: Census Metropolitan Area / Census Agglomeration. Omitted outside both.",
"properties": {
"code": {
"type": "string"
},
"name": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"metro",
"agglomeration"
]
}
}
},
"federal_electoral_district": {
"type": "object",
"description": "Canada: federal electoral district.",
"properties": {
"code": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"ags": {
"type": "string",
"description": "Germany: 8-digit Amtlicher Gemeindeschlüssel."
},
"ars": {
"type": "string",
"description": "Germany: 12-digit Amtlicher Regionalschlüssel."
},
"gemeinde": {
"type": "string",
"description": "Germany / Austria / Switzerland: municipality name."
},
"gemeinde_type": {
"type": "string",
"description": "Germany: municipality kind (Stadt, Gemeinde, Kreisfreie Stadt, …)."
},
"bundesland": {
"type": "object",
"description": "Germany / Austria: federal state.",
"properties": {
"code": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"kreis": {
"type": "object",
"description": "Germany: district.",
"properties": {
"code": {
"type": "string"
},
"name": {
"type": "string"
},
"type": {
"type": "string"
}
}
},
"nuts3": {
"type": "string",
"description": "Germany: NUTS-3 code (e.g. DEA12)."
},
"bundestagswahlkreis": {
"type": "object",
"description": "Germany: Bundestag electoral constituency.",
"properties": {
"number": {
"type": "integer"
},
"name": {
"type": "string"
}
}
},
"gkz": {
"type": "string",
"description": "Austria: 5-digit Gemeindekennziffer."
},
"politischer_bezirk": {
"type": "object",
"description": "Austria: political district.",
"properties": {
"code": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"regionalwahlkreis": {
"type": "object",
"description": "Austria: regional electoral constituency.",
"properties": {
"code": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"zaehlsprengel": {
"type": "string",
"description": "Austria: census enumeration district (smallest census unit)."
},
"bfs_nummer": {
"type": "string",
"description": "Switzerland: BFS municipality number."
},
"kanton": {
"type": "object",
"description": "Switzerland: canton — also the Nationalrat electoral constituency.",
"properties": {
"number": {
"type": "integer"
},
"code": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"bezirk": {
"type": "object",
"description": "Switzerland: district.",
"properties": {
"number": {
"type": "integer"
},
"name": {
"type": "string"
}
}
},
"grossregion": {
"type": "object",
"description": "Switzerland: major region = Swiss NUTS-2 unit.",
"properties": {
"number": {
"type": "integer"
},
"nuts2": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"sprachgebiet": {
"type": "object",
"description": "Switzerland: official language region — which language to address this customer in.",
"properties": {
"language": {
"type": "string",
"description": "ISO 639-1: de/fr/it/rm"
},
"name": {
"type": "string"
}
}
},
"degree_of_urbanisation": {
"type": "object",
"description": "Switzerland: Eurostat DEGURBA class.",
"properties": {
"code": {
"type": "string",
"enum": [
"city",
"town_suburb",
"rural"
]
},
"name": {
"type": "string"
}
}
},
"stadt_land": {
"type": "string",
"enum": [
"urban",
"intermediate",
"rural"
],
"description": "Switzerland: BFS Stadt/Land typology."
},
"gemeindetyp": {
"type": "object",
"description": "Switzerland: BFS municipality typology (9 classes); `class` is the 3-fold split.",
"properties": {
"code": {
"type": "string"
},
"class": {
"type": "string",
"enum": [
"urban",
"periurban",
"rural"
]
}
}
},
"agglomeration": {
"type": "object",
"description": "Switzerland: agglomeration.",
"properties": {
"code": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"arbeitsmarktregion": {
"type": "object",
"description": "Switzerland: labour-market region.",
"properties": {
"code": {
"type": "string"
},
"name": {
"type": "string"
},
"macro_region": {
"type": "string"
}
}
},
"insee": {
"type": "string",
"description": "France: INSEE commune code."
},
"commune": {
"type": "string",
"description": "France: commune name."
},
"departement": {
"type": "object",
"description": "France: département.",
"properties": {
"code": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"region": {
"type": "object",
"description": "France: région. UK: ONS region.",
"properties": {
"code": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"iris": {
"type": "object",
"description": "France: INSEE IRIS statistical district (metropolitan France).",
"properties": {
"code": {
"type": "string"
},
"name": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"residential",
"economic_activity",
"miscellaneous",
"whole_commune"
]
}
}
},
"building": {
"type": "object",
"description": "France, premise-level matches only: the IGN BD TOPO building the coordinate falls on (or the nearest within 8 m). `coord_verified` is true when the point is inside or ≤ 2 m from the footprint. `sub_unit_expected` is true when the building is multi-dwelling and the caller supplied no apartment/unit — the address is probably incomplete.",
"properties": {
"coord_verified": {
"type": "boolean"
},
"match_type": {
"type": "string",
"enum": [
"inside",
"nearest"
]
},
"distance_m": {
"type": "number"
},
"building_type": {
"type": "string",
"description": "e.g. Unspecified, Church, Castle, …"
},
"usage": {
"type": "string",
"description": "Residential, Commercial and services, Industrial, …"
},
"usage_secondary": {
"type": "string"
},
"height_m": {
"type": "number"
},
"floors": {
"type": "integer"
},
"dwellings": {
"type": "integer"
},
"is_multi_dwelling": {
"type": "boolean"
},
"rnb_id": {
"type": "string",
"description": "French national building registry (RNB) id."
},
"sub_unit_expected": {
"type": "boolean"
},
"source": {
"type": "string"
}
}
},
"output_area": {
"type": "string",
"description": "UK: 2021 Output Area code — finest ONS tier; output areas have no name."
},
"lsoa": {
"type": "object",
"description": "UK: Lower layer Super Output Area.",
"properties": {
"code": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"msoa": {
"type": "object",
"description": "UK: Middle layer Super Output Area.",
"properties": {
"code": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"local_authority": {
"type": "object",
"description": "UK: local authority district.",
"properties": {
"code": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"ward": {
"type": "object",
"description": "UK: electoral ward.",
"properties": {
"code": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"westminster_constituency": {
"type": "object",
"description": "UK: Westminster parliamentary constituency.",
"properties": {
"code": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"country": {
"type": "object",
"description": "UK: constituent country (England, Scotland, Wales).",
"properties": {
"code": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"police_force_area": {
"type": "object",
"description": "UK: police force area.",
"properties": {
"code": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"rural_urban": {
"type": "object",
"description": "UK: rural/urban classification.",
"properties": {
"code": {
"type": "string"
},
"description": {
"type": "string"
}
}
},
"demographics": {
"type": "object",
"description": "Germany: Zensus 2022 100 m grid — grid_cell, population, avg_age, avg_household_size, avg_net_rent_per_sqm, owner_occupier_pct, vacancy_pct, foreign_national_pct; small counts are Cell-Key perturbed (approximate). Switzerland: BFS STATPOP 100 m hectare grid — hectare_cell, population, buildings, dwellings; withheld cells are absent (an absent value is not a zero). Always carries `note` and `source`.",
"additionalProperties": true
},
"economy": {
"type": "object",
"description": "Switzerland: BFS STATENT hectare-grid workplace stats — hectare_cell, workplaces, employees_fte, note, source.",
"additionalProperties": true
},
"postal_area": {
"type": "object",
"description": "Finland: Statistics Finland PAAVO statistics for the whole postal area (`scope: postal_area`) — names (fi/sv), municipality_code, area_km2, centroid, population + age bands, mean/median incomes (personal and household), employment, jobs_total, households by type/tenure, dwellings, avg_dwelling_area_m2, summer_cottages. CC BY 4.0; `source` inside the block.",
"additionalProperties": true
},
"postcode_area": {
"type": "object",
"description": "Netherlands: CBS Kerncijfers for the six-character postcode (`scope: postcode6_area`) — inhabitants + age bands, households by type, dwellings, avg_home_value_eur, pct_owner_occupied, pct_rented, persons_on_benefits, avg_gas_m3, avg_electricity_kwh. CBS-suppressed cells are absent, never 0.",
"additionalProperties": true
},
"mesh_area": {
"type": "object",
"description": "Japan: 2020 Population Census on the 500 m JIS X 0410 mesh (`scope: mesh_500m`) — mesh_code, pop_total, pop_male, pop_female, pop_0_14, pop_15_64, pop_65_plus, households. Withheld age bands are absent.",
"additionalProperties": true
},
"hdb_block": {
"type": "object",
"description": "Singapore: HDB Property Information for the matched block (`scope: hdb_block`) — bldg_contract_town, max_floor_lvl, year_completed, residential / commercial / market_hawker / multistorey_carpark / precinct_pavilion / miscellaneous flags, total_dwelling_units and the full unit mix (units_1room … units_studio, rental_1room … rental_other). HDB blocks only — private housing has no block.",
"additionalProperties": true
},
"statistical_sector_area": {
"type": "object",
"description": "Belgium: Statbel figures for the address's statistical sector (`scope: statistical_sector`) — municipality NIS code and nam
# --- truncated at 32 KB (86 KB total) ---
# Full source: https://artifacts.apis.io/acuris-geo-com/json-schema/acuris-geo-com-validate-response-schema.json
Work with this as data
Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for schemas
4 MCP tools reach this
find_json_schemasBrowse and filter every JSON Schema in the catalog.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
curl "https://apis.io/api/v1/json-schemas/acuris-geo-com-validate-response"
curl "https://apis.io/api/v1/json-schemas?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.