GeoVerdictDocs
Documentation menu
Guides

Verdicts & confidence

Every validation returns exactly one verdict and one 0–100 confidence score. Both are computed by comparing the provider's answer against what you actually sent, never by trusting a provider's own confidence.

The three verdicts

VerdictMeaningWhat to do
valid Confidence is at or above your valid threshold and no checked component was corrected, mismatched, or missing. Accept the address as submitted.
correctable The address was found, but something had to be fixed (a misspelled street, a wrong postcode letter, a missing city). The response carries the standardized address. Apply address, or show it to the user as a suggested correction. This is a success, not a failure.
invalid Below the correctable threshold, no provider returned anything, or a supplied house number could not be matched. Ask the user to re-enter. reasons tells you what went wrong.

How the verdict is decided

In order, for the best-scoring candidate:

  1. No candidate at all: invalid, reason no_results.
  2. You supplied a house number and the best result's house number is missing or mismatch: invalid, reason no_house_number_match. A confident street-level hit is deliberately not treated as a deliverable address.
  3. Confidence at or above the valid threshold and nothing corrected, mismatched, or missing: valid, no reasons.
  4. Confidence at or above the correctable threshold: correctable, with reason components_corrected when something was corrected.
  5. Otherwise: invalid, reason low_confidence, plus components_incomplete when a component was mismatched or missing.
A high score alone is not a valid verdict.

Because step 3 requires clean components, a result can score above your threshold and still come back correctable. That is intentional: it flags that the stored address differs from what the user typed.

Reasons taxonomy

A closed set of five values. reasons is an array and is empty for a clean valid.

ReasonMeaning
no_resultsNo provider returned any candidate.
low_confidenceThe best candidate scored below the correctable threshold.
no_house_number_matchYou supplied a house number and no result matched it.
components_incompleteA component was mismatched or missing (accompanies low_confidence).
components_correctedAt least one component was corrected to produce the standardized address.

Component verdicts

The components object reports how each part of your input compared to the result. Only checked components appear.

ValueMeaning
matchThe result agrees with your input.
correctedClose enough to be the same address, but the canonical value differs (typo, formatting, postcode letters).
mismatchThe result contradicts your input.
missingYou supplied the field but the result has no value for it.
not-checkedNot comparable for this request.

The confidence score

Confidence is a unified 0–100 integer, comparable across providers. It is built from weighted component agreement:

ComponentWeight
houseNumber0.30
street0.25
postcode0.25
city0.15
country0.05

Each component contributes points by its verdict: match scores 1, corrected 0.7, missing 0.2, mismatch 0, and not-checked is excluded from the weighting entirely. When a provider reports its own confidence, the adapter normalizes it to 0–1 and it blends in at weight 0.25. A per-provider, per-country calibration prior can scale the result (currently 1.0 for every provider, so it has no effect today).

Free-form query input is scored with presence-in-query checks; structured components input gets exact per-field comparison. Structured input therefore produces the more precise score when you have separate form fields.

Matching rules worth knowing

Thresholds

The valid threshold defaults to 85 and is configurable per account (console Settings) between 50 and 99, with optional per-project overrides. The correctable threshold is derived: 25 points below the valid threshold, never lower than 40. At the default that means valid ≥ 85 and correctable ≥ 60.

Raising the threshold makes valid stricter and pushes borderline results into correctable. Lowering it does the opposite. Changing the threshold also changes the cache key, so new settings take effect on the next lookup rather than being masked by cached responses.

Providers behind the verdict

IdDataCoverage
bagDutch national register (BAG) via PDOKNetherlands only. Authoritative, with typo-aware correction.
opencageOpenCageGlobal.
photonOpenStreetMap via PhotonGlobal.
nominatimOpenStreetMap via NominatimGlobal.

Provider credentials belong to the platform, so you never bring your own keys. Which providers are active is a platform setting; GET /healthz reports the current list, and projects can restrict and reorder the ones they use. Providers that do not cover the requested country are skipped and traced as no-coverage.