Takes a single freeform address_line (up to 280 chars) and emits a structured { street_name?, building_number?, post_code?, town_name?, country? } block plus a confidence label (high / medium / low) and a list of caveats.
The algorithm is deterministic token-mapping — no LLM. Same input always produces same output (which is what the audit trail and the idempotency contract need). See apps/api/src/lib/address-restructure.ts for the rules.
Limitations: poor on multi-line freeform addresses, poor on non-European postal formats, poor when the country is implicit. The Phase-2 roadmap adds a small-model rescue lane for low-confidence cases; today, low-confidence results should be routed to human review.
For pure-local lint (does the address have street_name + building_number + post_code + town_name + country?) use the free /address-lint page.