Validate an address
Accepts a single-line address string or structured fields in input, plus required country (ISO-style code).
Body formats: JSON (Content-Type: application/json) is the documented format. A form-encoded (application/x-www-form-urlencoded) or multipart/form-data body with the same flat field names (country, street, city, ...) is also accepted, and country_code / countryCode are accepted as aliases of country. Address fields are never read from the query string.
Street-level answers (Netherlands): a street sent without a house number (or with one that is not on file) is answered at street level (street_centroid, street_segment_centroid, street_interpolated). Such an answer lists the postcodes the street covers in street_postcodes; when there is more than one, postcode_range and standardized.postcode state the range as from 9573 PA to 9573 PH, and standardized.formatted_address prints it with two spaces before the town (PostNL convention). A street sent with no city that exists in several places is refused with the count and a request to add a city or postcode (see ValidateErrorBody.locality_count); when a postcode was sent but is not on file, the message asks for a city only.
Postcode + house number (Netherlands): postcode (PC6, e.g. 3999 NN, 3999NN or 3999 nn) and house_number alone, with no street and no city, is a complete Dutch address and is accepted (single line too: 3999 NN 27). When exactly one street holds that number at that postcode, the answer is that address (rooftop, status verified, corrections: []) and the derived parts are disclosed with street_backfilled_from_postcode: true and city_backfilled_from_postcode: true (they are not corrections: nothing you sent was wrong). A letter (huisletter, 17a) selects that letter's own address. When several streets hold the number at that postcode the request is a 404 with reasons: ["street_missing", "postcode_house_number_ambiguous"] and did_you_mean entries (street, city, postcode, house_number; at most 6). When the number exists only with letters (3A, 3B, ...) and none was sent, the answer adds reason house_number_extension_missing and lists the letters in did_you_mean. A number not on file at that postcode is answered at the postcode (postcode_centroid, partial_match: true, reason house_number_not_in_reference, empty standardized.street), never with a 400. A street or city you send is used as sent (this lookup does not run).
Credits: A validation costs 1 Stripe-plan transaction (validate=1). The trial pool decrements 1 regardless of endpoint weight. Anonymous callers consume one free slot per IP (per-product daily free limits apply — check remaining via /validate-credits; anonymous access is rate-limited per IP).
Response add-ons (opt-in):
- ISO 20022 / CBPR+ — pass "iso20022": true in the body (or ?iso20022=1) to add an iso20022 block mapping the result onto Swift CBPR+ postal-address shapes (structured / hybrid) plus explicit truth assertions, hard-negative refutations, and unresolved coverage gaps. Opt-in/beta; the default response shape is unchanged when the flag is absent. See Iso20022Block. The flag also switches PO-box handling: without it, non-deliverable input is rejected with 400; with iso20022: true it is accepted and labelled via non_deliverable_type (ISO 20022 postal addresses may be PO boxes).
- mode=interactive (AD-parity resolver) — pass "mode": "interactive" with a fielded input object to get a ranked pick-list / valid house-number-range envelope (process_status, results[]) instead of the single batch verdict. Opt-in/beta; billed identically to a batch validation (1 transaction). The default mode: batch contract is untouched. See InteractiveEnvelope.
Request
- Base URL: https://api.acuris-geo.com
- URL: https://api.acuris-geo.com/validate
- Auth: one of:
- API key in header X-Acuris-Key
- HTTP bearer
- API key in header X-API-Key
- API key in query parameter key
- none
Request body
Response
Validation succeeded or partial fallback returned. Inspect partial_match to distinguish: when true, the address was not fully confirmed — either the street resolved but not the house number (street_interpolated / street_centroid), or the SEG cascade inferred a postcode_centroid / locality_centroid / admin_centroid for lat/lng. reasons states what could not be pinned down.
Example response
{
"nearby_house_numbers": {
"requested": "46",
"before": {
"hno": "44"
},
"after": {
"hno": "44"
},
"pin_between": [
"44",
"50"
]
},
"street_postcodes": [
{
"postcode": "9573 PA",
"house_number_from": 3,
"house_number_to": 22
}
],
"postcode_range": {
"from": "9573 PA",
"to": "9573 PH",
"text": "from 9573 PA to 9573 PH"
},
"landmark_used": {
"name": "Patiala House",
"matched_from": "Patiala House",
"source": "Overture Maps Foundation (CDLA-Permissive-2.0)"
}
}Changes
No recorded changes to this operation across all 1 revision of this API.