{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/acuris-geo-com/json-schema/acuris-geo-com-forward-geocode-response-schema.json",
  "title": "ForwardGeocodeResponse",
  "description": "Response for `GET /geocode` and `POST /v1/geocode`. A strict whitelist of\ngeocoding-only fields — every key that can appear is listed below, and no\n`/validate` AV field (`status`, `deliverable`, `corrections`,\n`match_components`, `match_details`, `match_score`, `match_type`,\n`confidence`, `confidence_level`, `input_corrected`, `provided_components`,\n`parsed`, `partial_match`, `house_number_not_found`,\n`hno_range_verified`, `enrichment`, or any legacy variant) can appear\nhere. `lat`, `lng`, `accuracy_type`, `point_coordinate`, `standardized`\nand `formatted_address` are always present on a 200; the rest — including\nthe billing tail (`balance`/`validation_credits`/`free_remaining`/\n`key_class`/`free_daily_limit`) and the country-conditional fields\n(`attribution`, `uprn`, `digipin`, and for Portugal `reasons`,\n`nearby_house_numbers`, `approximate`, `resolved_level`,\n`resolved_name`) — are emitted only when applicable.\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/ForwardGeocodeResponse",
  "type": "object",
  "required": [
    "lat",
    "lng",
    "accuracy_type",
    "point_coordinate",
    "standardized",
    "formatted_address"
  ],
  "properties": {
    "lat": {
      "type": "number",
      "format": "float"
    },
    "lng": {
      "type": "number",
      "format": "float"
    },
    "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."
    },
    "standardized": {
      "type": "object",
      "description": "The matched address, componentized. Only the components the match actually resolved are present — an unresolved component (e.g. no `state` for a country that does not use one) is simply absent from the object, never emitted as `null` or `\"\"`.",
      "properties": {
        "street": {
          "type": "string"
        },
        "house_number": {
          "type": "string"
        },
        "postcode": {
          "type": "string"
        },
        "city": {
          "type": "string"
        },
        "state": {
          "type": "string"
        },
        "country": {
          "type": "string"
        },
        "dependent_locality": {
          "type": "string",
          "description": "Royal Mail PAF sub-element (GBR) / secondary locality line. Present only when the matched row carries one — e.g. the village between street and post town (\"10 HAYDEN LANE / CHELTENHAM\" would otherwise drop it, leaving two same-named streets in different villages indistinguishable)."
        },
        "double_dependent_locality": {
          "type": "string",
          "description": "Royal Mail PAF sub-element (GBR), finer than dependent_locality."
        },
        "dependent_street": {
          "type": "string",
          "description": "Royal Mail PAF sub-element (GBR) — a secondary street name."
        },
        "street_type": {
          "type": "string",
          "description": "Thoroughfare type carried in its own DB column rather than folded into `street` (e.g. Malaysia's UPU S42 type)."
        },
        "suburb": {
          "type": "string",
          "description": "NZ Post's line between street and post town (NZL). Omitted when it just repeats `city`."
        },
        "province": {
          "type": "string",
          "description": "Province sigla for the mandatory Poste Italiane locality line (ITA)."
        }
      }
    },
    "formatted_address": {
      "type": "string",
      "description": "Printable multi-line address block, e.g. for a shipping label."
    },
    "address_type": {
      "type": "string",
      "x-extensible-enum": [
        "po_box"
      ],
      "description": "Present when the answer is not a street address. Today only `po_box` (Canada and Singapore): a PO Box matched against the reference lock-box ranges (Canada) or the box register (Singapore), served with the `po_box` object as on `/validate`. Absent on street addresses."
    },
    "po_box": {
      "type": "object",
      "additionalProperties": true,
      "description": "With `address_type: po_box`: the box, as on `/validate`. Canada: `number`, `station_type`, `station_name`, `station`, `installation_area`, `municipality`, `box_range`. Singapore: `number`, `office`, `office_address`, and `kind: locked_bag` on a Locked Bag row (absent on a PO Box)."
    },
    "arrival_point": {
      "type": "object",
      "description": "Entrance / access coordinate of the matched premise. Present only when the matched row has one — house-number-level matches — and absent on street/locality fallbacks and when the served coordinate came from a POI. Never `null`; never derived from `lat`/`lng`.",
      "properties": {
        "lat": {
          "type": "number",
          "format": "float"
        },
        "lng": {
          "type": "number",
          "format": "float"
        }
      }
    },
    "input_modified": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Lowercase names of the components the engine changed from what the caller sent in a single-line `q=` input (e.g. `[\"street\", \"city\"]`), deduped. States a fact about the input, not a verdict about the address — it is not a re-admission of the forbidden `corrections` / `input_corrected` AV fields. Present only when non-empty: no key at all when nothing was modified, never an empty array."
    },
    "attribution": {
      "type": "string",
      "description": "GBR only."
    },
    "uprn": {
      "type": "string",
      "description": "GBR only. Ordnance Survey Unique Property Reference Number, present when known."
    },
    "digipin": {
      "type": "string",
      "description": "IND only. India Post DIGIPIN, a deterministic 10-character code derived purely from `lat`/`lng` (never from address existence — it says nothing about whether the address itself was verified). Present only when this deployment has DIGIPIN enabled; not guaranteed on every India response even from a deployment that has it enabled (omitted if no coordinate was resolved, or the encoder found none)."
    },
    "reasons": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/FailureReason"
      },
      "description": "PRT only, optional. Present when the point is not a confirmed house: what could not be pinned down (e.g. `house_number_unconfirmed` + `house_number_not_in_reference`, `below_verification_threshold` + `house_number_missing`, or `street_missing` / `fell_back_to_locality` on an approximate point). Same codes as `/validate`."
    },
    "nearby_house_numbers": {
      "allOf": [
        {
          "$ref": "#/$defs/NearbyHouseNumbers"
        }
      ],
      "description": "PRT only, optional. The house number you sent is not in the reference data; names the nearest same-parity numbers that are. The point is then `street_centroid`, or `street_interpolated` between those numbers."
    },
    "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": "PRT only, optional. `true` when the point is a town / area centre standing in for the address — a city- or neighbourhood-only request (`street_missing`) or a street that could not be placed (`fell_back_to_locality`). `accuracy_type` is then `locality_centroid` or `admin_centroid`."
    },
    "resolved_level": {
      "allOf": [
        {
          "$ref": "#/$defs/ResolvedLevel"
        }
      ],
      "description": "PRT only, with `approximate`. Which kind of place the point stands for."
    },
    "resolved_name": {
      "type": "string",
      "description": "PRT only, with `approximate`. The place's name as spelled in the reference data."
    },
    "balance": {
      "type": "integer",
      "description": "Remaining geocode transactions after a keyed, non-free-tier call."
    },
    "validation_credits": {
      "type": "integer"
    },
    "free_remaining": {
      "type": "integer",
      "description": "Free calls left today, for anonymous and non-`free_av_geo` free-tier callers."
    },
    "key_class": {
      "type": "string",
      "description": "Present only for verified `free_av_geo` keys — `\"free_av_geo\"`. See `/check-key`."
    },
    "free_daily_limit": {
      "type": "integer",
      "description": "Present only for verified `free_av_geo` keys. Always `1000` (the evaluation allowance total; not a daily figure since 23 October 2026)."
    }
  },
  "$defs": {
    "AccuracyType": {
      "type": [
        "string",
        "null"
      ],
      "x-extensible-enum": [
        "rooftop",
        "arrival_point",
        "street_interpolated",
        "street_segment_centroid",
        "street_centroid",
        "landmark_proximity",
        "postcode_centroid",
        "locality_centroid",
        "admin_centroid",
        "po_box",
        "po_box_postcode_area",
        "po_box_office"
      ],
      "description": "What the returned coordinate represents. `null` on `no_match`, and\n`null` on an answer whose address is confirmed but has no coordinate\n(reason `no_coordinate_available`).\n\n**This is an OPEN set.** New tiers are added as reference data improves.\nClients MUST pass unrecognized values through rather than throwing, and\nSHOULD branch on `point_coordinate` rather than on these literals.\n\nA **point coordinate** identifies one address:\n  * `rooftop` — a point on the building itself.\n  * `arrival_point` — the address's entrance, gate or curb-side access\n    point. A point for *this* address, typically a few metres from the\n    roof — deliberately not claimed as the building footprint.\n\nEverything else is derived rather than observed — a segment or an area,\nnot an address:\n  * `street_interpolated` — HNO estimated along a street segment polyline\n    (SEG cascade) from the position of neighbouring house numbers.\n  * `street_centroid` — street confirmed; exact HNO not located.\n    **Singapore:** block numbers are not linear along a road and a\n    letter-suffixed block (e.g. `700D`) is a separate building with its\n    own postcode, so Singapore never returns `street_interpolated`. An\n    unconfirmed block (or a street with no block) answers\n    `street_centroid` at the street's centre, and\n    `standardized.postcode` is left empty unless you supplied a\n    postcode that exists on that street — a postcode names one\n    building, and another building's postcode is never shown as yours.\n  * `landmark_proximity` — India only. The address itself resolved no\n    further than its postcode/locality, so the coordinate is that of a\n    LANDMARK the caller named in the input (\"opp. Swami Samarth Math\").\n    It is a point on a *neighbouring* place, never the address, and it\n    is only ever used when it out-ranks what would otherwise be\n    returned. The landmark used is named back to you in\n    `landmark_used` (`name`, `matched_from`, `scope`, `source`).\n  * `postcode_centroid` — only postcode matched.\n  * `locality_centroid` — only city/locality matched.\n  * `admin_centroid` — only admin region (state/province) matched.\n  * `po_box` — Canada only. A PO Box matched to a Canada Post\n    installation (post office / station) by its box number, station,\n    town and postal code against the reference lock-box ranges. This\n    tier says where the pin is, not whether the box is verified:\n    that is `status` (verified / corrected), `deliverable` and\n    `reasons` — a partial answer on this tier carries\n    `po_box_not_in_range`. A box has no door, so the coordinate is\n    the centre of the locality the post office is in;\n    `point_coordinate` is `false`. See `address_type` and the\n    `po_box` object.\n  * `po_box_postcode_area` — Canada only. The same PO Box match, but\n    the post office's locality has no coordinate of its own, so the\n    pin is the centre of the box postcode's forward sortation area\n    (its first three characters). The position is graded like\n    `locality_centroid` (lower `confidence`); verified or not is again\n    `status` / `deliverable` / `reasons` (a verified box stays\n    `status` verified and `deliverable` true on this tier).\n    Partial PO Box answers that name no post office\n    (`po_box_ambiguous`, `po_box_postcode_town_mismatch`) and a\n    not-in-range box whose typed town is not the postal code's carry\n    `locality_centroid` (the centre of the town you sent) with\n    `address_type: po_box`.\n  * `po_box_office` — Singapore only. A PO Box confirmed in the box\n    register by its box number, post office and/or 6-digit box\n    postcode (90xxxx / 91xxxx). A box has no door, so the pin is the\n    post office that holds the box; `point_coordinate` is `false`.\n    When that post office has no coordinate, the box is still\n    `status` verified and `deliverable: true`, with `lat`/`lng` and\n    `accuracy_type` `null` and reason `no_coordinate_available`\n    (validity and coordinates are separate). See `address_type` and\n    the `po_box` object.\n"
    },
    "FailureReason": {
      "type": "string",
      "x-extensible-enum": [
        "street_not_found",
        "city_not_matching",
        "locality_unknown",
        "house_number_interpolated",
        "house_number_not_found",
        "house_number_unconfirmed",
        "house_number_range_interpolated",
        "street_not_matched",
        "street_unconfirmed",
        "street_not_found_in_locality",
        "postcode_not_matched",
        "postcode_unconfirmed",
        "postcode_town_mismatch",
        "postcode_locality_conflict",
        "postcode_valid_not_stocked",
        "city_unconfirmed",
        "below_verification_threshold",
        "no_coordinate_available",
        "resolved_to_administrative_area_only",
        "positioned_at_named_landmark",
        "non_deliverable_address",
        "po_box_not_in_range",
        "po_box_ambiguous",
        "po_box_postcode_town_mismatch",
        "po_box_number_missing",
        "po_box_not_found",
        "search_budget_exhausted",
        "fuzzy_budget_exceeded",
        "street_type_ambiguous",
        "city_not_found",
        "city_missing",
        "street_found_in_multiple_localities",
        "street_type_mismatch",
        "street_particle_mismatch",
        "street_spelling_mismatch",
        "locality_ambiguous",
        "street_missing",
        "fell_back_to_locality",
        "house_number_not_in_reference",
        "house_number_missing",
        "postcode_house_number_ambiguous",
        "house_number_extension_missing"
      ],
      "description": "Why a validation failed to confirm the address (or part of it).\n\n**This is an OPEN set** — new codes are added as matching logic\nimproves; pass unrecognized values through rather than throwing.\nReasons appear on 404/422 error bodies AND on 200 `partial_match`\nresponses (stating what the resolved tier could not pin down).\n  * `street_not_found` — no street in the candidate set scored highly.\n    On a Portugal 200 it appears together with `fell_back_to_locality`\n    (`approximate: true`) when the name sent is an estate,\n    urbanisation or neighbourhood that is not in the street data but\n    whose town we can place: the point is then the town centre.\n  * `city_not_matching` — street looked right but the locality did not.\n  * `locality_unknown` — we could not even find candidates in the locality.\n  * `house_number_interpolated` — house number was interpolated along a street\n    segment (`street_interpolated` tier), not confirmed against a rooftop record.\n  * `house_number_not_found` — street confirmed but the exact house number is not\n    on file.\n  * `house_number_unconfirmed` — the house number could not be confirmed\n    (`street_centroid` tier partials emit this).\n  * `house_number_range_interpolated` — number placed within an official\n    numbering range, not a premise row.\n  * `street_not_matched` — the street could not be matched; resolution stopped at a\n    postcode or locality centroid.\n  * `street_unconfirmed` — a street you provided could not be confirmed\n    against the matched record.\n  * `street_not_found_in_locality` — the street exists but not in the\n    stated locality.\n  * `postcode_not_matched` — the postcode could not be matched; resolution stopped\n    at a locality centroid.\n  * `postcode_unconfirmed` / `city_unconfirmed` — the component was echoed\n    from input, not confirmed by reference data.\n  * `postcode_town_mismatch` — postcode and town point at different places.\n  * `postcode_locality_conflict` — postcode and locality conflict (India).\n  * `postcode_valid_not_stocked` — the postcode is real but our reference\n    data holds no addresses for it (Malaysia; see `postcode_status`).\n  * `below_verification_threshold` — the best candidate scored under the\n    verification threshold.\n  * `no_coordinate_available` — matched a reference row that carries no\n    coordinate.\n  * `resolved_to_administrative_area_only` — only the admin region (state/province)\n    resolved (`admin_centroid` tier).\n  * `positioned_at_named_landmark` — coordinate taken from a landmark the\n    caller named (India `landmark_proximity`; see `landmark_used`).\n  * `non_deliverable_address` — PO Box / Rural Route / Postfach input\n    (see `MatchType: non_deliverable`).\n  * `po_box_not_in_range` — Canada: the postal code you sent belongs to\n    PO Boxes, but the box number is in none of its ranges (partial).\n    The town and province are shown as you sent them; one you did not\n    send is the postal code's. A province that contradicts the postal\n    code's own town is replaced and listed in `corrections`\n    (`State`). When your town is not the postal code's, the pin is the\n    centre of your town (`accuracy_type: locality_centroid`; looked up\n    in the postal code's province if you sent none) and the postal\n    code's post office is listed in `po_box_alternatives`. Without any\n    pin (your town is unknown there) there is no PO Box answer: the\n    request gets today's refusal (400 `non_deliverable_address`).\n    Singapore: the 6-digit postcode you sent is a PO Box postcode,\n    but the box number is not at it (partial); the post offices that\n    hold that box number are listed in `po_box_alternatives`, the\n    postcode's own post office first. When you name the post office\n    and it holds the box, the postcode is corrected instead\n    (`corrections`: `Postal code`).\n  * `po_box_ambiguous` — Canada: the town and box number fit more than\n    one post office; candidates are listed in `po_box_alternatives`\n    (partial). Adding the postal code or the station resolves it. No\n    post office is picked: `standardized` keeps the bare box line and\n    the postal code you sent (blank if none), and the pin is the\n    centre of the town you sent (`accuracy_type: locality_centroid`).\n    Singapore: the box number exists at more than one post office and\n    neither the post office nor its 6-digit postcode was sent\n    (partial, no coordinate); candidates are in `po_box_alternatives`.\n  * `po_box_number_missing` — Singapore: a PO Box postcode or post\n    office was sent without a box number (partial, no coordinate).\n  * `po_box_not_found` — Singapore: the input is a PO Box line (PO Box,\n    Post Office Box, Privy Box, Locked Bag, or a 90xxxx / 91xxxx\n    postcode) but no such box is in the register; Privy Box and\n    Locked Bag addresses are not served. Returned on the 404 no-match\n    body with `address_type: po_box`; never answered with a street.\n  * `po_box_postcode_town_mismatch` — Canada: the postal code you sent\n    belongs to a post office in another town AND another province than\n    the ones you sent, so it is not taken as a correction of both\n    (partial, `deliverable: false`, no corrections). `standardized`\n    keeps what you sent; the pin is the centre of the town you sent\n    (`accuracy_type: locality_centroid`), never the postal code's post\n    office; that post office is listed in `po_box_alternatives`.\n  * `search_budget_exhausted` — the search ran out of its per-request\n    time budget (about 10 s; shorter where a per-call time limit\n    applies) and the response carries `truncated: true`. On a 404 the\n    input did not match directly and the recovery search (typo,\n    locality and postcode fallbacks) stopped before finding a\n    confident answer. This is a no-match, not a server error: the\n    address may still exist. Check the input for typos or add the\n    postcode, then retry; do not retry the identical request in a\n    tight loop. United States `/validate` can also carry it on a 200:\n    the answer is the best one found before the time limit (its\n    `status`, `accuracy_type` and pin are exactly as found, never\n    upgraded and never a correction), and a finer pin may exist. A\n    rooftop answer never carries it.\n  * `fuzzy_budget_exceeded` — Sweden (`swe`), `/validate` partial 200s\n    and 404s. The street did not match as typed and the search for a\n    close real street (typo correction) was cut short by its time\n    limit before it finished. It is NOT proof that the street is\n    absent: appears together with `street_not_matched` (200) or\n    `street_not_found` (404), and the answer stops at a postcode or\n    locality centroid. The caller may retry the same request once a\n    moment later; a retry usually completes the correction.\n  * `street_type_ambiguous` — 404 only (USA). The street NAME exists in\n    the given postcode/city, but only with a different street type or\n    directional than the one supplied, and more than one real street\n    fits (e.g. `12th St N` when both `12th St NE` and `12th St NW` carry\n    the house number). We never guess between two real streets: the\n    body carries `did_you_mean`, the candidate streets (up to 6) with\n    their `city` and `postcode`; resubmit with the intended one.\n    Can also appear in a `/geocode-usa` 404 body, when no fallback\n    centroid is available for the address.\n\n  * `city_missing` — 404. A street was sent without a city or\n    postcode and cannot be placed in a single locality. Sent together\n    with another code (e.g. `street_not_found` or\n    `street_found_in_multiple_localities`). Seen for several countries\n    (e.g. Portugal, Brazil, Spain). Netherlands: also when a postcode\n    was sent but is not on file (the `message` then asks for a city\n    only); a postcode + house number with no street is answered\n    without this code (see `postcode_house_number_ambiguous`).\n  * `street_found_in_multiple_localities` — 404. The street name exists\n    in more than one locality — of the town you sent, or, when no city\n    was sent, of the country. Add the locality or the postcode. When\n    no city was sent, `did_you_mean` lists the towns holding the\n    street (at most 6).\n\n**Portugal (`country: prt`) only.** The codes below are added to\nPortuguese responses on `/validate` and `/geocode` (and their `/v1`\naliases). On a 200 they are appended after the codes listed above,\nwhich keep their meaning and position. On a 404 the first code is the\nmost specific one.\n  * `city_not_found` — 404. The city/town you sent is not a place in\n    the Portuguese reference data (often sent with\n    `locality_unknown`). Check the spelling or send the postcode.\n  * `street_type_mismatch` — 404, sent before `street_not_found`. The\n    street name exists in the town only with a different street type\n    (e.g. `Rua de Portugal` typed, `Avenida de Portugal` held). See\n    `did_you_mean`.\n  * `street_particle_mismatch` — 404, as above, when the name differs\n    only in its linking particles (`da`, `de`, `do`, `das`, `dos`).\n  * `street_spelling_mismatch` — 404, as above, for a close spelling\n    of a street of that town.\n  * `locality_ambiguous` — 404. A place name sent on its own (no\n    street) is a locality in several municipalities and nothing\n    coarser; it is never guessed. `did_you_mean` lists the candidates\n    with `municipality` and `district`. Sent with `street_missing`.\n  * `street_missing` — no street was sent. On a 200 it marks the\n    labelled approximate point for a city- or neighbourhood-only\n    request (`approximate: true`).\n  * `fell_back_to_locality` — 200. A street was sent but could not be\n    placed, and the point served is the town/area centre\n    (`approximate: true`, `resolved_level`, `resolved_name`), not the\n    address. For an estate or neighbourhood name sent with a town it is\n    accompanied by `street_not_found`; it can also carry a\n    `did_you_mean` hint and its `street_*_mismatch` code.\n  * `house_number_not_in_reference` — 200. The street was matched but\n    the house number you sent is not in the reference data;\n    `nearby_house_numbers` names the closest same-parity numbers that\n    are.\n  * `house_number_missing` — 200. The street was matched but no house\n    number was sent, so only a street-level point is possible.\n\n**Netherlands (`country: nld`), postcode + house number with no street:**\n  * `postcode_house_number_ambiguous` — 404, with `street_missing`.\n    Several streets hold that house number at that postcode; we never\n    guess between them. `did_you_mean` lists them (`street`, `city`,\n    `postcode`, `house_number`; at most 6).\n  * `house_number_extension_missing` — 200. The number exists at that\n    postcode only with a letter (`3A`, `3B`, ...) and none was sent; the\n    point is that building, and `did_you_mean` lists the letters.\n  * `house_number_not_in_reference` — 200 (`postcode_centroid`). The\n    number is not on file at that postcode; `standardized.street` is\n    empty (nothing is invented).\n"
    },
    "NearbyHouseNumber": {
      "type": "object",
      "additionalProperties": true,
      "properties": {
        "hno": {
          "type": "string"
        },
        "lat": {
          "type": [
            "number",
            "null"
          ],
          "format": "float"
        },
        "lng": {
          "type": [
            "number",
            "null"
          ],
          "format": "float"
        },
        "accuracy": {
          "type": [
            "string",
            "null"
          ],
          "description": "The coordinate tier of that house number (e.g. `rooftop`), `null` without a coordinate."
        },
        "has_coordinates": {
          "type": "boolean",
          "description": "`false` when the number exists in the reference data without its own coordinate (`lat`/`lng`/`accuracy` are then `null`)."
        }
      }
    },
    "NearbyHouseNumbers": {
      "type": "object",
      "description": "**Portugal (`country: prt`) only.** Present on a 200 answer when the\nstreet was matched but the house number you sent is not in the\nreference data — the answer is then either street-level\n(`street_centroid`) or `street_interpolated` at a point between the\nnearest same-parity house numbers (`pin_between`). It lists which\nnumbers of that street ARE held, on the same side of the street (odd\nand even numbers usually face each other). Informational only: it\nnever changes the coordinate, tier, confidence or `deliverable`. Sent\nwith reason `house_number_not_in_reference`. Pass unrecognized fields\nthrough.\n",
      "additionalProperties": true,
      "properties": {
        "requested": {
          "type": "string",
          "description": "The house number as you sent it."
        },
        "parity": {
          "type": "string",
          "x-extensible-enum": [
            "odd",
            "even"
          ]
        },
        "before": {
          "allOf": [
            {
              "$ref": "#/$defs/NearbyHouseNumber"
            }
          ],
          "nullable": true,
          "description": "The nearest held number below the requested one on the same side, or `null`."
        },
        "after": {
          "allOf": [
            {
              "$ref": "#/$defs/NearbyHouseNumber"
            }
          ],
          "nullable": true,
          "description": "The nearest held number above the requested one on the same side, or `null`."
        },
        "pin_between": {
          "type": [
            "array",
            "null"
          ],
          "items": {
            "type": "string"
          },
          "description": "The two held numbers the interpolated point was placed between (both may be the same number, e.g. `41` for a requested `41B`); `null` when the answer is street-level rather than interpolated."
        },
        "same_parity_available": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Up to 40 held numbers on the same side nearest to the requested one, in ascending order (letter suffixes such as `2A` included)."
        },
        "total_doors": {
          "type": "integer",
          "description": "Number of distinct house numbers held for the street."
        },
        "coordinated_doors": {
          "type": "integer",
          "description": "How many of those carry their own coordinate."
        }
      }
    },
    "ResolvedLevel": {
      "type": "string",
      "description": "**Portugal (`country: prt`) only.** Which kind of place an approximate\npoint (`approximate: true`) stands for. Open set — pass unknown values\nthrough.\n  * `locality` — a locality (village / town).\n  * `postal_town` — the town name of the postal address.\n  * `municipality` — a municipality (concelho).\n  * `district` — a district.\n  * `lisbon_parish` — a Lisbon parish or neighbourhood name; the point\n    is Lisbon's.\n",
      "x-extensible-enum": [
        "locality",
        "postal_town",
        "municipality",
        "district",
        "lisbon_parish"
      ]
    }
  }
}