<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Coordable (Posts about addresses)</title><link>https://coordable.co/</link><description></description><atom:link href="https://coordable.co/categories/addresses.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Contents © 2026 &lt;a href="mailto:contact@coordable.co"&gt;Nikola Tesla&lt;/a&gt; </copyright><lastBuildDate>Tue, 28 Apr 2026 16:26:40 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>String Distance Metrics for Address Comparison: Levenshtein, Damerau, Jaro, and Jaro-Winkler</title><link>https://coordable.co/blog/string-distance-metrics-address-comparison/</link><dc:creator>François Andrieux</dc:creator><description>&lt;h3 id="comparing-addresses-is-not-a-simple-equality-check"&gt;Comparing addresses is not a simple equality check&lt;/h3&gt;
&lt;p&gt;When you compare two address strings to decide if they refer to the same location, an exact match is rarely enough. Real-world addresses come with typos, abbreviations, inconsistent casing, and missing components. "15 Baker St" and "15 Baker Street" are the same address, but &lt;code&gt;"15 Baker St" == "15 Baker Street"&lt;/code&gt; evaluates to &lt;code&gt;False&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;String distance metrics can be used to solve this problem. They assign a number to two strings that quantifies how different (or similar) they are. This number lets you set a threshold: "if the distance is less than 2, or the similarity is above 0.9, treat them as the same address."&lt;/p&gt;
&lt;p&gt;In this guide, we cover the four most widely used metrics for address comparison:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Levenshtein distance&lt;/strong&gt; - the classic edit distance&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Damerau-Levenshtein distance&lt;/strong&gt; - edit distance with transpositions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jaro similarity&lt;/strong&gt; - character matching with position awareness&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jaro-Winkler similarity&lt;/strong&gt; - Jaro with a bonus for matching prefixes&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For each one, we explain how it works, walk through a concrete address example, and discuss when it is (and is not) a good fit. At the end, a summary table and practical recommendations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Table of contents:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/string-distance-metrics-address-comparison/#comparing-addresses-is-not-a-simple-equality-check"&gt;Comparing addresses is not a simple equality check&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/string-distance-metrics-address-comparison/#a-quick-note-before-diving-in"&gt;A quick note before diving in&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/string-distance-metrics-address-comparison/#1-levenshtein-distance"&gt;1. Levenshtein distance&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/string-distance-metrics-address-comparison/#how-it-works"&gt;How it works&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/string-distance-metrics-address-comparison/#address-example"&gt;Address example&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/string-distance-metrics-address-comparison/#in-python"&gt;In Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/string-distance-metrics-address-comparison/#pros-and-cons"&gt;Pros and cons&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/string-distance-metrics-address-comparison/#when-to-use-it-for-addresses"&gt;When to use it for addresses&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/string-distance-metrics-address-comparison/#2-damerau-levenshtein-distance"&gt;2. Damerau-Levenshtein distance&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/string-distance-metrics-address-comparison/#how-it-works_1"&gt;How it works&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/string-distance-metrics-address-comparison/#address-example_1"&gt;Address example&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/string-distance-metrics-address-comparison/#in-python_1"&gt;In Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/string-distance-metrics-address-comparison/#pros-and-cons_1"&gt;Pros and cons&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/string-distance-metrics-address-comparison/#when-to-use-it-for-addresses_1"&gt;When to use it for addresses&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/string-distance-metrics-address-comparison/#3-jaro-similarity"&gt;3. Jaro similarity&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/string-distance-metrics-address-comparison/#how-it-works_2"&gt;How it works&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/string-distance-metrics-address-comparison/#address-example_2"&gt;Address example&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/string-distance-metrics-address-comparison/#in-python_2"&gt;In Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/string-distance-metrics-address-comparison/#pros-and-cons_2"&gt;Pros and cons&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/string-distance-metrics-address-comparison/#when-to-use-it-for-addresses_2"&gt;When to use it for addresses&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/string-distance-metrics-address-comparison/#4-jaro-winkler-similarity"&gt;4. Jaro-Winkler similarity&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/string-distance-metrics-address-comparison/#how-it-works_3"&gt;How it works&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/string-distance-metrics-address-comparison/#address-example_3"&gt;Address example&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/string-distance-metrics-address-comparison/#in-python_3"&gt;In Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/string-distance-metrics-address-comparison/#pros-and-cons_3"&gt;Pros and cons&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/string-distance-metrics-address-comparison/#when-to-use-it-for-addresses_3"&gt;When to use it for addresses&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/string-distance-metrics-address-comparison/#summary-table"&gt;Summary table&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/string-distance-metrics-address-comparison/#normalization-the-step-that-matters-more-than-metric-choice"&gt;Normalization: the step that matters more than metric choice&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/string-distance-metrics-address-comparison/#putting-it-all-together-a-complete-address-comparison"&gt;Putting it all together: a complete address comparison&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/string-distance-metrics-address-comparison/#where-to-go-from-here"&gt;Where to go from here&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h3 id="a-quick-note-before-diving-in"&gt;A quick note before diving in&lt;/h3&gt;
&lt;p&gt;There are two flavors of metric:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Distance metrics&lt;/strong&gt; (Levenshtein, Damerau-Levenshtein): return 0 for identical strings, and a higher integer for more different strings. Think of them as counting "how many operations to fix this?"&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Similarity metrics&lt;/strong&gt; (Jaro, Jaro-Winkler): return 1.0 for identical strings, and a lower value (down to 0.0) for more different strings. Think of them as "what fraction of characters match?"&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Neither type is universally better. Which one to use depends on your data and your use case.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="1-levenshtein-distance"&gt;1. Levenshtein distance&lt;/h3&gt;
&lt;h4 id="how-it-works"&gt;How it works&lt;/h4&gt;
&lt;p&gt;The Levenshtein distance between two strings is the &lt;strong&gt;minimum number of single-character edits&lt;/strong&gt; needed to transform one into the other. The allowed operations are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Insertion&lt;/strong&gt;: add a character (e.g., "Streeet" - one character - to "Street")&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deletion&lt;/strong&gt;: remove a character (e.g., "Streeet" + one deletion - to "Street")&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Substitution&lt;/strong&gt;: replace one character with another (e.g., "Straat" - replace 'a' with 'e' - to "Street")&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A distance of 0 means the strings are identical. A distance of 1 means a single operation is enough.&lt;/p&gt;
&lt;h4 id="address-example"&gt;Address example&lt;/h4&gt;
&lt;p&gt;Compare &lt;strong&gt;"15 baker srteet"&lt;/strong&gt; (a common keyboard transposition typo) to &lt;strong&gt;"15 baker street"&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="mf"&gt;15&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;baker&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;srteet&lt;/span&gt;
&lt;span class="mf"&gt;15&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;baker&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;street&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;To fix "srteet" into "street", Levenshtein needs &lt;strong&gt;2 substitutions&lt;/strong&gt;: replace 'r' with 't' at position 9, and 't' with 'r' at position 10.&lt;/p&gt;
&lt;p&gt;Distance = &lt;strong&gt;2&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This is technically correct, but it feels like a lot for what is clearly a single typing mistake. We will fix this in the next section.&lt;/p&gt;
&lt;h4 id="in-python"&gt;In Python&lt;/h4&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;jellyfish&lt;/span&gt;

&lt;span class="n"&gt;jellyfish&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;levenshtein_distance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"15 baker srteet"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"15 baker street"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# → 2&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Install with &lt;code&gt;pip install jellyfish&lt;/code&gt;.&lt;/p&gt;
&lt;h4 id="pros-and-cons"&gt;Pros and cons&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pros&lt;/th&gt;
&lt;th&gt;Cons&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Simple and well understood&lt;/td&gt;
&lt;td&gt;Counts a transposition (swap of two adjacent chars) as 2 operations instead of 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Handles insertions and deletions well (great for abbreviations like "St" vs "Street")&lt;/td&gt;
&lt;td&gt;Raw distance is hard to compare across string pairs of different lengths&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Available in virtually every language and library&lt;/td&gt;
&lt;td&gt;Does not give extra weight to matching prefixes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fast on short strings&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="when-to-use-it-for-addresses"&gt;When to use it for addresses&lt;/h4&gt;
&lt;p&gt;Levenshtein is a solid default, especially when the main source of variation is abbreviations or missing characters. Set a relative threshold to make comparisons fair across different string lengths:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;normalized_levenshtein&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;dist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jellyfish&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;levenshtein_distance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;dist&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nb"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# Treat as same address if &amp;lt; 15% different&lt;/span&gt;
&lt;span class="n"&gt;normalized_levenshtein&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"15 baker street"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"15 baker st"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# → 0.267&lt;/span&gt;
&lt;span class="n"&gt;normalized_levenshtein&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"15 baker street"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"15 baker sreet"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# → 0.067&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;hr&gt;
&lt;h3 id="2-damerau-levenshtein-distance"&gt;2. Damerau-Levenshtein distance&lt;/h3&gt;
&lt;h4 id="how-it-works_1"&gt;How it works&lt;/h4&gt;
&lt;p&gt;Damerau-Levenshtein extends Levenshtein by adding one more operation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Transposition&lt;/strong&gt;: swap two adjacent characters (e.g., "srteet" to "street" - swap 'r' and 't')&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This single addition makes a big practical difference. Studies of typing errors show that transpositions (adjacent character swaps) are one of the most frequent mistakes people make when typing by hand. Recognizing them as a single error rather than two substitutions gives a much more realistic picture of "how many mistakes did the user make?"&lt;/p&gt;
&lt;h4 id="address-example_1"&gt;Address example&lt;/h4&gt;
&lt;p&gt;Same pair as before: &lt;strong&gt;"15 baker srteet"&lt;/strong&gt; vs &lt;strong&gt;"15 baker street"&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="mf"&gt;15&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;baker&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;srteet&lt;/span&gt;
&lt;span class="mf"&gt;15&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;baker&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;street&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="o"&gt;^^&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="err"&gt;←&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;transposed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;tr&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Damerau-Levenshtein distance = &lt;strong&gt;1&lt;/strong&gt; (one transposition).&lt;/p&gt;
&lt;p&gt;Compare this to the Levenshtein distance of 2 for the same pair. One error, one operation - much more intuitive.&lt;/p&gt;
&lt;p&gt;Another example: &lt;strong&gt;"rue de al paix"&lt;/strong&gt; vs &lt;strong&gt;"rue de la paix"&lt;/strong&gt; (the words "al" and "la" are swapped - a common cut-and-paste error):&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;rue de al paix
rue de la paix
       ^^       ← 'a' and 'l' transposed
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Levenshtein = 2, Damerau-Levenshtein = 1.&lt;/p&gt;
&lt;h4 id="in-python_1"&gt;In Python&lt;/h4&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;jellyfish&lt;/span&gt;

&lt;span class="n"&gt;jellyfish&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;damerau_levenshtein_distance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"15 baker srteet"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"15 baker street"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# → 1&lt;/span&gt;

&lt;span class="n"&gt;jellyfish&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;damerau_levenshtein_distance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"rue de al paix"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"rue de la paix"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# → 1&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h4 id="pros-and-cons_1"&gt;Pros and cons&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pros&lt;/th&gt;
&lt;th&gt;Cons&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;More realistic for human typing errors&lt;/td&gt;
&lt;td&gt;Slightly more complex to implement from scratch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transpositions (very frequent mistakes) cost 1, not 2&lt;/td&gt;
&lt;td&gt;Same issue with raw distance across different string lengths&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Strict superset of Levenshtein - always &amp;lt;= Levenshtein distance&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="when-to-use-it-for-addresses_1"&gt;When to use it for addresses&lt;/h4&gt;
&lt;p&gt;Prefer Damerau-Levenshtein over plain Levenshtein whenever your input comes from users typing addresses manually (web forms, search boxes, mobile apps). It gives a better answer to the question "how careless was this input?" and lets you set tighter thresholds while still tolerating common slip-of-the-finger errors.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="3-jaro-similarity"&gt;3. Jaro similarity&lt;/h3&gt;
&lt;h4 id="how-it-works_2"&gt;How it works&lt;/h4&gt;
&lt;p&gt;Jaro takes a completely different approach. Instead of counting edit operations, it measures the &lt;strong&gt;proportion of characters that match&lt;/strong&gt; between two strings, with a penalty for characters that are far apart or out of order.&lt;/p&gt;
&lt;p&gt;Two characters are considered matching if:
1. They are the same character, and
2. Their positions are not too far apart. The maximum allowed distance between two matching characters is: &lt;code&gt;floor(max(len(s1), len(s2)) / 2) - 1&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Once you count the matching characters &lt;code&gt;m&lt;/code&gt; and the number of matching characters that are out of order &lt;code&gt;t&lt;/code&gt; (transpositions), the Jaro similarity is:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;Jaro(s1, s2) = (1/3) * (m / |s1| + m / |s2| + (m - t) / m)
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The result is between 0.0 (nothing matches) and 1.0 (identical).&lt;/p&gt;
&lt;h4 id="address-example_2"&gt;Address example&lt;/h4&gt;
&lt;p&gt;Compare &lt;strong&gt;"church rd"&lt;/strong&gt; (abbreviated) to &lt;strong&gt;"church road"&lt;/strong&gt; (full form):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;s1 = "church rd" (9 characters), s2 = "church road" (11 characters)&lt;/li&gt;
&lt;li&gt;Matching window = floor(11 / 2) - 1 = 4&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Every character in "church rd" can be matched to a character in "church road" within the window: c, h, u, r, c, h, (space), r, d all appear in the same relative order. So m = 9, t = 0.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;Jaro = (1/3) &lt;span class="gs"&gt;* (9/9 + 9/11 + 9/9)&lt;/span&gt;
&lt;span class="gs"&gt;     = (1/3) *&lt;/span&gt; (1.000 + 0.818 + 1.000)
     ≈ 0.939
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A similarity of 0.939 for what is clearly the same street, just abbreviated. That is the right answer.&lt;/p&gt;
&lt;h4 id="in-python_2"&gt;In Python&lt;/h4&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;jellyfish&lt;/span&gt;

&lt;span class="n"&gt;jellyfish&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;jaro_similarity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"church rd"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"church road"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# → ~0.939&lt;/span&gt;

&lt;span class="n"&gt;jellyfish&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;jaro_similarity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"main street"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"mane street"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# typo: i→e&lt;/span&gt;
&lt;span class="c1"&gt;# → ~0.970&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h4 id="pros-and-cons_2"&gt;Pros and cons&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pros&lt;/th&gt;
&lt;th&gt;Cons&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Normalized score between 0 and 1 - easy to threshold&lt;/td&gt;
&lt;td&gt;Formula is less intuitive than edit distance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Handles abbreviations and length differences naturally&lt;/td&gt;
&lt;td&gt;Can give surprisingly high scores to long strings with many common characters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Well suited for comparing individual address components&lt;/td&gt;
&lt;td&gt;Does not give extra weight to matching prefixes - we fix this with Jaro-Winkler&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="when-to-use-it-for-addresses_2"&gt;When to use it for addresses&lt;/h4&gt;
&lt;p&gt;Jaro is a good fit for comparing &lt;strong&gt;individual address fields&lt;/strong&gt; (just the street name, just the city) rather than full concatenated address strings. It is also useful for detecting near-duplicate records in a database.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="4-jaro-winkler-similarity"&gt;4. Jaro-Winkler similarity&lt;/h3&gt;
&lt;h4 id="how-it-works_3"&gt;How it works&lt;/h4&gt;
&lt;p&gt;Jaro-Winkler builds on Jaro by adding a &lt;strong&gt;prefix bonus&lt;/strong&gt;: if two strings share the same first characters, their similarity is boosted. The motivation is that strings that start the same way are more likely to refer to the same thing than strings that diverge immediately.&lt;/p&gt;
&lt;p&gt;The formula is:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;JaroWinkler(s1, s2) = Jaro(s1, s2) + l &lt;span class="gs"&gt;* p *&lt;/span&gt; (1 - Jaro(s1, s2))
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Where:
- &lt;code&gt;l&lt;/code&gt; = length of the common prefix, up to a maximum of 4 characters
- &lt;code&gt;p&lt;/code&gt; = scaling factor, conventionally 0.1&lt;/p&gt;
&lt;p&gt;The effect is a modest upward adjustment when the prefix matches. With &lt;code&gt;p = 0.1&lt;/code&gt; and &lt;code&gt;l = 4&lt;/code&gt;, the maximum bonus is &lt;code&gt;+4 * 0.1 * (1 - Jaro)&lt;/code&gt;, which boosts a Jaro of 0.90 by at most 0.04. Small but meaningful for ranking candidates.&lt;/p&gt;
&lt;h4 id="address-example_3"&gt;Address example&lt;/h4&gt;
&lt;p&gt;Take &lt;strong&gt;"church rd"&lt;/strong&gt; vs &lt;strong&gt;"church road"&lt;/strong&gt; again (Jaro = 0.939, common prefix "chur", l = 4):&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;JaroWinkler = 0.939 + 4 &lt;span class="gs"&gt;* 0.1 *&lt;/span&gt; (1 - 0.939)
            = 0.939 + 0.4 * 0.061
            ≈ 0.963
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Now consider two streets that differ at the very beginning:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;"avenue du general leclerc"&lt;/strong&gt; vs &lt;strong&gt;"boulevard du general leclerc"&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These share no prefix at all (l = 0), so Jaro-Winkler equals Jaro exactly. No bonus is applied, and the score is lower than it would be for two strings with the same beginning. This is exactly the intended behavior: a difference at the start is a stronger signal of a mismatch than a difference in the middle.&lt;/p&gt;
&lt;p&gt;Now consider a house number mismatch:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;"12 rue de la paix"&lt;/strong&gt; vs &lt;strong&gt;"21 rue de la paix"&lt;/strong&gt;: the prefix is "1" vs "2", so l = 0. The score penalizes the mismatch at the start, which is what we want - these are two completely different addresses.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="in-python_3"&gt;In Python&lt;/h4&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;jellyfish&lt;/span&gt;

&lt;span class="n"&gt;jellyfish&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;jaro_winkler_similarity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"church rd"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"church road"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# → ~0.963&lt;/span&gt;

&lt;span class="n"&gt;jellyfish&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;jaro_winkler_similarity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"12 rue de la paix"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"21 rue de la paix"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# → ~0.980  (lower score due to no prefix match)&lt;/span&gt;

&lt;span class="n"&gt;jellyfish&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;jaro_winkler_similarity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"12 rue de la paix"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"12 rue de la pai"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# → ~0.988  (strong prefix, only one char missing at end)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h4 id="pros-and-cons_3"&gt;Pros and cons&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pros&lt;/th&gt;
&lt;th&gt;Cons&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Prefix bonus aligns with how we read addresses (number first, then street name)&lt;/td&gt;
&lt;td&gt;Prefix bonus requires consistent formatting - mixed case will kill the bonus&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Often more accurate than plain Jaro for addresses and proper names&lt;/td&gt;
&lt;td&gt;&lt;code&gt;p = 0.1&lt;/code&gt; is conventional; tuning it for your data takes experimentation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Normalized 0-1 score, easy to threshold&lt;/td&gt;
&lt;td&gt;Like Jaro, harder to explain to non-technical stakeholders than edit distance&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="when-to-use-it-for-addresses_3"&gt;When to use it for addresses&lt;/h4&gt;
&lt;p&gt;Jaro-Winkler is the best general-purpose choice for full address comparison when strings are properly normalized (lowercase, consistent formatting). The prefix bonus is particularly useful when the house number is at the start of the string - it correctly penalizes address strings that start with different numbers, since those represent different physical locations regardless of the rest.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="summary-table"&gt;Summary table&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Score range&lt;/th&gt;
&lt;th&gt;Transpositions&lt;/th&gt;
&lt;th&gt;Prefix bonus&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Levenshtein&lt;/td&gt;
&lt;td&gt;Distance&lt;/td&gt;
&lt;td&gt;0 to +inf&lt;/td&gt;
&lt;td&gt;Costs 2&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Abbreviations, insertions, deletions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Damerau-Levenshtein&lt;/td&gt;
&lt;td&gt;Distance&lt;/td&gt;
&lt;td&gt;0 to +inf&lt;/td&gt;
&lt;td&gt;Costs 1&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;User-typed input, keyboard typos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jaro&lt;/td&gt;
&lt;td&gt;Similarity&lt;/td&gt;
&lt;td&gt;0 to 1&lt;/td&gt;
&lt;td&gt;Handled&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Individual address fields&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jaro-Winkler&lt;/td&gt;
&lt;td&gt;Similarity&lt;/td&gt;
&lt;td&gt;0 to 1&lt;/td&gt;
&lt;td&gt;Handled&lt;/td&gt;
&lt;td&gt;Yes (up to 4 chars)&lt;/td&gt;
&lt;td&gt;Full normalized address strings&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Quick decision guide:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;User types addresses into a form&lt;/strong&gt; - use Damerau-Levenshtein. Transpositions are very common in manual input.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You are deduplicating a database of street names&lt;/strong&gt; - use Jaro or Jaro-Winkler on the street name component alone.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You want a single score for a full address string&lt;/strong&gt; - use Jaro-Winkler on normalized strings.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Your main problem is abbreviations&lt;/strong&gt; ("Blvd" vs "Boulevard") - normalize abbreviations first (see below), then any metric will do.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="normalization-the-step-that-matters-more-than-metric-choice"&gt;Normalization: the step that matters more than metric choice&lt;/h3&gt;
&lt;p&gt;No string metric can compensate for what normalization ignores. Before comparing two addresses, apply at least these basics:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Lowercase everything&lt;/strong&gt;: "Baker Street" and "baker street" should score 1.0, not 0.9.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expand abbreviations consistently&lt;/strong&gt;: "St" -&amp;gt; "street", "Blvd" -&amp;gt; "boulevard", "Ave" -&amp;gt; "avenue", "Rd" -&amp;gt; "road". Or shorten everything to a consistent short form.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Remove punctuation&lt;/strong&gt;: "St. James's" and "St Jamess" will score very differently if you keep periods and apostrophes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Normalize whitespace&lt;/strong&gt;: collapse multiple spaces, strip leading/trailing whitespace.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;With these steps, "15 Baker St." and "15 Baker Street" become "15 baker street" and "15 baker street" - identical strings that score perfectly on any metric.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;re&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;normalize_address&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;addr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;addr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;"[.,'\-]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;addr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;"\bst\b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"street"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;addr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;"\bblvd\b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"boulevard"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;addr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;"\bave\b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"avenue"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;addr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;"\brd\b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"road"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;addr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;"\s+"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;" "&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;addr&lt;/span&gt;

&lt;span class="n"&gt;normalize_address&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"15 Baker St."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# "15 baker street"&lt;/span&gt;
&lt;span class="n"&gt;normalize_address&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"15 Baker Street"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# "15 baker street"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;After normalization, both strings are identical and any metric returns a perfect score.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="putting-it-all-together-a-complete-address-comparison"&gt;Putting it all together: a complete address comparison&lt;/h3&gt;
&lt;p&gt;Here is a short example that combines normalization with all four metrics:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;jellyfish&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;re&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;normalize_address&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;addr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;addr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;"[.,'\-]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;addr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;"\bst\b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"street"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;addr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;"\bblvd\b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"boulevard"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;addr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;"\bave\b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"avenue"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;addr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;"\brd\b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"road"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;addr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;"\s+"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;" "&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;addr&lt;/span&gt;

&lt;span class="n"&gt;pairs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"15 Baker St."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"15 Baker Street"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"15 Baker Srteet"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"15 Baker Street"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"12 Rue de la Paix"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"21 Rue de la Paix"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Church Rd"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Church Road"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;pairs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;na&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;normalize_address&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;normalize_address&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;lev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jellyfish&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;levenshtein_distance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;na&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nb&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;dlev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jellyfish&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;damerau_levenshtein_distance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;na&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nb&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;jaro&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jellyfish&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;jaro_similarity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;na&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nb&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;jw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jellyfish&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;jaro_winkler_similarity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;na&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nb&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="si"&gt;!r}&lt;/span&gt;&lt;span class="s2"&gt; vs &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="si"&gt;!r}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"  Levenshtein: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;lev&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, Damerau-Levenshtein: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;dlev&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"  Jaro: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;jaro&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.3f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, Jaro-Winkler: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;jw&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.3f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Expected output:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;'15 Baker St.' vs '15 Baker Street'
* Levenshtein: 0, Damerau-Levenshtein: 0  # normalization made them identical
* Jaro: 1.000, Jaro-Winkler: 1.000

'15 Baker Srteet' vs '15 Baker Street'
* Levenshtein: 2, Damerau-Levenshtein: 1  # one transposition, not two substitutions
* Jaro: 0.978, Jaro-Winkler: 0.987

'12 Rue de la Paix' vs '21 Rue de la Paix'
* Levenshtein: 2, Damerau-Levenshtein: 1  # different house number
* Jaro: 0.980, Jaro-Winkler: 0.980        # no prefix bonus (1 != 2)

'Church Rd' vs 'Church Road'
* Levenshtein: 0, Damerau-Levenshtein: 0  # normalization expanded Rd -&amp;gt; Road
* Jaro: 1.000, Jaro-Winkler: 1.000
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Note how the normalization step handles "St" vs "Street" and "Rd" vs "Road" completely, leaving the metrics to handle what normalization cannot catch (typos, transpositions, genuine differences).&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="where-to-go-from-here"&gt;Where to go from here&lt;/h3&gt;
&lt;p&gt;String similarity metrics are one tool in the address quality toolbox. In geocoding workflows, they are commonly used to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Verify that a geocoded result actually matches the input address (compare the returned address label to the input).&lt;/li&gt;
&lt;li&gt;Deduplicate address lists before batching geocoding requests.&lt;/li&gt;
&lt;li&gt;Build fuzzy search over a local address database before calling a paid API.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you are working on address data quality as part of a geocoding pipeline, these resources may also be useful:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Learn how to geocode large batches cost-effectively: &lt;a href="https://coordable.co/blog/how-to-reduce-geocoding-costs-by-67/"&gt;How to reduce geocoding costs by 67%&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;See what geocoding providers are available and how their prices compare: &lt;a href="https://coordable.co/blog/geocoding-prices-2026/"&gt;Geocoding prices in 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Find the best geocoding provider for your country: &lt;a href="https://coordable.co/country-analysis/best-geocoding-providers-france/"&gt;Best geocoding providers for France&lt;/a&gt;, &lt;a href="https://coordable.co/country-analysis/best-geocoding-providers-united-kingdom/"&gt;UK&lt;/a&gt;, &lt;a href="https://coordable.co/country-analysis/best-geocoding-providers-germany/"&gt;Germany&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://coordable.co" class="learn-more-btn"&gt;Try address geocoding with Coordable&lt;/a&gt;&lt;/p&gt;</description><category>addresses</category><category>data quality</category><category>geocoding</category><category>python</category><category>string matching</category><guid>https://coordable.co/blog/string-distance-metrics-address-comparison/</guid><pubDate>Wed, 01 Apr 2026 10:00:00 GMT</pubDate></item><item><title>UK Address and Postal Data FAQ: AddressBase, UPRN, PAF, and PSGA Explained</title><link>https://coordable.co/blog/uk-address-postal-data-faq/</link><dc:creator>François Andrieux</dc:creator><description>&lt;p&gt;If you work with UK addresses, you've probably encountered terms like &lt;strong&gt;AddressBase&lt;/strong&gt;, &lt;strong&gt;UPRN&lt;/strong&gt;, &lt;strong&gt;PAF&lt;/strong&gt;, and &lt;strong&gt;PSGA&lt;/strong&gt;. These are fundamental components of the UK's address infrastructure, but they can be confusing.&lt;/p&gt;
&lt;p&gt;This FAQ answers the most common questions about UK address and postal data systems. I hope it will help you as it helped me! 🙂&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Looking for practical geocoding solutions? See our &lt;a href="https://coordable.co/country-analysis/best-geocoding-providers-united-kingdom/"&gt;comparison of UK geocoding providers&lt;/a&gt; to find the best API for your needs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Table of contents:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/uk-address-postal-data-faq/#what-is-a-uprn"&gt;What is a UPRN?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/uk-address-postal-data-faq/#what-is-a-usrn"&gt;What is a USRN?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/uk-address-postal-data-faq/#why-do-uprns-exist"&gt;Why do UPRNs exist?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/uk-address-postal-data-faq/#how-to-check-for-a-uprn"&gt;How to check for a UPRN?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/uk-address-postal-data-faq/#what-is-addressbase"&gt;What is AddressBase?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/uk-address-postal-data-faq/#what-are-the-different-addressbase-products"&gt;What are the different AddressBase products?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/uk-address-postal-data-faq/#can-you-give-an-example-of-addressbase-data"&gt;Can you give an example of AddressBase data?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/uk-address-postal-data-faq/#what-is-royal-mail-paf"&gt;What is Royal Mail PAF?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/uk-address-postal-data-faq/#paf-vs-addressbase-whats-the-difference"&gt;PAF vs AddressBase: What's the difference?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/uk-address-postal-data-faq/#is-addressbase-free-and-open-data"&gt;Is AddressBase free and open data?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/uk-address-postal-data-faq/#is-royal-mail-paf-free-and-open-data"&gt;Is Royal Mail PAF free and open data?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/uk-address-postal-data-faq/#what-is-the-public-sector-geospatial-agreement-psga"&gt;What is the Public Sector Geospatial Agreement (PSGA)?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/uk-address-postal-data-faq/#what-are-the-alternatives-to-addressbase-and-paf"&gt;What are the alternatives to AddressBase and PAF?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/uk-address-postal-data-faq/#how-do-uprn-addressbase-and-paf-work-together"&gt;How do UPRN, AddressBase, and PAF work together?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/uk-address-postal-data-faq/#which-should-i-use-addressbase-or-paf"&gt;Which should I use: AddressBase or PAF?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/uk-address-postal-data-faq/#can-i-geocode-uk-addresses-without-addressbase-or-paf"&gt;Can I geocode UK addresses without AddressBase or PAF?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/uk-address-postal-data-faq/#where-can-i-learn-more"&gt;Where can I learn more?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h4 id="what-is-a-uprn"&gt;What is a UPRN?&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;UPRN&lt;/strong&gt; stands for &lt;strong&gt;Unique Property Reference Number&lt;/strong&gt;. It's a unique 12-digit identifier assigned to every addressable location in Great Britain (England, Scotland, and Wales).&lt;/p&gt;
&lt;p&gt;Each property has one UPRN that never changes, even if the address changes. These are simple 12-digit numbers (e.g., &lt;code&gt;100023336956&lt;/code&gt;) that cover residential homes, commercial buildings, sheds, garages, and even mailboxes. The system is managed by GeoPlace, a partnership between the Local Government Association and Ordnance Survey.&lt;/p&gt;
&lt;figure&gt;
    &lt;img src="https://coordable.co/images/uk-address-faq/uprn-example.png" alt="UPRN example showing a property with its unique 12-digit identifier"&gt;
    &lt;figcaption&gt;Example: the 10 Downing Street UPRN is &lt;code&gt;10008517798&lt;/code&gt; (&lt;a href="https://uprn.uk/100023336956"&gt;source&lt;/a&gt;)&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;For example, &lt;code&gt;100023336956&lt;/code&gt; is the UPRN for &lt;code&gt;10 Downing Street, London SW1A 2AA&lt;/code&gt; (the Prime Minister's residence). Even if the building's use or occupant changes, this 12-digit identifier remains constant, ensuring consistent identification across all government systems and databases.&lt;/p&gt;
&lt;p&gt;This UPRN is associated to the &lt;code&gt;8400071&lt;/code&gt; USRN (Unique Street Reference Number) for the street "Downing Street".&lt;/p&gt;
&lt;h4 id="what-is-a-usrn"&gt;What is a USRN?&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;USRN&lt;/strong&gt; stands for &lt;strong&gt;Unique Street Reference Number&lt;/strong&gt;. It's a unique identifier assigned to every street in Great Britain, that can go up to 10 digits long.&lt;/p&gt;
&lt;p&gt;Each street has one USRN that never changes, even if the street name changes. For example, &lt;code&gt;8400071&lt;/code&gt; is the USRN for the street "Downing Street".&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="why-do-uprns-exist"&gt;Why do UPRNs exist?&lt;/h4&gt;
&lt;p&gt;Using addresses as identifiers is problematic because:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Addresses change:&lt;/strong&gt; Streets get renamed, building numbers change&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Typos and variations:&lt;/strong&gt; "High St", "High Street", "HIGH STREET" are all the same place&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inconsistent formatting:&lt;/strong&gt; Different systems store addresses differently&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;UPRNs solve this&lt;/strong&gt; by providing a stable, unique identifier that connects all systems and databases.&lt;/p&gt;
&lt;p&gt;For example, if &lt;code&gt;123 High Street, London&lt;/code&gt; is renamed to &lt;code&gt;123 King Avenue, London&lt;/code&gt;, the UPRN remains the same (e.g., &lt;code&gt;100023336956&lt;/code&gt;). This allows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Government records to stay linked&lt;/li&gt;
&lt;li&gt;Utility companies to maintain service history&lt;/li&gt;
&lt;li&gt;Emergency services to find the correct location&lt;/li&gt;
&lt;li&gt;Council tax records to remain accurate&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id="how-to-check-for-a-uprn"&gt;How to check for a UPRN?&lt;/h4&gt;
&lt;p&gt;You can use the website &lt;a href="https://uprn.uk/"&gt;uprn.uk&lt;/a&gt; to check for a UPRN.&lt;/p&gt;
&lt;figure&gt;
    &lt;img src="https://coordable.co/images/uk-address-faq/uprn-example-2.png" alt="UPRN example showing a property with its unique 12-digit identifier"&gt;
    &lt;figcaption&gt;Example lookup for the UPRN &lt;code&gt;100023336956&lt;/code&gt; (&lt;a href="https://uprn.uk/100023336956"&gt;source&lt;/a&gt;)&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h4 id="what-is-addressbase"&gt;What is AddressBase?&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;AddressBase&lt;/strong&gt; is the most comprehensive and authoritative address database for Great Britain, maintained by Ordnance Survey.&lt;/p&gt;
&lt;figure&gt;
  &lt;img src="https://coordable.co/images/uk-address-faq/addressbase-illustration.png" alt="AddressBase illustration"&gt;
  &lt;figcaption&gt;AddressBase combines UPRNs, addresses, coordinates, and property metadata into a comprehensive database.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;It contains all UPRNs (every property's unique identifier), full addresses (building number/name, street, locality, town, postcode), geographic coordinates (latitude and longitude in British National Grid and WGS84), property classification (residential, commercial, etc.), local authority information (which council area the property belongs to), and multiple address formats (official address, alternative names, historical addresses).&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="what-are-the-different-addressbase-products"&gt;What are the different AddressBase products?&lt;/h4&gt;
&lt;p&gt;Ordnance Survey offers three AddressBase products with varying levels of detail:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AddressBase Core&lt;/strong&gt; provides basic address information with UPRNs and coordinates, suitable for simple address lookup and validation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AddressBase Plus&lt;/strong&gt; is an enhanced dataset with additional address details, multiple address formats (e.g., Welsh language variants), and property status information.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AddressBase Premium&lt;/strong&gt; is the most comprehensive dataset, including full address history, alternative addresses (e.g., previous names), detailed metadata and relationships. It's best for complex applications requiring complete address intelligence.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="can-you-give-an-example-of-addressbase-data"&gt;Can you give an example of AddressBase data?&lt;/h4&gt;
&lt;p&gt;Here's a sample record from AddressBase Plus showing an address in Exeter, United Kingdom:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nt"&gt;uprn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;10094201708&lt;/span&gt;
&lt;span class="nt"&gt;udprn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;
&lt;span class="nt"&gt;parent_uprn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;55508903&lt;/span&gt;
&lt;span class="nt"&gt;sub_building&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"FLAT&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;404"&lt;/span&gt;
&lt;span class="nt"&gt;building_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"CLIFFORD&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;HOUSE"&lt;/span&gt;
&lt;span class="nt"&gt;building_number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;
&lt;span class="nt"&gt;dependent_thoroughfare&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;
&lt;span class="nt"&gt;thoroughfare&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"STADIUM&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;WAY"&lt;/span&gt;
&lt;span class="nt"&gt;double_dependent_locality&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;
&lt;span class="nt"&gt;dependent_locality&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;
&lt;span class="nt"&gt;post_town&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"EXETER"&lt;/span&gt;
&lt;span class="nt"&gt;postcode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"EX4&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;6AX"&lt;/span&gt;
&lt;span class="nt"&gt;rpc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"S"&lt;/span&gt;
&lt;span class="nt"&gt;coordinates&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;292839.08&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;093519.86&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;latitude&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;50.7313689&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;longitude&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;-3.5197896&lt;/span&gt;
&lt;span class="nt"&gt;classification&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;2&lt;/span&gt;
&lt;span class="nt"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"E"&lt;/span&gt;
&lt;span class="nt"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"I"&lt;/span&gt;
&lt;span class="nt"&gt;dates&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;start_date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;2018-07-03&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;last_update&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;2019-11-20&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;entry_date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;2020-06-13&lt;/span&gt;
&lt;span class="nt"&gt;record_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"R"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This record represents &lt;code&gt;Flat 404, Clifford House, Stadium Way, Exeter EX4 6AX&lt;/code&gt;, with coordinates and metadata showing when the address was created and last updated.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="what-is-royal-mail-paf"&gt;What is Royal Mail PAF?&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;PAF&lt;/strong&gt; stands for &lt;strong&gt;Postcode Address File&lt;/strong&gt;. It's &lt;a href="https://www.poweredbypaf.com/"&gt;Royal Mail's database&lt;/a&gt; of all "delivery points" (addresses that receive mail) in the UK.&lt;/p&gt;
&lt;p&gt;Managed by Royal Mail (the UK's postal service), PAF is delivery-focused and contains only addresses where mail is delivered. It's updated regularly to reflect new builds and address changes, covers all UK countries (England, Scotland, Wales, and Northern Ireland), and every address is linked to its postcode.&lt;/p&gt;
&lt;p&gt;Each PAF record contains: building name/number, street name, locality, town, county, postcode, and a delivery point suffix (DPS) — a unique identifier within a postcode.&lt;/p&gt;
&lt;h4 id="paf-vs-addressbase-whats-the-difference"&gt;PAF vs AddressBase: What's the difference?&lt;/h4&gt;
&lt;p&gt;Let's take an example:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Royal Mail PAF&lt;/th&gt;
&lt;th&gt;AddressBase&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Coverage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;UK (including Northern Ireland)&lt;/td&gt;
&lt;td&gt;Great Britain only (England, Scotland, Wales)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Focus&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mail delivery points&lt;/td&gt;
&lt;td&gt;All addressable locations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Identifier&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Postcode + DPS&lt;/td&gt;
&lt;td&gt;UPRN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Includes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Only addresses receiving mail&lt;/td&gt;
&lt;td&gt;All properties (including non-postal)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Managed by&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Royal Mail&lt;/td&gt;
&lt;td&gt;Ordnance Survey / GeoPlace&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Coordinates&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Not included (usually)&lt;/td&gt;
&lt;td&gt;Included&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;To illustrate: a property might be in PAF if it receives mail (e.g., &lt;code&gt;123 High Street, London SW1A 1AA&lt;/code&gt;), but in AddressBase whether or not it receives mail (e.g., a shed, garage, or temporary structure). Some properties (like construction sites or private roads) may have a UPRN but no PAF entry because Royal Mail doesn't deliver there.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="is-addressbase-free-and-open-data"&gt;Is AddressBase free and open data?&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; Partially open — it depends on who you are and how you'll use it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;✅ Free access:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For UK public sector organizations, AddressBase is available through the &lt;strong&gt;Public Sector Geospatial Agreement (PSGA)&lt;/strong&gt; (see below about this). This includes AddressBase Core and Plus, free to use for public sector purposes.&lt;/p&gt;
&lt;p&gt;For others, some local authorities publish UPRN data as open data (not universal), and Ordnance Survey's OpenData products exist, but &lt;strong&gt;AddressBase is NOT included&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;💰 Paid licenses required:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For commercial use, businesses need a paid license. Various developer license tiers are available based on usage volume. AddressBase Premium requires a paid license even for many public sector uses beyond basic PSGA coverage.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Important note:&lt;/strong&gt; While UPRN itself is just a number, accessing the full database requires licensing. Using UPRNs in your application may require a license even if you obtain them elsewhere. Always check current terms on the &lt;a href="https://www.ordnancesurvey.co.uk/"&gt;Ordnance Survey website&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h4 id="is-royal-mail-paf-free-and-open-data"&gt;Is Royal Mail PAF free and open data?&lt;/h4&gt;
&lt;p&gt;No, PAF is not free or open data. Royal Mail licenses PAF commercially (see &lt;a href="https://www.poweredbypaf.com/pricing/"&gt;Royal Mail PAF pricing&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;You can access PAF in three ways: &lt;strong&gt;directly from Royal Mail&lt;/strong&gt; (various commercial licenses available, with pricing based on usage and application type, offering the full dataset or subsets for specific regions), &lt;strong&gt;through licensed resellers&lt;/strong&gt; (many address validation and geocoding providers like Loqate, Postcode Anywhere, and Ideal Postcodes license PAF, allowing you to access it indirectly through their APIs), or &lt;strong&gt;for public sector&lt;/strong&gt; (some limited access via PSGA, often supplemented with AddressBase).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Check out our &lt;a href="https://coordable.co/country-analysis/best-geocoding-providers-united-kingdom/"&gt;comparison of UK geocoding providers&lt;/a&gt; to find the best API for your needs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Royal Mail is a commercial company, and PAF is valuable intellectual property. Maintaining and updating the database requires significant resources, funded through licensing fees.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="what-is-the-public-sector-geospatial-agreement-psga"&gt;What is the Public Sector Geospatial Agreement (PSGA)?&lt;/h4&gt;
&lt;p&gt;The &lt;strong&gt;PSGA&lt;/strong&gt; is a UK government initiative that provides &lt;strong&gt;free access&lt;/strong&gt; to Ordnance Survey data for public sector organizations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Who qualifies?&lt;/strong&gt; UK public sector organizations, including central government departments, local councils and authorities, NHS organizations, police and fire services, educational institutions (schools, universities), and other public bodies.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What data is included?&lt;/strong&gt; The PSGA provides access to AddressBase Core (free), AddressBase Plus (free), AddressBase Premium (limited access, may require additional licenses), OS MasterMap and other Ordnance Survey datasets, plus API access for online services.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What are the terms?&lt;/strong&gt; The data is free to use for public sector business but cannot be shared with commercial third parties, cannot be resold or used for purely commercial purposes, and must be used for public sector functions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How to access PSGA data:&lt;/strong&gt; Check if your organization qualifies, register on the &lt;a href="https://www.ordnancesurvey.co.uk/business-government/public-sector-geospatial-agreement"&gt;Ordnance Survey website&lt;/a&gt;, download data or access APIs, and use in compliance with PSGA terms.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="what-are-the-alternatives-to-addressbase-and-paf"&gt;What are the alternatives to AddressBase and PAF?&lt;/h4&gt;
&lt;p&gt;If you need free or open UK address data, consider these alternatives:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OpenAddresses UK&lt;/strong&gt; is a crowdsourced, open-source address database with good coverage in many areas (though not complete), available under open data (public domain) license at &lt;a href="https://openaddresses.io"&gt;openaddresses.io&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OpenStreetMap (OSM)&lt;/strong&gt; offers community-maintained map data with UK addresses. Coverage varies by area (excellent in cities, patchy in rural areas), licensed under ODbL (Open Database License), accessible at &lt;a href="https://www.openstreetmap.org"&gt;openstreetmap.org&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ONS Postcode Directory (ONSPD)&lt;/strong&gt; from the Office for National Statistics provides all UK postcodes with geographic info under the Open Government License at &lt;a href="https://geoportal.statistics.gov.uk/"&gt;ONS Geoportal&lt;/a&gt;. Note: it contains postcodes and coordinates, not full addresses.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Local Authority open data:&lt;/strong&gt; Some councils publish their address data (coverage varies widely by council), usually under the Open Government License. Check individual council open data portals.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Good to know:&lt;/strong&gt; AddressBase and PAF are more complete and accurate, commercial data is updated more frequently, licensed data comes with support while open data is "as-is", and commercial licenses are clear while open data usage can be complex.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h4 id="how-do-uprn-addressbase-and-paf-work-together"&gt;How do UPRN, AddressBase, and PAF work together?&lt;/h4&gt;
&lt;p&gt;In short, they complement each other in the UK address ecosystem.&lt;/p&gt;
&lt;p&gt;Here's an example workflow: imagine a utility company needs to manage customer accounts. A customer signs up with address "10 Downing Street, London SW1A 2AA". The system looks up the address in AddressBase, gets UPRN &lt;code&gt;10008517798&lt;/code&gt; and coordinates &lt;code&gt;51.5034, -0.1276&lt;/code&gt;, validates the postcode using PAF to confirm it's a mail delivery point, stores the UPRN as the primary identifier, and links all services to this UPRN (billing, service calls, maintenance history).&lt;/p&gt;
&lt;figure&gt;
  &lt;img src="https://coordable.co/images/uk-address-faq/ecosystem-diagram.png" alt="Diagram showing how UPRN, AddressBase, and PAF relate to each other"&gt;
  &lt;figcaption&gt;The UK address ecosystem: UPRNs identify properties, AddressBase provides comprehensive data, and PAF focuses on mail delivery.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The benefits are clear: if the address changes, the UPRN stays the same; coordinates enable field service routing; the postcode confirms mail delivery is possible; and there are no duplicate customer records.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="which-should-i-use-addressbase-or-paf"&gt;Which should I use: AddressBase or PAF?&lt;/h4&gt;
&lt;p&gt;It depends on your use case:&lt;/p&gt;
&lt;p&gt;Use &lt;strong&gt;PAF&lt;/strong&gt; if you need postcode validation, mail delivery confirmation, address formatting for postal services, Northern Ireland addresses, or simple address lookup by postcode.&lt;/p&gt;
&lt;p&gt;Use &lt;strong&gt;AddressBase&lt;/strong&gt; if you need UPRNs for data linking, geographic coordinates, all addressable locations (not just postal), property classification, local authority boundaries, or historical address data.&lt;/p&gt;
&lt;p&gt;Use &lt;strong&gt;both&lt;/strong&gt; if you need complete address intelligence, geocoding with postal validation, maximum coverage and accuracy, or integration with multiple systems.&lt;/p&gt;
&lt;p&gt;Many organizations use both: AddressBase for the authoritative address register and UPRNs, and PAF for postal validation and formatting.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="can-i-geocode-uk-addresses-without-addressbase-or-paf"&gt;Can I geocode UK addresses without AddressBase or PAF?&lt;/h4&gt;
&lt;p&gt;Yes! You have several options:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Global geocoding providers&lt;/strong&gt; include Google Maps Geocoding API (excellent for UK addresses), HERE Geocoding (good UK coverage), Mapbox Geocoding (uses OpenStreetMap + proprietary data), and TomTom Geocoding (commercial-grade accuracy). These services have their own address databases, often incorporating multiple sources.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UK-specific geocoding services&lt;/strong&gt; include Ideal Postcodes (uses OS data, licensed), Loqate (uses PAF and other data), and Postcode Anywhere (UK-focused address validation).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Open-source geocoding&lt;/strong&gt; options include Nominatim (OpenStreetMap geocoder, free and open-source) and Pelias (open-source geocoder that can use OpenAddresses).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Learn more&lt;/strong&gt; in our comparison of UK geocoding providers: &lt;a href="https://coordable.co/country-analysis/best-geocoding-providers-united-kingdom/"&gt;Best Geocoding Providers for the United Kingdom&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h4 id="where-can-i-learn-more"&gt;Where can I learn more?&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Official sources:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ordnance Survey:&lt;/strong&gt; &lt;a href="https://www.ordnancesurvey.co.uk/"&gt;ordnancesurvey.co.uk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GeoPlace (UPRN):&lt;/strong&gt; &lt;a href="https://www.geoplace.co.uk/"&gt;geoplace.co.uk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Royal Mail PAF:&lt;/strong&gt; &lt;a href="https://www.royalmail.com/business/services/marketing/data-optimisation/paf"&gt;royalmail.com/business/services/marketing/data-optimisation/paf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PSGA Information:&lt;/strong&gt; &lt;a href="https://www.ordnancesurvey.co.uk/business-government/public-sector-geospatial-agreement"&gt;ordnancesurvey.co.uk/psga&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Related articles:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-geocoding-works-a-simple-guide/"&gt;How geocoding works: A simple guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/country-analysis/best-geocoding-providers-united-kingdom/"&gt;UK Country Analysis&lt;/a&gt; — Geocoding performance in the UK&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Need help with UK addresses?&lt;/strong&gt; &lt;a href="https://coordable.co"&gt;Coordable&lt;/a&gt; can help you geocode, validate, and manage UK addresses with high accuracy, supporting multiple providers and data sources.&lt;/p&gt;
&lt;/blockquote&gt;</description><category>addresses</category><category>faq</category><category>geocoding</category><category>guides</category><category>uk</category><guid>https://coordable.co/blog/uk-address-postal-data-faq/</guid><pubDate>Sun, 02 Nov 2025 10:00:00 GMT</pubDate></item><item><title>How to geocode addresses: Transform text addresses into GPS coordinates</title><link>https://coordable.co/blog/how-to-geocode-addresses/</link><dc:creator>François Andrieux</dc:creator><description>&lt;h3 id="how-to-geocode-addresses-a-practical-guide"&gt;How to geocode addresses: a practical guide&lt;/h3&gt;
&lt;p&gt;You've probably found yourself needing to &lt;strong&gt;convert addresses into coordinates&lt;/strong&gt;. Maybe you have a list of customer addresses and want to see them on a map. Or perhaps you're building an app that needs to locate places automatically.&lt;/p&gt;
&lt;p&gt;Whatever your situation, you've come to the right place! This guide will walk you through exactly how to convert addresses into coordinates using different methods, from simple web tools to powerful APIs. We'll explain &lt;strong&gt;why&lt;/strong&gt; each method exists and &lt;strong&gt;when&lt;/strong&gt; to use it, so you can choose the best approach for your needs.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: If you're curious about &lt;em&gt;how&lt;/em&gt; geocoding works behind the scenes (the technical process), check out our guide: &lt;a href="https://coordable.co/blog/how-geocoding-works-a-simple-guide/"&gt;How geocoding works: A simple guide&lt;/a&gt;. This article focuses on the practical "how-to" - showing you the tools and steps to actually geocode addresses.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Table of contents:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="toc"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-geocode-addresses/#how-to-geocode-addresses-a-practical-guide"&gt;How to geocode addresses: a practical guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-geocode-addresses/#two-main-approaches-web-interfaces-vs-apis"&gt;Two main approaches: web interfaces vs APIs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-geocode-addresses/#geocoding-one-address-with-google-maps"&gt;Geocoding one address with Google Maps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-geocode-addresses/#geocoding-multiple-addresses-with-coordable-excelcsv"&gt;Geocoding multiple addresses with Coordable (Excel/CSV)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-geocode-addresses/#geocoding-multiple-addresses-with-apis"&gt;Geocoding multiple addresses with APIs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-geocode-addresses/#meta-geocoding-strategies"&gt;Meta-geocoding strategies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-geocode-addresses/#what-to-do-after-geocoding"&gt;What to do after geocoding&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-geocode-addresses/#1-verify-your-results"&gt;1. Verify your results&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-geocode-addresses/#2-visualize-and-the-results"&gt;2. Visualize and the results&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-geocode-addresses/#best-practices-for-quality-results"&gt;Best practices for quality results&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-geocode-addresses/#conclusion"&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h3 id="two-main-approaches-web-interfaces-vs-apis"&gt;Two main approaches: web interfaces vs APIs&lt;/h3&gt;
&lt;p&gt;Before we dive into the step-by-step instructions, let's understand why there are different ways to geocode addresses. The truth is, &lt;strong&gt;different situations call for different tools&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Web interfaces&lt;/strong&gt; are perfect for one-time tasks, small batches, or when you want immediate visual results.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;APIs and developer tools&lt;/strong&gt; make sense when you need automation, integration into applications, or to process many addresses regularly.&lt;/p&gt;
&lt;p&gt;The good news? You don't need to be a software developer to use APIs. We'll show you both approaches, starting with the simplest one.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="geocoding-one-address-with-google-maps"&gt;Geocoding one address with Google Maps&lt;/h3&gt;
&lt;p&gt;Let's take an example with a well known interface: &lt;strong&gt;Google Maps&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Google Maps is easy to use, and it's free. If you have only one address to convert to coordinates, this is probably the simplest and fastest way to do it.&lt;/p&gt;
&lt;p&gt;And it's actually possible to use it geocode addresses and save their latitude/longitude. Here is how to do it:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Open &lt;a href="https://maps.google.com"&gt;Google Maps&lt;/a&gt;&lt;/strong&gt; in your web browser&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Type your address&lt;/strong&gt; in the search box (e.g., &lt;code&gt;530 Hancock St, Brooklyn, USA&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Right-click on the red marker&lt;/strong&gt; that appears on the map&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Click on the coordinates&lt;/strong&gt; that appear in the popup menu&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The coordinates are copied&lt;/strong&gt; to your clipboard, as latitude and longitude (e.g: &lt;code&gt;40.68421, -73.934043&lt;/code&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;
  &lt;img src="https://coordable.co/images/how-to-geocode-addresses/google-maps-interface.png" alt="Google Maps example"&gt;
  &lt;figcaption&gt;How to geocode a single address with Google Maps&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;That's it! You now have the latitude and longitude for that address.&lt;/p&gt;
&lt;p&gt;Google Maps is great for one-off lookups, but it's not designed for batch processing. If you have many addresses, you'll need to repeat this process for each one, which quickly becomes tedious.&lt;/p&gt;
&lt;p&gt;It's possible to use Google My Maps to display data, but it requires latitude and longitude coordinates, not the addresses... And do not allow exporting data.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="geocoding-multiple-addresses-with-coordable-excelcsv"&gt;Geocoding multiple addresses with Coordable (Excel/CSV)&lt;/h3&gt;
&lt;p&gt;If you have multiple addresses in an Excel file and want to see them all on a map, &lt;a href="https://coordable.co"&gt;Coordable&lt;/a&gt; offers a powerful web interface, with batch processing and visualization. Here is how to do it:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Go to &lt;a href="https://coordable.co"&gt;Coordable&lt;/a&gt;&lt;/strong&gt; and create an account (free tier available)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Upload your addresses&lt;/strong&gt; - you can upload a CSV file or Excel file with a column (or many columns) containing the addresses you want to geocode.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Select your geocoding provider&lt;/strong&gt; from the dropdown (Google Maps, HERE, Mapbox, etc.). Choose the most appropriate provider for your needs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Start the geocoding job&lt;/strong&gt; - Coordable processes all your addresses&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;View results&lt;/strong&gt; - you can see the results on a map and in a table&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Export your results&lt;/strong&gt; - you can download the results with latitude and longitude, and other geocoding metadata&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;
  &lt;img src="https://coordable.co/images/how-to-geocode-addresses/coordable-upload-interface.png" alt="Coordable interface"&gt;
  &lt;figcaption&gt;The upload interface of Coordable accepts Excel or CSV files.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Coordable transparently handles the geocoding process for you. It gives a clear view on the results and classify addresses for further analysis:&lt;/p&gt;
&lt;figure&gt;
  &lt;img src="https://coordable.co/images/how-to-geocode-addresses/coordable-analytics-1.png" alt="Coordable results"&gt;
  &lt;figcaption&gt;Coordable shows geocoding success rates and types of addresses.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Results are shown on a map and in a table. You can filter on columns to analyse the results, and you can also export.&lt;/p&gt;
&lt;figure&gt;
  &lt;img src="https://coordable.co/images/how-to-geocode-addresses/coordable-analytics-2.png" alt="Coordable results"&gt;
  &lt;figcaption&gt;Table and map views of the results.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;There is no limit in the number of addresses you can geocode. Coordable geocoding by batches automatically and notify you when it's done. It's the &lt;strong&gt;easiest and fastest way&lt;/strong&gt; to geocode a large number of addresses.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://app.coordable.co/" class="learn-more-btn"&gt;Try the coordable app&lt;/a&gt;&lt;/p&gt;

&lt;hr&gt;
&lt;h3 id="geocoding-multiple-addresses-with-apis"&gt;Geocoding multiple addresses with APIs&lt;/h3&gt;
&lt;p&gt;APIs (Application Programming Interfaces) let you geocode addresses programmatically. This means you can automate the process, integrate it into your applications, or process thousands of addresses at once. Here is how to do it:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Get an API key&lt;/strong&gt; - you can get an API key from the geocoding provider you want to use.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Make an API HTTP request&lt;/strong&gt; - you can make an API HTTP request to the geocoding provider you want to use.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Handle the response&lt;/strong&gt; - save components, coordinates, handle errors, etc.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Using an API usually require some technical knowledge, and you need to handle the response from the API. Geocoding APIs are not uniformized, which can make it somehow hard to change from an API to an other.&lt;/p&gt;
&lt;!-- TODO: list X new articles "how to geocode with X (code)". 2 parts: 1. use the API directly, 2. use coordable (best) --&gt;

&lt;p&gt;Most of the time, APIs return raw coordinates (latitude, longitude), formatted addresses, and confidence scores. Sometimes they also include address components and place types. However, &lt;strong&gt;APIs don't provide&lt;/strong&gt; visual maps of results, table views for batch processing, built-in quality verification, easy export to common formats, or visual feedback on accuracy.&lt;/p&gt;
&lt;p&gt;This is why many people use APIs for automation but then need additional tools to visualize and verify results. &lt;a href="https://coordable.co"&gt;Coordable&lt;/a&gt; fills this gap by providing API-like automation with built-in visualization and quality checks.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="meta-geocoding-strategies"&gt;Meta-geocoding strategies&lt;/h3&gt;
&lt;p&gt;It's also possible to &lt;strong&gt;combine&lt;/strong&gt; multiple APIs in a cascade way. Here are at least two benefical ways:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;To get higher geocoding rates&lt;/strong&gt;: You could geocode 90% of the addresses using a local, open-source geocoding provider (e.g. a state geocoding service), then rely on the commercial provider for the remaining 10% that the initial provider cannot geocode.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;To pick the best result&lt;/strong&gt;: Some providers work well for POIs (restaurants, enterprises, etc.) and others for residential addresses. Combining 2 or more geocoding providers can help you get the best result possible. However, such strategy require a good understanding of each provider strengths and weaknesses.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Good to know&lt;/strong&gt;: Coordable has out-of-the-box capabilities to implement meta-geocoding strategies. The Coordable API allow you to pick one or multiple providers, and even to add a custom endpoint for geocoding.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="what-to-do-after-geocoding"&gt;What to do after geocoding&lt;/h3&gt;
&lt;p&gt;Geocoding your addresses is just the first step. Here's what you should do next to ensure quality results:&lt;/p&gt;
&lt;h4 id="1-verify-your-results"&gt;1. Verify your results&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Don't trust results blindly!&lt;/strong&gt; Even the best geocoding services can make mistakes. Always verify:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Check a few results manually&lt;/strong&gt; - look them up on a map to confirm they're correct&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Review confidence scores&lt;/strong&gt; - if the API provides them, pay attention to low-confidence results&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Look for outliers&lt;/strong&gt; - addresses that seem to be in the wrong country or region&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check for false positives&lt;/strong&gt; - results that look confident but are actually wrong&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Good to know:&lt;/strong&gt; &lt;a href="https://coordable.co"&gt;Coordable&lt;/a&gt; includes a built-in verification engine that automatically flags potentially incorrect results, making it easier to spot problems.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id="2-visualize-and-the-results"&gt;2. Visualize and the results&lt;/h4&gt;
&lt;p&gt;Seeing your geocoded addresses on a map helps you&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Spot errors&lt;/strong&gt; - addresses in wrong locations are obvious on a map&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Understand patterns&lt;/strong&gt; - see clusters, distributions, and geographic relationships&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Share results&lt;/strong&gt; - maps are easier to understand than coordinate lists&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tools like Coordable provide built-in map visualization, or you can use external mapping tools (ArcGIS, QGIS, etc.) to create custom visualizations.&lt;/p&gt;
&lt;p&gt;QGIS, as an example, is a free and open-source GIS software that does it very well. Here is an example of a map of the results:&lt;/p&gt;
&lt;figure&gt;
  &lt;img src="https://coordable.co/images/how-to-geocode-addresses/qgis-example.png" alt="QGIS map"&gt;
  &lt;figcaption&gt;QGIS example of a map of the results.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;You can also use mapping libraries (Leaflet, Mapbox GL, Google Maps) to create custom visualizations.&lt;/p&gt;
&lt;h3 id="best-practices-for-quality-results"&gt;Best practices for quality results&lt;/h3&gt;
&lt;p&gt;Geocoding is complex problem to solve. An address that seem obvious to you might be difficult to geocode for a machine. Here are some best practices to help a geocoding engine:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Clean your addresses&lt;/strong&gt;: remove typos, standardize formats (learn more about &lt;a href="https://coordable.co/blog/how-geocoding-works-a-simple-guide/"&gt;how geocoding works&lt;/a&gt; to understand why this matters)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Add context&lt;/strong&gt;: include country, postal code when possible&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Validate addresses&lt;/strong&gt;: check if they exist before geocoding, when possible&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Pro tip:&lt;/strong&gt; If you're processing many addresses, start with a small sample (10-20 addresses) to test your workflow and verify quality before processing the full dataset.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id="conclusion"&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Geocoding addresses doesn't have to be complicated. Whether you need to &lt;strong&gt;transform text addresses into GPS coordinates&lt;/strong&gt; for a one-time project or set up automated geocoding for thousands of addresses, there's a method that fits your needs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Remember:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Don't trust results blindly&lt;/strong&gt; - always verify geocoding results, especially for critical applications&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Analyze your results&lt;/strong&gt; - check completion rates, accuracy, and identify patterns in failures&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pick the best geocoding provider&lt;/strong&gt; based on your analysis and completion rate - different providers work better for different regions and address types&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The key is choosing the right tool for your specific situation. Start simple with a web interface if you're new to geocoding, then move to APIs if you need to scale up or automate.&lt;/p&gt;
&lt;p&gt;If you want to learn more about how geocoding works behind the scenes, check out our guide: &lt;a href="https://coordable.co/blog/how-geocoding-works-a-simple-guide/"&gt;How geocoding works: A simple guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For country-specific recommendations and provider comparisons, see our country analyses:
- &lt;a href="https://coordable.co/country-analysis/best-geocoding-providers-france/"&gt;Best Geocoding Providers for France&lt;/a&gt;
- &lt;a href="https://coordable.co/country-analysis/best-geocoding-providers-united-kingdom/"&gt;Best Geocoding Providers for the United Kingdom&lt;/a&gt;
- &lt;a href="https://coordable.co/country-analysis/best-geocoding-providers-germany/"&gt;Best Geocoding Providers for Germany&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ready to get started? If you need to geocode addresses with visualization and quality checks, &lt;a href="https://coordable.co"&gt;try Coordable&lt;/a&gt; - it's designed to make geocoding easy, whether you have one address or thousands.&lt;/p&gt;
&lt;p&gt;Happy geocoding! ⭐&lt;/p&gt;</description><category>addresses</category><category>coordinates</category><category>geocoding</category><category>guides</category><category>how-to</category><guid>https://coordable.co/blog/how-to-geocode-addresses/</guid><pubDate>Wed, 15 Jan 2025 10:00:00 GMT</pubDate></item></channel></rss>