<?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 by François Andrieux)</title><link>https://coordable.co/</link><description></description><atom:link href="https://coordable.co/authors/francois-andrieux.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>Mon, 13 Apr 2026 12:12:34 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>US Census + Google Maps: How to cut geocoding costs by 90% for US addresses</title><link>https://coordable.co/blog/how-to-cut-geocoding-costs-by-90-for-us-addresses-census-google-maps/</link><dc:creator>François Andrieux</dc:creator><description>&lt;h3 id="the-setup"&gt;The setup&lt;/h3&gt;
&lt;p&gt;We wanted to test the effectiveness of a cascading geocoding strategy for US addresses. We took 1,000 real US addresses (a mix of residential and business addresses, of variable quality but overall correct) and ran three geocoding tests.&lt;/p&gt;
&lt;p&gt;Here is the summary of the results:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Test&lt;/th&gt;
&lt;th&gt;Provider(s)&lt;/th&gt;
&lt;th&gt;Addresses resolved&lt;/th&gt;
&lt;th&gt;Cost per 1,000&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;US Census only&lt;/td&gt;
&lt;td&gt;91.9%&lt;/td&gt;
&lt;td&gt;$0.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Google Maps only&lt;/td&gt;
&lt;td&gt;92.6%&lt;/td&gt;
&lt;td&gt;$5.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;US Census → Google Maps (cascade)&lt;/td&gt;
&lt;td&gt;97.3%&lt;/td&gt;
&lt;td&gt;$0.41&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The cascade delivers &lt;strong&gt;97.3% addresses found at $0.41&lt;/strong&gt;, compared to $5.00 for Google Maps alone. That is a &lt;strong&gt;90% cost reduction&lt;/strong&gt; with a &lt;strong&gt;+5.4 percentage point improvement&lt;/strong&gt; in addresses resolved. Amazing right?&lt;/p&gt;
&lt;p&gt;Read on to see how each test was run and what the results look like.&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/how-to-cut-geocoding-costs-by-90-for-us-addresses-census-google-maps/#the-setup"&gt;The setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-cut-geocoding-costs-by-90-for-us-addresses-census-google-maps/#test-1-us-census-geocoder"&gt;Test 1: US Census Geocoder&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-cut-geocoding-costs-by-90-for-us-addresses-census-google-maps/#what-is-the-us-census-geocoder"&gt;What is the US Census Geocoder?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-cut-geocoding-costs-by-90-for-us-addresses-census-google-maps/#results"&gt;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-cut-geocoding-costs-by-90-for-us-addresses-census-google-maps/#test-2-google-maps-geocoding-api"&gt;Test 2: Google Maps Geocoding API&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-cut-geocoding-costs-by-90-for-us-addresses-census-google-maps/#what-is-google-maps-geocoding"&gt;What is Google Maps Geocoding?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-cut-geocoding-costs-by-90-for-us-addresses-census-google-maps/#results_1"&gt;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-cut-geocoding-costs-by-90-for-us-addresses-census-google-maps/#test-3-us-census-google-maps-cascade"&gt;Test 3: US Census + Google Maps (cascade)&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-cut-geocoding-costs-by-90-for-us-addresses-census-google-maps/#how-the-cascade-works"&gt;How the cascade works&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-cut-geocoding-costs-by-90-for-us-addresses-census-google-maps/#results_2"&gt;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-cut-geocoding-costs-by-90-for-us-addresses-census-google-maps/#going-further-adding-a-third-provider"&gt;Going further: adding a third provider&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-cut-geocoding-costs-by-90-for-us-addresses-census-google-maps/#conclusion"&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-cut-geocoding-costs-by-90-for-us-addresses-census-google-maps/#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="test-1-us-census-geocoder"&gt;Test 1: US Census Geocoder&lt;/h3&gt;
&lt;h4 id="what-is-the-us-census-geocoder"&gt;What is the US Census Geocoder?&lt;/h4&gt;
&lt;p&gt;The &lt;a href="https://geocoding.geo.census.gov/"&gt;US Census Geocoder&lt;/a&gt; is a &lt;strong&gt;public and free API&lt;/strong&gt; provided by the US federal government. It is not open source (the underlying software and data are maintained by the Census Bureau), but it is freely accessible, requires no API key, and has no published usage limits or cost.&lt;/p&gt;
&lt;p&gt;It is built on &lt;a href="https://www.census.gov/geographies/mapping-files/time-series/geo/tiger-line-file.html"&gt;TIGER/Line&lt;/a&gt; data, the official US address dataset. Results are &lt;strong&gt;interpolated on the street&lt;/strong&gt; rather than placed at the exact building location (no rooftop precision). For most use cases (delivery routing, territory analysis, customer mapping), street-level interpolation is entirely sufficient.&lt;/p&gt;
&lt;p&gt;The output data is in the public domain, with no licensing restrictions on how you store or use the coordinates.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Important limitation:&lt;/strong&gt; US Census only understands structured street addresses. It cannot geocode points of interest, business names, or company names. If your dataset contains entries like "Starbucks, Chicago" or "Boeing headquarters", US Census will return nothing for those rows. In that case, the 90% cost reduction figure will not hold: a commercial provider will need to handle a much larger share of your requests. &lt;strong&gt;This strategy works best for datasets of clean street addresses ; see below for a solution.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id="results"&gt;Results&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Accuracy: 91.9%&lt;/strong&gt; (919 out of 1,000 addresses resolved)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cost: $0.00&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
  &lt;img src="https://coordable.co/images/how-to-cut-geocoding-costs-by-90-for-us-addresses-census-google-maps/test1-us-census-screenshot.png" alt="Screenshot of the US Census geocoding session: 91.9% valid results, $0 cost."&gt;
  &lt;figcaption&gt;Test 1, US Census only: 919/1,000 addresses resolved, at no cost.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;91.9% is a strong result for a free API. The 8.1% of unresolved addresses are typically due to non-standard formatting, missing components, or addresses that simply do not appear in the TIGER/Line dataset.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="test-2-google-maps-geocoding-api"&gt;Test 2: Google Maps Geocoding API&lt;/h3&gt;
&lt;h4 id="what-is-google-maps-geocoding"&gt;What is Google Maps Geocoding?&lt;/h4&gt;
&lt;p&gt;Google Maps is one of the most widely used geocoding providers. At &lt;strong&gt;$5.00 per 1,000 addresses&lt;/strong&gt; (after the free quota), it is also one of the most expensive.&lt;/p&gt;
&lt;p&gt;It returns different precision levels: &lt;code&gt;ROOFTOP&lt;/code&gt; for exact building locations, and &lt;code&gt;RANGE_INTERPOLATED&lt;/code&gt; for street-level interpolation. For a fair comparison with US Census, which only returns street-level results, we accept &lt;strong&gt;both&lt;/strong&gt; &lt;code&gt;ROOFTOP&lt;/code&gt; and &lt;code&gt;RANGE_INTERPOLATED&lt;/code&gt; in this test.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Licensing note:&lt;/strong&gt; Google Maps results come with significant restrictions beyond the price. Google's Terms of Service do not allow you to store geocoded coordinates long-term or use them outside of a Google Maps display context. If you need to build a database of geocoded addresses, use the results in a non-Google mapping tool, or export coordinates for analysis, you may be violating Google's terms. This is an important constraint to factor in before committing to Google as your primary geocoding provider.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: Google free quota is excluded from these cost figures, as its effective value depends on overall usage across all Google Maps products. The $5.00 figure reflects the standard pay-as-you-go rate.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id="results_1"&gt;Results&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Accuracy: 92.6%&lt;/strong&gt; (926 out of 1,000 addresses resolved)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cost: $5.00&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
  &lt;img src="https://coordable.co/images/how-to-cut-geocoding-costs-by-90-for-us-addresses-census-google-maps/test2-google-maps-screenshot.png" alt="Screenshot of the Google Maps geocoding session: 92.6% valid results, $5.00 per 1,000."&gt;
  &lt;figcaption&gt;Test 2, Google Maps only: 926/1,000 addresses resolved at ROOFTOP or RANGE_INTERPOLATED level, at $5.00 per 1,000.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Google Maps edges out US Census by 0.7 percentage points (92.6% vs 91.9%), but at a cost of $5.00 per 1,000 addresses vs $0. For this dataset, paying for Google Maps buys very little extra accuracy on its own.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="test-3-us-census-google-maps-cascade"&gt;Test 3: US Census + Google Maps (cascade)&lt;/h3&gt;
&lt;h4 id="how-the-cascade-works"&gt;How the cascade works&lt;/h4&gt;
&lt;p&gt;The cascading strategy is straightforward:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Send every address to US Census first.&lt;/strong&gt; If US Census returns a valid result, use it. Cost: $0.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;For addresses that US Census could not resolve&lt;/strong&gt;, send them to Google Maps. Cost: $5.00 per 1,000 for this subset only.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In our test, approximately &lt;strong&gt;90% of addresses were resolved by US Census&lt;/strong&gt; (free), and only &lt;strong&gt;~8% required Google Maps&lt;/strong&gt;, at a total cost of $0.41. The remaining ~2.7% were not resolved by either provider.&lt;/p&gt;
&lt;p&gt;This is why the cost drops so dramatically: instead of paying $5.00 for every address, you only pay Google's rate for the small fraction that US Census could not handle.&lt;/p&gt;
&lt;figure&gt;
  &lt;img src="https://coordable.co/images/how-to-cut-geocoding-costs-by-90-for-us-addresses-census-google-maps/workflow-visual.png" alt="Screenshot of the cascading geocoding workflow in Coordable: US Census as step 1, Google Maps as step 2 with ROOFTOP and RANGE_INTERPOLATED accepted."&gt;
  &lt;figcaption&gt;The two-provider cascade configured in Coordable: US Census first, then Google Maps for unresolved addresses, accepting both ROOFTOP and RANGE_INTERPOLATED results.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h4 id="results_2"&gt;Results&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Accuracy: 97.3%&lt;/strong&gt; (973 out of 1,000 addresses resolved)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cost: $0.41&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Provider split: ~90% resolved by US Census · ~8% resolved by Google Maps · ~2.7% unresolved&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
  &lt;img src="https://coordable.co/images/how-to-cut-geocoding-costs-by-90-for-us-addresses-census-google-maps/test3-cascade-screenshot.png" alt="Screenshot of the cascading geocoding session: 97.3% valid results, $0.41 per 1,000."&gt;
  &lt;figcaption&gt;Test 3, US Census → Google Maps cascade: 973/1,000 addresses resolved, at $0.41 per 1,000.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The cascade delivers a &lt;strong&gt;+5.4 percentage point improvement&lt;/strong&gt; over either provider alone, at 8% of the cost of Google Maps. The key insight is that US Census and Google Maps fail on &lt;em&gt;different&lt;/em&gt; addresses. Addresses that US Census cannot parse or match are often resolved by Google's more robust parsing engine, and vice versa.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://coordable.co" class="learn-more-btn"&gt;Set up cascading geocoding with Coordable&lt;/a&gt;&lt;/p&gt;

&lt;hr&gt;
&lt;h3 id="going-further-adding-a-third-provider"&gt;Going further: adding a third provider&lt;/h3&gt;
&lt;p&gt;This two-provider cascade already delivers strong results, but you can push accuracy even higher by adding a third provider.&lt;/p&gt;
&lt;p&gt;For example, adding &lt;a href="https://coordable.co/provider/here-geocoding-api/"&gt;HERE&lt;/a&gt; as a second fallback (after Google Maps) would catch some of the 2.7% of addresses that neither US Census nor Google resolved. HERE has strong US address coverage and is significantly cheaper than Google Maps at $0.83 per 1,000 addresses. A three-provider cascade (US Census → Google Maps → HERE) would likely push accuracy above 97.3% while keeping the overall cost low, since HERE would only handle the tiny fraction of addresses that both previous providers missed.&lt;/p&gt;
&lt;p&gt;We ran a similar experiment with French addresses using the &lt;a href="https://coordable.co/blog/how-to-geocode-with-ban/"&gt;BAN API&lt;/a&gt; (the French government geocoder), Google Maps, and HERE, and achieved 97.7% accuracy at $1.62 per 1,000, a 67% cost reduction compared to Google alone. The principle is identical: route easy addresses through the cheapest provider, and reserve expensive providers for the hard cases. See &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; for the full breakdown.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="conclusion"&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;For US address geocoding, the US Census Geocoder is a powerful and underused tool. It is free, requires no API key, and handles the vast majority of clean street addresses correctly. Pairing it with Google Maps as a fallback gives you the best of both worlds: near-complete coverage at a fraction of the cost.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Test&lt;/th&gt;
&lt;th&gt;Provider(s)&lt;/th&gt;
&lt;th&gt;Found&lt;/th&gt;
&lt;th&gt;Cost per 1,000&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;US Census only&lt;/td&gt;
&lt;td&gt;91.9%&lt;/td&gt;
&lt;td&gt;$0.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Google Maps only&lt;/td&gt;
&lt;td&gt;92.6%&lt;/td&gt;
&lt;td&gt;$5.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;US Census → Google Maps (cascade)&lt;/td&gt;
&lt;td&gt;97.3%&lt;/td&gt;
&lt;td&gt;$0.41&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The key caveat: this strategy works for &lt;strong&gt;street address datasets&lt;/strong&gt;. If your data contains business names, POIs, or unstructured inputs, US Census will not help and you will need a commercial provider for a larger share of requests.&lt;/p&gt;
&lt;p&gt;However, it would have been possible to plug a low-cost provider to handle the remaining addresses as well : HERE, Nominatim (OSM), OpenCage, etc.&lt;/p&gt;
&lt;p&gt;If you want to implement this cascade without writing custom code, &lt;a href="https://coordable.co"&gt;Coordable&lt;/a&gt; lets you configure multi-provider workflows with quality rules at each step, so only good results pass through.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://coordable.co" class="learn-more-btn"&gt;Try cascading geocoding with Coordable&lt;/a&gt;&lt;/p&gt;

&lt;hr&gt;
&lt;h3 id="where-to-go-from-here"&gt;Where to go from here&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;See how the same cascading approach cuts costs by 67% for French addresses: &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;Compare geocoding prices across all major providers: &lt;a href="https://coordable.co/blog/geocoding-prices-2026/"&gt;Geocoding prices in 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Learn more about Google Maps Geocoding: &lt;a href="https://coordable.co/provider/google-maps-geocoding-api/"&gt;Google Maps Geocoding API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><category>2026</category><category>api</category><category>geocoding</category><category>pricing</category><category>providers</category><category>USA</category><guid>https://coordable.co/blog/how-to-cut-geocoding-costs-by-90-for-us-addresses-census-google-maps/</guid><pubDate>Sat, 21 Mar 2026 10:00:00 GMT</pubDate></item><item><title>How to reduce geocoding costs by 67%</title><link>https://coordable.co/blog/how-to-reduce-geocoding-costs-by-67/</link><dc:creator>François Andrieux</dc:creator><description>&lt;h3 id="the-use-case-a-logistics-company-paying-way-too-much-for-geocoding"&gt;The use case: a logistics company paying way too much for geocoding&lt;/h3&gt;
&lt;p&gt;If you work in logistics, insurance, or routing software, you know the drill: geocoding volumes are massive, and the bills that come with them are too.&lt;/p&gt;
&lt;p&gt;In this article, we show how &lt;a href="https://coordable.co"&gt;Coordable&lt;/a&gt; helped a logistics company cut geocoding costs by &lt;strong&gt;67%&lt;/strong&gt; while also increasing its share of valid geocoding results from 94% to 97.7%. &lt;strong&gt;Total savings: $20,280 per year.&lt;/strong&gt; 🤩&lt;/p&gt;
&lt;p&gt;Let's dive in.&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/how-to-reduce-geocoding-costs-by-67/#the-use-case-a-logistics-company-paying-way-too-much-for-geocoding"&gt;The use case: a logistics company paying way too much for geocoding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-reduce-geocoding-costs-by-67/#the-problem-choosing-between-cost-and-quality"&gt;The problem: choosing between cost and quality&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-reduce-geocoding-costs-by-67/#the-solution-cascading-providers"&gt;The solution: cascading providers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-reduce-geocoding-costs-by-67/#the-workflow-3-providers"&gt;The workflow: 3 providers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-reduce-geocoding-costs-by-67/#the-results"&gt;The results&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-reduce-geocoding-costs-by-67/#session-1-google-maps-only"&gt;Session 1: Google Maps only&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-reduce-geocoding-costs-by-67/#session-2-ban-google-maps-here-cascading"&gt;Session 2: BAN + Google Maps + HERE (cascading)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-reduce-geocoding-costs-by-67/#yearly-cost-savings"&gt;Yearly cost savings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-reduce-geocoding-costs-by-67/#conclusion"&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-reduce-geocoding-costs-by-67/#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="the-problem-choosing-between-cost-and-quality"&gt;The problem: choosing between cost and quality&lt;/h3&gt;
&lt;p&gt;You have probably faced this tradeoff: premium providers like Google Maps deliver excellent results, but they come at a price. Cheaper alternatives may leave some addresses unresolved.&lt;/p&gt;
&lt;p&gt;Most of the time, though, you do not actually need the premium option; addresses are clean and unambiguous, so any decent geocoder will do the job. The real challenge appears when your address data is messy: in those cases, you are forced to choose between paying for Google Maps to guarantee correct results, or accepting that a cheaper provider will miss some.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="the-solution-cascading-providers"&gt;The solution: cascading providers&lt;/h3&gt;
&lt;p&gt;Good news: there is a strategy that gives you the best of both worlds, &lt;strong&gt;cascading geocoders&lt;/strong&gt;. The principle is straightforward:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use an open-source or low-cost provider for ~90% of geocoding requests (the clean, unambiguous addresses).&lt;/li&gt;
&lt;li&gt;Use a premium geocoder (or several) to resolve the remaining ~10%.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This approach raises geocoding success rates while keeping costs down. In our case, it reduced costs by 67% and increased the share of successfully geocoded addresses by +3.7%. Here is how we did it.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="the-workflow-3-providers"&gt;The workflow: 3 providers&lt;/h3&gt;
&lt;p&gt;Our logistics client needed to geocode mostly residential addresses in France. France has an excellent government API for this purpose, the &lt;a href="https://coordable.co/blog/how-to-geocode-with-ban/"&gt;Base Adresse Nationale (BAN)&lt;/a&gt;, which covers French residential addresses very well, though it does not handle points of interest or addresses outside France. Many commercial providers actually use BAN data to improve their own results.&lt;/p&gt;
&lt;p&gt;The downside of BAN's API is that it is less robust at parsing and matching poorly formatted input. So we still needed to pair it with at least one commercial provider to ensure no addresses slip through. For that, we chose Google Maps. Finally, we added HERE as a second fallback because HERE also leverages BAN data, making it a strong option for the French addresses that Google could not resolve to rooftop level.&lt;/p&gt;
&lt;p&gt;Here is our strategy:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;French BAN&lt;/strong&gt;: confidence score &amp;gt; 0.75 required.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Google Maps API&lt;/strong&gt;: &lt;code&gt;ROOFTOP&lt;/code&gt; location type required (if not resolved in step 1).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HERE&lt;/strong&gt;: confidence score &amp;gt; 0.75 required (if not resolved in step 2).&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;
  &lt;img src="https://coordable.co/images/how-to-reduce-geocoding-costs/cascading-workflow-screenshot.png" alt="Screenshot of the cascading geocoding workflow: BAN first, then Google Maps, then HERE, each with its own quality rule."&gt;
  &lt;figcaption&gt;The three-provider cascade configured in Coordable: BAN → Google Maps → HERE, each step gated by a quality rule.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;We apply quality rules at each step to discard results that are not good enough. For French BAN and HERE, the confidence score reflects how closely the geocoder matched the input string. Although computed slightly differently across providers, both scores are a reliable way to filter out poor results. Setting the threshold at 0.75 is fairly strict, but the cascade makes this safe; any address rejected at one step simply moves to the next provider.&lt;/p&gt;
&lt;p&gt;Google Maps does not provide a confidence score, so instead we filter on the location type returned (&lt;code&gt;ROOFTOP&lt;/code&gt;, &lt;code&gt;APPROXIMATE&lt;/code&gt;, &lt;code&gt;GEOMETRIC_CENTER&lt;/code&gt;). For residential addresses, we require &lt;code&gt;ROOFTOP&lt;/code&gt; only, to ensure the coordinates are placed in front of the building rather than somewhere in the middle of the street.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="the-results"&gt;The results&lt;/h3&gt;
&lt;p&gt;To measure the impact, we ran two geocoding sessions on the same dataset and compared them:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Google Maps only&lt;/strong&gt;: the client's initial setup.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cascading strategy&lt;/strong&gt;: BAN → Google Maps → HERE.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The test dataset contains 1,000 residential addresses, mostly clean and well-formed. That is large enough to get a reliable picture of how this strategy performs at scale.&lt;/p&gt;
&lt;p&gt;In practice, the client geocodes about &lt;strong&gt;500,000 addresses per month&lt;/strong&gt;.&lt;/p&gt;
&lt;h4 id="session-1-google-maps-only"&gt;Session 1: Google Maps only&lt;/h4&gt;
&lt;figure&gt;
  &lt;img src="https://coordable.co/images/how-to-reduce-geocoding-costs/session1-google-screenshot.png" alt="Screenshot of the Google Maps only geocoding session: 94% valid results, $5 per 1,000."&gt;
  &lt;figcaption&gt;Session 1, Google Maps only: 940/1,000 addresses resolved at ROOFTOP level, at $5 per 1,000.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Results:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;94%&lt;/strong&gt; valid geocoding results (addresses resolved to &lt;code&gt;ROOFTOP&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Estimated cost: &lt;strong&gt;$5.00 per 1,000 addresses&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: these costs ignore the Google free quota, which is shared across all Google Maps products. Its effective value depends on each client's overall usage, so we exclude it for a fair comparison.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id="session-2-ban-google-maps-here-cascading"&gt;Session 2: BAN + Google Maps + HERE (cascading)&lt;/h4&gt;
&lt;figure&gt;
  &lt;img src="https://coordable.co/images/how-to-reduce-geocoding-costs/session2-cascading-providers-screenshot.png" alt="Screenshot of the cascading geocoding session: 97.7% valid results, $1.62 per 1,000."&gt;
  &lt;figcaption&gt;Session 2, Cascading strategy: 977/1,000 addresses resolved, at $1.62 per 1,000.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Results:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;97.7%&lt;/strong&gt; valid geocoding results, a &lt;strong&gt;+3.7% improvement&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Estimated cost: &lt;strong&gt;$1.62 per 1,000 addresses&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Provider breakdown: BAN 64.5% · Google Maps 31.7% · HERE 3.8%&lt;/p&gt;
&lt;p&gt;Using BAN means that 64.5% of addresses cost nothing to geocode. Our strict rules then sent 31.7% of addresses to Google Maps, and HERE handled the remaining 3.8%.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Total cost reduction: 67%, while improving geocoding quality.&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="yearly-cost-savings"&gt;Yearly cost savings&lt;/h3&gt;
&lt;p&gt;At 500,000 addresses per month, the client was spending about $2,500/month on Google Maps alone. With the cascading strategy, that bill drops to $810/month, without any loss of quality; on the contrary.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Monthly cost&lt;/th&gt;
&lt;th&gt;Annual cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Google Maps only&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$2,500&lt;/td&gt;
&lt;td&gt;$30,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cascading (BAN + Google + HERE)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$810&lt;/td&gt;
&lt;td&gt;$9,720&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Savings&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$1,690&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$20,280&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;That is &lt;strong&gt;$20,280 saved per year&lt;/strong&gt;, while resolving +3.7% more addresses correctly.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="conclusion"&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;If you are paying Google Maps rates for every address, you are likely overpaying. This real-world example shows how large the gap can be: by routing the bulk of clean French addresses through the free BAN API, reserving Google Maps for harder cases, and using HERE as a final safety net, the client went from 94% to 97.7% geocoding success while paying 67% less.&lt;/p&gt;
&lt;p&gt;The key is combining the right providers in the right order, and enforcing quality rules at each step so only genuinely good results pass through. The result is a system that is both cheaper and more reliable than relying on a single provider.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://coordable.co" class="learn-more-btn"&gt;Set up cascading geocoding with Coordable&lt;/a&gt;&lt;/p&gt;

&lt;hr&gt;
&lt;h3 id="where-to-go-from-here"&gt;Where to go from here&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Learn more about the providers used in this workflow: &lt;a href="https://coordable.co/provider/google-maps-geocoding-api/"&gt;Google Maps Geocoding API&lt;/a&gt;, &lt;a href="https://coordable.co/provider/here-geocoding-api/"&gt;HERE Geocoding API&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;See how providers compare in France: &lt;a href="https://coordable.co/country-analysis/best-geocoding-providers-france/"&gt;Best geocoding providers for France&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Compare Google and HERE head-to-head: &lt;a href="https://coordable.co/comparison/google-vs-here-geocoding-2026/"&gt;Google vs HERE for geocoding&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;See current geocoding prices at a glance: &lt;a href="https://coordable.co/blog/geocoding-prices-2026/"&gt;Geocoding prices in 2026&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><category>2026</category><category>api</category><category>geocoding</category><category>pricing</category><category>providers</category><guid>https://coordable.co/blog/how-to-reduce-geocoding-costs-by-67/</guid><pubDate>Sun, 08 Mar 2026 10:00:00 GMT</pubDate></item><item><title>HERE price increase by 6% in 2026</title><link>https://coordable.co/blog/here-geocoding-price-increase-2026/</link><dc:creator>François Andrieux</dc:creator><description>&lt;p&gt;HERE Technologies is updating its pricing from April 2026. This post summarizes what matters for geocoding users: effective date, what changes, and who is affected.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://coordable.co/images/providers-logo/here-logo-large.png" alt="HERE Technologies logo" width="200" class="d-block mx-auto"&gt;&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/here-geocoding-price-increase-2026/#what-here-announced"&gt;What HERE announced&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/here-geocoding-price-increase-2026/#what-this-means-for-you"&gt;What this means for you&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/here-geocoding-price-increase-2026/#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="what-here-announced"&gt;What HERE announced&lt;/h3&gt;
&lt;p&gt;From April 1, 2026, the price of the &lt;strong&gt;HERE Base Plan&lt;/strong&gt; will increase by &lt;strong&gt;6%&lt;/strong&gt; for new contracts, renewals, and extensions. Existing contracts remain unchanged until renewal or extension.&lt;/p&gt;
&lt;p&gt;HERE Technologies communicated the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The prices of &lt;strong&gt;all 35 HERE Location Services and Data IO&lt;/strong&gt; using the pay-per-transaction model will increase by &lt;strong&gt;6%&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;This price increase applies to &lt;strong&gt;all new subscriptions and (auto-)renewals from April 1, 2026&lt;/strong&gt; onwards.&lt;/li&gt;
&lt;li&gt;The price of the &lt;strong&gt;Developer technical support plan&lt;/strong&gt; remains unchanged.&lt;/li&gt;
&lt;li&gt;These pricing updates will be reflected in all future contracts and invoices from April 1, 2026 onwards.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="what-this-means-for-you"&gt;What this means for you&lt;/h3&gt;
&lt;p&gt;If you sign a new contract or renew on or after April 1, 2026, you will see the new 6% pricing. For coverage, rate limits, licensing, and current pricing details, see our &lt;a href="https://coordable.co/provider/here-geocoding-api/"&gt;HERE Geocoding API&lt;/a&gt; guide.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="where-to-go-from-here"&gt;Where to go from here&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://coordable.co/provider/here-geocoding-api/"&gt;HERE Geocoding API&lt;/a&gt; — coverage, rate limits, and licensing.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/geocoding-prices-2026/"&gt;Geocoding prices in 2026&lt;/a&gt; — compare HERE with other providers.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/comparison/google-vs-here-geocoding-2026/"&gt;Google vs HERE for geocoding&lt;/a&gt; — head-to-head comparison.&lt;/li&gt;
&lt;/ul&gt;</description><category>2026</category><category>api</category><category>geocoding</category><category>here</category><category>pricing</category><guid>https://coordable.co/blog/here-geocoding-price-increase-2026/</guid><pubDate>Fri, 06 Mar 2026 12:00:00 GMT</pubDate></item><item><title>Geocoding prices in 2026</title><link>https://coordable.co/blog/geocoding-prices-2026/</link><dc:creator>François Andrieux</dc:creator><description>&lt;p&gt;Here’s a clear overview of what the main geocoding services cost in 2026, and whether anything changed recently. Use the table and the &lt;strong&gt;interactive chart&lt;/strong&gt; below to compare prices at a glance and to simulate your costs. 🙂&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/geocoding-prices-2026/#pricing-overview"&gt;Pricing overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/geocoding-prices-2026/#compare-costs-at-your-volume"&gt;Compare costs at your volume&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/geocoding-prices-2026/#did-prices-change"&gt;Did prices change?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/geocoding-prices-2026/#how-to-reduce-geocoding-cost"&gt;How to reduce geocoding cost&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/geocoding-prices-2026/#price-is-not-everything"&gt;Price is not everything&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/geocoding-prices-2026/#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="pricing-overview"&gt;Pricing overview&lt;/h3&gt;
&lt;p&gt;Roughly what you pay after the free tier (per 1,000 requests, in USD). Free tiers and volume discounts vary; check each provider for exact terms.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Free tier&lt;/th&gt;
&lt;th&gt;Price per 1,000 (after free)&lt;/th&gt;
&lt;th&gt;Note&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Google Maps&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;10,000/month&lt;/td&gt;
&lt;td&gt;$5.00&lt;/td&gt;
&lt;td&gt;Volume discounts; see &lt;a href="https://coordable.co/blog/geocoding-prices-2026/#did-prices-change"&gt;March 2025 changes&lt;/a&gt; below.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HERE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;30,000/month&lt;/td&gt;
&lt;td&gt;$0.83&lt;/td&gt;
&lt;td&gt;Volume discounts; &lt;a href="https://coordable.co/blog/geocoding-prices-2026/#did-prices-change"&gt;6% increase from April 2026&lt;/a&gt; for new contracts and renewals.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TomTom&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2,500/day (~75k/month)&lt;/td&gt;
&lt;td&gt;$0.75&lt;/td&gt;
&lt;td&gt;Volume discounts.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mapbox (Temporary)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;100,000/month&lt;/td&gt;
&lt;td&gt;$0.75&lt;/td&gt;
&lt;td&gt;Temporary results only; no long-term storage.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mapbox (Permanent)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;$5.00&lt;/td&gt;
&lt;td&gt;Allows indefinite storage of results.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OpenCage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2,500/day (~75k/month)&lt;/td&gt;
&lt;td&gt;from ~$0.15–0.17&lt;/td&gt;
&lt;td&gt;Subscription-based; volume discounts. Permissive storage.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Nominatim (OSM)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Public API rate-limited&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Self-hosting has infra costs.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Many countries also have &lt;strong&gt;free or low-cost official APIs&lt;/strong&gt; (e.g. &lt;a href="https://coordable.co/blog/how-to-geocode-with-ban/"&gt;France's BAN&lt;/a&gt;, Spain's CartoCiudad, UK's OS Places under certain schemes). For local addresses, check our country-specific comparisons linked at the end.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="compare-costs-at-your-volume"&gt;Compare costs at your volume&lt;/h3&gt;
&lt;p&gt;The difficulty is that most providers have different pricing tiers and different free tiers. So you need to know exactly how many addresses you need to geocode to know which provider is the cheapest. Also, prices typically decrease as volume increases, so your per-request cost depends heavily on your total usage.&lt;/p&gt;
&lt;p&gt;You can simulate your costs with the &lt;strong&gt;interactive chart&lt;/strong&gt; below. Just select the number of addresses you need to geocode and the chart will show you the cost per provider!&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div id="pricing_chart_main"&gt;&lt;/div&gt;
&lt;script&gt;
(function() {
  const providers = ["Google", "HERE", "TomTom", "OpenCage", "Mapbox (Temp)", "Mapbox (Perm)", "Nominatim"];
  if (typeof includePricingChart === "function") {
    includePricingChart("#pricing_chart_main", providers);
  }
})();
&lt;/script&gt;
&lt;hr&gt;
&lt;h3 id="did-prices-change"&gt;Did prices change?&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Google (March 2025):&lt;/strong&gt; Google replaced the previous $200/month credit with &lt;strong&gt;per-SKU free usage&lt;/strong&gt; (e.g. around 10,000 free billable events per month for the Geocoding API). Volume discount tiers were expanded for high usage. So the &lt;em&gt;effective&lt;/em&gt; free tier for geocoding is lower than before, but heavy users can see lower marginal costs at scale. Details: &lt;a href="https://coordable.co/provider/google-maps-geocoding-api/"&gt;Google Maps Geocoding API guide&lt;/a&gt; and &lt;a href="https://developers.google.com/maps/billing-and-pricing/march-2025"&gt;Google Maps Platform March 2025 changes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HERE (April 2026):&lt;/strong&gt; From April 1, 2026, the HERE Base Plan and all pay-per-transaction Location Services and Data IO &lt;strong&gt;increase by 6%&lt;/strong&gt; for new contracts, renewals, and extensions. Existing contracts are unchanged until renewal. See &lt;a href="https://coordable.co/blog/here-geocoding-price-increase-2026/"&gt;HERE price increase by 6% in 2026&lt;/a&gt; for details.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Other major providers:&lt;/strong&gt; TomTom, Mapbox, and OpenCage have kept their published pricing stable into 2026. Our source dates in the repo are October 2025 / January 2026; always confirm current prices on each provider’s site before committing.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="how-to-reduce-geocoding-cost"&gt;How to reduce geocoding cost&lt;/h3&gt;
&lt;p&gt;Relying on a single premium provider (e.g. Google at $5 per 1,000 requests) can become very expensive at scale. A proven way to &lt;strong&gt;cut costs without sacrificing quality&lt;/strong&gt; is &lt;strong&gt;cascading geocoders&lt;/strong&gt;: use several providers in a defined order, and only fall back to the next when the current one fails or does not meet your criteria.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What is cascading?&lt;/strong&gt; You define an ordered list of providers (e.g. OpenStreetMap or OpenCage → HERE → Google). For each address, you try the first provider; if that fails or the result does not pass validation, you automatically try the next one, and so on. Cheaper or free providers handle the bulk of easy addresses; premium providers are used only for the harder cases. The result: &lt;strong&gt;higher success rates&lt;/strong&gt; (often 98–99% instead of ~90% with one provider) and &lt;strong&gt;lower total cost&lt;/strong&gt;, because most requests are served by the least expensive option.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://coordable.co/" class="learn-more-btn"&gt;Reduce your costs with Coordable cascading geocoding&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The diagram below illustrates the idea: send 100% of requests to a free or low-cost provider first (e.g. OSM); only the unresolved share (e.g. 10%) goes to a mid-tier provider (e.g. HERE); and only the remainder (e.g. 4%) hits the premium provider (e.g. Google). You still reach a very high overall geocoding rate (e.g. 99.9%) while paying the premium rate for a small fraction of traffic.&lt;/p&gt;
&lt;figure&gt;
  &lt;img src="https://coordable.co/images/geocoding-cascade.png" alt="Cascading geocoding: 100% of requests go to OSM first (90% resolved), then 10% to HERE (6% more resolved), then 4% to Google (3.9% resolved); total 99.9% geocoding rate."&gt;
  &lt;figcaption&gt;Cascading geocoders: prioritize cheap or free providers, fall back to premium only when needed. Quality and cost scale with each step.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;You can implement cascading in your own code (call provider A, then B on failure, etc.) or do it easily with &lt;a href="https://coordable.co"&gt;Coordable&lt;/a&gt;: choose your providers, define the cascade order and fallback rules, and optionally validate results so only good coordinates reach your database. Either way, the principle is the same: &lt;strong&gt;prioritize cheaper solutions and only fall back to premium when it is truly necessary.&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://coordable.co"&gt;Try Coordable&lt;/a&gt;&lt;/strong&gt; to easily implement cascading geocoding for your business.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id="price-is-not-everything"&gt;Price is not everything&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Pricing does not always reflect quality.&lt;/strong&gt; The cheapest option is not necessarily the worst, and some geocoders can match or beat large commercial providers depending on region and data type (addresses vs POIs, local vs global). To see how providers actually perform where you operate, check the best geocoding provider for your country. We have in-depth comparisons for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://coordable.co/country-analysis/best-geocoding-providers-france/"&gt;Best geocoding providers for France&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/country-analysis/best-geocoding-providers-germany/"&gt;Best geocoding providers for Germany&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/country-analysis/best-geocoding-providers-italy/"&gt;Best geocoding providers for Italy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/country-analysis/best-geocoding-providers-luxembourg/"&gt;Best geocoding providers for Luxembourg&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/country-analysis/best-geocoding-providers-portugal/"&gt;Best geocoding providers for Portugal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/country-analysis/best-geocoding-providers-spain/"&gt;Best geocoding providers for Spain&lt;/a&gt;&lt;/li&gt;
&lt;li&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;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="where-to-go-from-here"&gt;Where to go from here&lt;/h3&gt;
&lt;p&gt;For more detail on a single provider (coverage, rate limits, licensing), see our guides: &lt;a href="https://coordable.co/provider/google-maps-geocoding-api/"&gt;Google Maps Geocoding API&lt;/a&gt;, &lt;a href="https://coordable.co/provider/here-geocoding-api/"&gt;HERE Geocoding API&lt;/a&gt;, &lt;a href="https://coordable.co/provider/mapbox-geocoding-api/"&gt;Mapbox Geocoding API&lt;/a&gt;. For a head-to-head in 2026, see &lt;a href="https://coordable.co/comparison/google-vs-here-geocoding-2026/"&gt;Google vs HERE for geocoding&lt;/a&gt;.&lt;/p&gt;</description><category>2026</category><category>api</category><category>geocoding</category><category>pricing</category><category>providers</category><guid>https://coordable.co/blog/geocoding-prices-2026/</guid><pubDate>Fri, 06 Mar 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 geocoding works ? A simple guide</title><link>https://coordable.co/blog/how-geocoding-works-a-simple-guide/</link><dc:creator>François Andrieux</dc:creator><description>&lt;h3 id="what-is-geocoding-and-why-it-matters"&gt;What is geocoding and why it matters?&lt;/h3&gt;
&lt;p&gt;Every day, we interact with addresses and places; whether we're searching for a nearby coffee shop on our phone, or entering our delivery address at checkout. But here's the thing: computers don't naturally understand "123 Main Street" or "Central Park." They work with numbers and more specifically, with latitude and longitude coordinates.&lt;/p&gt;
&lt;p&gt;That's where geocoding comes in: &lt;strong&gt;Geocoding is the process of translating human-readable addresses into geographic coordinates that computers can use to pinpoint locations on a map&lt;/strong&gt;. It's the invisible bridge between how we describe places and how machines navigate, analyze, and visualize them.&lt;/p&gt;
&lt;figure&gt;
  &lt;img src="https://coordable.co/images/geocoding-guide/geocoding-example.png" alt="A geocoding example: 57 Rue de Matignon, 75007 Paris, France → 48° 51′ 15″ N, 2° 19′ 14,36″ E"&gt;
  &lt;figcaption&gt;A simple geocoding example.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;This guide will walk you through what geocoding is, &lt;strong&gt;how it works behind the scenes&lt;/strong&gt;, &lt;strong&gt;what can go wrong&lt;/strong&gt;, and &lt;strong&gt;how to get the best results&lt;/strong&gt;. Let's dive in! 🙂&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: You don't need to be technical to use geocoding well. Understanding a few key concepts will help you troubleshoot issues and make better decisions.&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-geocoding-works-a-simple-guide/#what-is-geocoding-and-why-it-matters"&gt;What is geocoding and why it matters?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-geocoding-works-a-simple-guide/#the-two-ways-of-geocoding"&gt;The two ways of geocoding&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-geocoding-works-a-simple-guide/#forward-geocoding-turning-addresses-into-coordinates"&gt;Forward geocoding: turning addresses into coordinates&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-geocoding-works-a-simple-guide/#reverse-geocoding-turning-coordinates-into-addresses"&gt;Reverse geocoding: turning coordinates into addresses&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-geocoding-works-a-simple-guide/#how-geocoding-works-simplified-version"&gt;How geocoding works (simplified version)&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-geocoding-works-a-simple-guide/#step-1-address-normalization"&gt;Step 1: Address normalization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-geocoding-works-a-simple-guide/#step-2-parsing-components"&gt;Step 2: Parsing components&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-geocoding-works-a-simple-guide/#step-3-database-lookup-finding-the-match"&gt;Step 3: Database lookup - finding the match&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-geocoding-works-a-simple-guide/#step-4-scoring-and-ranking-choosing-the-best-match"&gt;Step 4: Scoring and ranking - choosing the best match&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-geocoding-works-a-simple-guide/#what-could-go-wrong-understanding-geocoding-failures"&gt;What could go wrong? Understanding geocoding failures&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-geocoding-works-a-simple-guide/#problem-1-database-issues-missing-incorrect"&gt;Problem #1: Database issues (missing, incorrect, ...)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-geocoding-works-a-simple-guide/#example-1-google-maps"&gt;Example 1: Google Maps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-geocoding-works-a-simple-guide/#example-2-here-wrong-example"&gt;Example 2: HERE wrong example&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-geocoding-works-a-simple-guide/#problem-2-parsing-failures-when-the-system-cant-make-sense-of-the-input"&gt;Problem #2: Parsing failures when the system can't make sense of the input&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-geocoding-works-a-simple-guide/#example-1-basic-encoding-issue"&gt;Example 1: basic encoding issue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-geocoding-works-a-simple-guide/#example-2-noise-issue"&gt;Example 2: noise issue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-geocoding-works-a-simple-guide/#example-3-typos"&gt;Example 3: typos&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-geocoding-works-a-simple-guide/#best-practices-how-to-get-reliable-geocoding-results"&gt;Best practices: how to get reliable geocoding results&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-geocoding-works-a-simple-guide/#1-pick-the-right-geocoding-provider"&gt;1. Pick the right geocoding provider&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-geocoding-works-a-simple-guide/#2-always-add-context-country-region-postal-code"&gt;2. Always add context (country, region, postal code)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-geocoding-works-a-simple-guide/#3-clean-your-addresses-before-you-geocode"&gt;3. Clean your addresses before you geocode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-geocoding-works-a-simple-guide/#4-help-the-parser-if-possible"&gt;4. Help the parser if possible&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-geocoding-works-a-simple-guide/#5-understand-what-you-are-geocoding"&gt;5. Understand what you are geocoding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-geocoding-works-a-simple-guide/#6-dont-trust-results-blindly"&gt;6. Don't trust results blindly&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-geocoding-works-a-simple-guide/#conclusion"&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h3 id="the-two-ways-of-geocoding"&gt;The two ways of geocoding&lt;/h3&gt;
&lt;p&gt;Geocoding actually works in two directions, and each serves a different purpose.&lt;/p&gt;
&lt;h4 id="forward-geocoding-turning-addresses-into-coordinates"&gt;Forward geocoding: turning addresses into coordinates&lt;/h4&gt;
&lt;p&gt;Forward geocoding takes a text address (like &lt;code&gt;57 Rue de Varenne, Paris, France&lt;/code&gt;) or place name (like &lt;code&gt;Tour Eiffel&lt;/code&gt;) and returns a pair of coordinates (latitude and longitude).&lt;/p&gt;
&lt;p&gt;This is the exact process that happens when you search for a location in Google Maps or Apple Maps on your phone:&lt;/p&gt;
&lt;figure&gt;
  &lt;img src="https://coordable.co/images/geocoding-guide/geocoding-example-gmaps.png" alt="Google Maps search on the phone: 57 Rue de Varenne, Paris, France" width="600"&gt;
  &lt;figcaption&gt;In Google Maps, typing "57 Rue de Varenne, Paris, France" and getting the coordinates is a forward geocoding process.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Forward geocoding is an essential tool for a wide variety of operations. I don't want to sound too boring already by listing all the examples, but here are just a few.&lt;/p&gt;
&lt;p&gt;For consumers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Finding places&lt;/strong&gt;: Forward geocoding lets you search for locations in navigation apps, just type a name or address to find a coffee shop, pharmacy, or tourist site.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Getting directions&lt;/strong&gt;: All navigations apps use geocoding to get the coordinates of the destination and display it on the map. Then, the best route is computed by the navigation engine.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Package delivery&lt;/strong&gt;: Addresses are sent to the delivery driver to help them find your address and drop off your package.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For businesses:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Address validation&lt;/strong&gt;: Online stores and delivery services geocode addresses to check and standardize them at checkout.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Route optimization&lt;/strong&gt;: Companies geocode address lists to plan deliveries efficiently and save resources.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Customer analytics&lt;/strong&gt;: Businesses geocode customer addresses to spot trends and improve marketing or logistics.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Store locators&lt;/strong&gt;: Retailers use geocoding so customers can easily find the nearest shop from their address.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And this list is not exhaustive. Yes, geocoding is everywhere! 😀&lt;/p&gt;
&lt;h4 id="reverse-geocoding-turning-coordinates-into-addresses"&gt;Reverse geocoding: turning coordinates into addresses&lt;/h4&gt;
&lt;p&gt;Reverse geocoding does the opposite: you start with a GPS point (latitude and longitude) and get back the nearest address or place name.&lt;/p&gt;
&lt;p&gt;That's what happens when you pin a place on the map in Google Maps or Apple Maps:&lt;/p&gt;
&lt;figure&gt;
  &lt;img src="https://coordable.co/images/geocoding-guide/geocoding-example-gmaps-reverse.png" alt="Google Maps reverse geocoding example" width="600"&gt;
  &lt;figcaption&gt;In Google Maps, pinpointing a location and getting a suggestion for the address is a reverse geocoding process. &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Again, here are some real world examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When you drop a pin on a map to show a friend where you are, the app reverse geocodes that point to display &lt;code&gt;57 Rue de Varenne, Paris, France&lt;/code&gt; instead of &lt;code&gt;48.8589, 2.3514&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Photos taken with your smartphone often store GPS coordinates in their metadata. Apps reverse geocode those coordinates to label your photos with &lt;code&gt;Central Park, New York&lt;/code&gt; or &lt;code&gt;Eiffel Tower, Paris&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;A delivery driver scans a package at your door. The handheld device logs the GPS coordinates at that moment, and the system reverse geocodes it to confirm delivery at the correct address.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Good to know&lt;/strong&gt;: In most cases, when people mention "geocoding", they’re talking about &lt;em&gt;forward geocoding&lt;/em&gt;. If reverse geocoding is meant, it’s usually specified directly.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id="how-geocoding-works-simplified-version"&gt;How geocoding works (simplified version)&lt;/h3&gt;
&lt;p&gt;Now let's walk through what happens when you provide an address to a geocoding system. Understanding these steps will help you recognize why some addresses work perfectly and others struggle.&lt;/p&gt;
&lt;p&gt;Basically, &lt;strong&gt;geocoding involves matching an input address to the most similar entry in a large address database&lt;/strong&gt;. In other words, it's a process of looking up an address in a database:&lt;/p&gt;
&lt;figure&gt;
  &lt;img src="https://coordable.co/images/geocoding-guide/address-lookup-table.png" alt="Address lookup table illustration"&gt;
  &lt;figcaption&gt;Address lookup: the geocoding system checks your input against a massive database of known addresses and places to find the best match.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;When I type &lt;code&gt;57 ru de varenne Paris&lt;/code&gt; in Google Maps (yes, with the typo), the system will compare this input with Google's database of addresses and POIs (Points of Interest) and will return the closest match.&lt;/p&gt;
&lt;p&gt;This simple address lookup is made of 4 steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Address normalization&lt;/li&gt;
&lt;li&gt;Parsing&lt;/li&gt;
&lt;li&gt;Database lookup&lt;/li&gt;
&lt;li&gt;Scoring and ranking&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Let's go through each step in detail. &lt;/p&gt;
&lt;h4 id="step-1-address-normalization"&gt;Step 1: Address normalization&lt;/h4&gt;
&lt;p&gt;Addresses can be entered in many different ways: with typos, all uppercase, extra or missing information (like country or postal code), or with unnecessary details.&lt;/p&gt;
&lt;p&gt;The normalization process aims to standardize addresses so they can be easily compared to those in the database. Here are some typical normalization steps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Standardization:&lt;/strong&gt; Convert to lowercase, remove extra spaces and symbols, etc. Example: &lt;code&gt;57 ,  AV des  Champs-élysées (paris)&lt;/code&gt; becomes &lt;code&gt;57 avenue des champs elysees Paris&lt;/code&gt;.  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expanding abbreviations:&lt;/strong&gt; &lt;code&gt;57 R de Varenne&lt;/code&gt; may be expanded to &lt;code&gt;57 Rue de Varenne&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Correcting small typos:&lt;/strong&gt; Obvious small errors can be fixed, e.g., &lt;code&gt;57 Reu de Varenne&lt;/code&gt; becomes &lt;code&gt;57 Rue de Varenne&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Removing filler words:&lt;/strong&gt; We can remove words like "de", "la" (in french) or "of", "the", "in", e.g. &lt;code&gt;57 Rue de la Varenne in Paris&lt;/code&gt; could become &lt;code&gt;57 Rue Varenne Paris&lt;/code&gt;. &lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: The amount and type of normalization and cleaning depends on the geocoding provider. Google Maps will have different rules than HERE, and Mapbox, and so on. This is part of each provider's "secret sauce", and that's why a provider can fail where another succeeds.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id="step-2-parsing-components"&gt;Step 2: Parsing components&lt;/h4&gt;
&lt;p&gt;Once the address is normalized, we can try to parse it, i.e., split it into recognized component parts: house number, street name, unit/apartment number, city, postal code, region/state, and country.&lt;/p&gt;
&lt;figure&gt;
  &lt;img src="https://coordable.co/images/geocoding-guide/address-parsing-example.png" alt="Address parsing: the geocoding system splits the address into recognizable components." width="500"&gt;
  &lt;figcaption&gt;Address parsing: the geocoding system splits the address into recognizable components.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;This is needed in order to specify the search. When I type &lt;code&gt;57 rue de Varenne paris&lt;/code&gt;, should I check all addresses in the World? Probably not! &lt;/p&gt;
&lt;p&gt;Because &lt;code&gt;Paris&lt;/code&gt; strongly suggests that we are in France (or at least, it's highly probable... we could, for example, also be in &lt;a href="https://www.google.com/maps/place/Paris,+Texas,+%C3%89tats-Unis/@33.6795523,-95.6873858,12z/data=!3m1!4b1!4m6!3m5!1s0x864a580616272b9b:0xc9b909662fd3f349!8m2!3d33.6609389!4d-95.555513!16s%2Fm%2F0gfgglz?entry=ttu&amp;amp;g_ep=EgoyMDI1MTAyMi4wIKXMDSoASAFQAw%3D%3D"&gt;Paris, Texas, United States&lt;/a&gt; 😅). &lt;/p&gt;
&lt;p&gt;Parsing works by identifying patterns. For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Countries are usually placed at the end of the address (like in &lt;code&gt;57 Rue de Varenne, Paris, France&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Postal codes are usually codes between 3 to 10 digits (or characters), depending on the country&lt;/li&gt;
&lt;li&gt;Housenumbers are usually the first numbers encountered &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But all these rules can be unreliable, and the geocoding system must deal with a lot of inconsistencies. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Missing components:&lt;/strong&gt; Sometimes components are missing (I didn't type the country and the postal code for my search)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Abbreviations:&lt;/strong&gt; People write &lt;code&gt;St&lt;/code&gt; (street? saint?), &lt;code&gt;Av&lt;/code&gt; (avenue? aviation?), &lt;code&gt;Dr&lt;/code&gt; (drive? doctor?). The system must use context to decide.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Different country formats:&lt;/strong&gt; In the U.S., postal codes come at the end. In the UK, they're often in the middle. In Japan, the structure is completely different (country, postal code, prefecture, city, district, block, building).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multiple languages:&lt;/strong&gt; &lt;code&gt;Rue&lt;/code&gt; (French), &lt;code&gt;Calle&lt;/code&gt; (Spanish), &lt;code&gt;Rua&lt;/code&gt; (Portuguese), &lt;code&gt;Ulica&lt;/code&gt; (Polish) — they all mean "street," and the system needs to recognize them.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As an example, Google Maps still works well if I type &lt;code&gt;75015 Paris - Rue de Varenne 57&lt;/code&gt; even if it does not respect the usual format.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why parsing is powerful:&lt;/strong&gt; Once the address is parsed, the geocoding engine can use the country or state or city to filter out billions of irrelevant addresses. A postal code narrows it even further often to just a few hundred possibilities. This is how geocoding systems stay fast and accurate even when dealing with enormous datasets.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h4 id="step-3-database-lookup-finding-the-match"&gt;Step 3: Database lookup - finding the match&lt;/h4&gt;
&lt;p&gt;Now that we have clean, parsed components, it's time to look them up in a reference database. 
This is an example of process:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Take only addresses within the same country or state or city (if available, let's say France for our example)&lt;/li&gt;
&lt;li&gt;Find addresses that match the most of our components: house number, street name, city, postal code.&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;
  &lt;img src="https://coordable.co/images/geocoding-guide/address-lookup-table2.png" alt="Address lookup table illustration for components"&gt;
  &lt;figcaption&gt;Illustration of the address lookup by components.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;In this above example, we find 4 possible matches (that have at least one component in common with our input):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;57 Rue de Varenne, Riom, France&lt;/li&gt;
&lt;li&gt;57 Rue de Varenne, Paris, France&lt;/li&gt;
&lt;li&gt;58 Rue de Varenne, Paris, France&lt;/li&gt;
&lt;li&gt;57 Av. des Champs-Elysées, Paris, France&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For the sake of simplicity, we used a strict matching, i.e. we only match if the input is exactly the same as the database. However, in reality, geocoding systems often use distance functions, like the Levenshtein distance, which helps match addresses even when they contain typos or abbreviations (e.g. &lt;code&gt;57 Rue de Varene&lt;/code&gt; with a missing letter &lt;code&gt;n&lt;/code&gt;). &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tokenization:&lt;/strong&gt; Some geocoding systems use a process called tokenization, which means splitting an address into smaller pieces (tokens), usually words. Instead of trying to match the entire street name as one string, the system can match individual tokens. For example, &lt;code&gt;champs elysées&lt;/code&gt; might be split into tokens like &lt;code&gt;champs&lt;/code&gt;, &lt;code&gt;elysées&lt;/code&gt;, &lt;code&gt;champs elysées&lt;/code&gt;, and &lt;code&gt;champs-elysées&lt;/code&gt;. This approach increases the chances of finding a match even if the address format varies or contains minor errors. Geocoding engines use different strategies to generate and compare tokens: some rely on phonetic similarity, others use techniques like stemming (reducing words to their base form) or lemmatization. The exact methods may vary between systems.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You also now understand that the goal is to have the most complete list of addresses possible but also to include street names, administrative boundaries, cities, neighborhoods, POIs, and more.
This is also why some providers can give much different results than others. Commercial providers like Google or Apple have their own private data, whereas some well-known open source initiatives like OpenStreetMap and OpenAddresses.io can give you good coverage of the world.&lt;/p&gt;
&lt;p&gt;Google Maps, for instance, excels with commercial data like restaurant names or shop names. The US Census geocoder will never be able to match a restaurant name with a location; it's simply not in their database.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="step-4-scoring-and-ranking-choosing-the-best-match"&gt;Step 4: Scoring and ranking - choosing the best match&lt;/h4&gt;
&lt;p&gt;As we saw, the database lookup often returns &lt;em&gt;multiple&lt;/em&gt; candidates. Maybe there are two &lt;code&gt;57 Rue de Varenne&lt;/code&gt; addresses in neighboring towns. Or the postal code matches perfectly, but the street name is slightly off. How does the system decide which one to return?&lt;/p&gt;
&lt;p&gt;If you look at the example above, it's clear that not all matches are equal. Some are more likely to be the correct one than others. If our input is &lt;code&gt;57 Rue de Varenne, Paris, France&lt;/code&gt;, we have: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;57 Rue de Varenne, Riom, France&lt;/code&gt;: same housenumber &amp;amp; street name but different city&lt;/li&gt;
&lt;li&gt;&lt;code&gt;57 Rue de Varenne, Paris, France&lt;/code&gt;: same housenumber &amp;amp; street name &amp;amp; city&lt;/li&gt;
&lt;li&gt;&lt;code&gt;58 Rue de Varenne, Paris, France&lt;/code&gt;: same street name &amp;amp; city&lt;/li&gt;
&lt;li&gt;&lt;code&gt;57 Av. des Champs-Elysées, Paris, France&lt;/code&gt;: same housenumber &amp;amp; city&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It becomes obvious that some components are more important than others, i.e. matching the right city is probably more important than matching the right housenumber. 
For our example, let's attribute a score with ponderationnal weighting:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1 point for the housenumber&lt;/li&gt;
&lt;li&gt;2 points for the street name&lt;/li&gt;
&lt;li&gt;3 points for the city&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The result would be:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;57 Rue de Varenne, Riom, France&lt;/code&gt;: 1 + 2 = 3 points&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;57 Rue de Varenne, Paris, France&lt;/code&gt;: 1 + 2 + 3 = 6 points 🏆&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;58 Rue de Varenne, Paris, France&lt;/code&gt;: 2 + 3 = 5 points&lt;/li&gt;
&lt;li&gt;&lt;code&gt;57 Av. des Champs-Elysées, Paris, France&lt;/code&gt;: 1 + 3 = 4 points&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The database lookup with &lt;code&gt;57 Rue de Varenne, Paris, France&lt;/code&gt; has 6 points, being the highest score, so that's the one that will be returned ! 🎉&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Good to know&lt;/strong&gt;: It's a way for geocoding providers to score their results and return confidence scores. Some may use different weighting, some may use different distance functions, etc. But you get the idea. Again, it's a way for some geocoding providers to achieve better performance than others.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Coming up with a good scoring system isn't easy, and there's no single right answer. Is the city name always worth 3 points, or should that change if the name's a bit ambiguous? What about situations where parts of the address are missing or not very reliable? Tweaking the weights for each component can have a big effect on your results, and it often depends on where your data is from and the types of addresses you get. &lt;/p&gt;
&lt;p&gt;In practice, building these ranking rules usually involves a lot of testing, tweaking, and sometimes even a dash of machine learning to get the best possible matches.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="what-could-go-wrong-understanding-geocoding-failures"&gt;What could go wrong? Understanding geocoding failures&lt;/h3&gt;
&lt;p&gt;Now that you understand how geocoding works, let's talk about what could go wrong. You will be surprised to see how often geocoding fails, and how often it's not obviously stated by the geocoding provider 😅.&lt;/p&gt;
&lt;h4 id="problem-1-database-issues-missing-incorrect"&gt;Problem #1: Database issues (missing, incorrect, ...)&lt;/h4&gt;
&lt;p&gt;Geocoding systems are only as good as the data they use. If the underlying database has missing information or is out of date, even perfect input won't produce accurate results.&lt;/p&gt;
&lt;p&gt;Missing data:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Rural areas:&lt;/strong&gt; A farmhouse on a county road might not have a specific street address in the database. The geocoder might place it at the road centerline or at the entrance to the property close, but not exact.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New construction:&lt;/strong&gt; A brand-new apartment building might not yet appear in the address database. It could take weeks or months for mapping providers to update their data after construction is complete.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Private roads and gated communities:&lt;/strong&gt; These are often excluded from public datasets. If you're trying to geocode an address inside a private community, the system might only get you to the main entrance.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ambiguous data:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Street renaming:&lt;/strong&gt; A city renames &lt;code&gt;Washington Avenue&lt;/code&gt; to &lt;code&gt;Martin Luther King Jr. Boulevard&lt;/code&gt;. For months, the old name still appears in the database, and geocoding requests using the new name fail or return low-confidence results.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multiple languages:&lt;/strong&gt; Some addresses must exist in multiple languages, e.g. &lt;code&gt;9 Rue des pensées, 1030 Schaerbeek&lt;/code&gt; should as well exist as &lt;code&gt;Penseestraat 9, 1030 Schaarbeek&lt;/code&gt; (street name and even city name are different). They both represent the exact same address, but with different languages (French and Dutch).&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;How to deal with this issue?&lt;/strong&gt; You must not just trust the geocoding provider's result. You must always check the result and if it's not correct, you must try to correct it manually. &lt;a href="https://coordable.co"&gt;Coordable&lt;/a&gt; automatically detects these issues for you.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id="example-1-google-maps"&gt;Example 1: Google Maps&lt;/h4&gt;
&lt;p&gt;At the time of writing (2025, October), Google Maps does not have the address &lt;code&gt;12 rue sur le rang, Bourogne&lt;/code&gt; in France. Instead, it would insist in returning the address &lt;code&gt;12 Rue Vivaldi, 90140 Bourogne, France&lt;/code&gt;. &lt;/p&gt;
&lt;figure&gt;
  &lt;img src="https://coordable.co/images/geocoding-guide/google-maps-wrong.png" alt="Google Maps wrong example"&gt;
  &lt;figcaption&gt;Google Maps wrong example: the address &lt;code&gt;12 rue sur le rang, Bourogne&lt;/code&gt; is not located correctly. &lt;br&gt;Mapbox is correct because it probably uses the open source French database for this example. &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;This example is not &lt;em&gt;that bad&lt;/em&gt; in the sense that the result is pretty close to the correct location. However, that's still a &lt;em&gt;false positive&lt;/em&gt;: a result that is returned and is confident about it, but it's not the correct one.&lt;/p&gt;
&lt;h4 id="example-2-here-wrong-example"&gt;Example 2: HERE wrong example&lt;/h4&gt;
&lt;p&gt;To be fair, all geocoding providers have their flaws. Here is another example with HERE, where Google actually works better.&lt;/p&gt;
&lt;p&gt;In this example, we geocode the address &lt;code&gt;38 b faubourg de montbéliard, Delle&lt;/code&gt;. It's still unsure if there are two addresses with the same housenumber there (38 and 38B), but HERE returns something completely wrong with a high score (1.0).&lt;/p&gt;
&lt;figure&gt;
  &lt;img src="https://coordable.co/images/geocoding-guide/here-wrong.png" alt="HERE wrong example"&gt;
  &lt;figcaption&gt;HERE wrong example: the address &lt;code&gt;38 b faubourg de montbéliard, Delle&lt;/code&gt; is not located correctly. &lt;br&gt;Google Maps is correct in this case. &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The problem here seems a lack of update in the open source French database. As HERE uses it, it also inherits its errors.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="problem-2-parsing-failures-when-the-system-cant-make-sense-of-the-input"&gt;Problem #2: Parsing failures when the system can't make sense of the input&lt;/h4&gt;
&lt;p&gt;Most of the time, addresses are messy. They contain extra noise, typos, mixed languages, and other formatting issues.&lt;/p&gt;
&lt;p&gt;But sometimes, the parser can't understand the input at all:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CALL JOHN AT 555-239-4829 120 MAIN STREET APT 5B, BROOKLYN, NY, USA&lt;/code&gt;: too many noise, phone number, instructions, etc.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;1234ElmStreetLosAngelesCA90001&lt;/code&gt;: no spaces or wrong order, no city or postal code.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ru Saint cathrine West, Montreal QC H3B 1B5 Canda&lt;/code&gt;: typo, mixed languages, etc.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RUE DES F?TES, 75019 PARIS&lt;/code&gt;: encoding issue, special character (should be &lt;code&gt;Rue des Fêtes&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Try these examples with your favorite maps application. You would be surprised to see how often they fail.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parsing errors are a real problem:&lt;/strong&gt; businesses processing thousands of global addresses using poorly designed parsers often see failed deliveries or mismatched addresses, all due to small parsing errors that could have been avoided with better cleaning and normalization.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;How to deal with this issue?&lt;/strong&gt; Cleaning the input is a good way to improve the results. E.g. if you know that your addresses have encoding issues, fix it before sending it to the geocoding provider. &lt;a href="https://coordable.co"&gt;Coordable&lt;/a&gt; has automated AI cleaning that deals with all the above issues and more.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id="example-1-basic-encoding-issue"&gt;Example 1: basic encoding issue&lt;/h4&gt;
&lt;p&gt;In this example, the address &lt;code&gt;RUE DES F?TES, 75019 PARIS&lt;/code&gt; cannot be geocoded correctly in both Mapbox and Nominatim (the OpenStreetMap geocoder).&lt;/p&gt;
&lt;figure&gt;
  &lt;img src="https://coordable.co/images/geocoding-guide/encoding-issue-1.png" alt="Encoding issue example 1"&gt;
  &lt;figcaption&gt;Illustration of an encoding issue: the address &lt;code&gt;RUE DES F?TES, 75019 PARIS&lt;/code&gt; is not properly geocoded.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;In both cases, they will return the correct location if &lt;code&gt;f?tes&lt;/code&gt; is replaced by &lt;code&gt;fêtes&lt;/code&gt;.&lt;/p&gt;
&lt;h4 id="example-2-noise-issue"&gt;Example 2: noise issue&lt;/h4&gt;
&lt;p&gt;In this example, we consecutively try &lt;code&gt;CALL JOHN AT 555-239-4829 120 MAIN STREET APT 5B, BROOKLYN, NY, USA&lt;/code&gt; and &lt;code&gt;MAIN STREET APT 5B, BROOKLYN, NY, USA&lt;/code&gt; in Google Maps.&lt;/p&gt;
&lt;figure&gt;
  &lt;img src="https://coordable.co/images/geocoding-guide/noise-issue-1.png" alt="Encoding issue example 2"&gt;
  &lt;figcaption&gt;Example of noise: extra phone numbers and instructions prevent the geocoder from finding the correct address.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The result is that noise is not being filtered by Google Maps (which has, to be honest, one of the best parsers out there). Is it Google Maps fault? No, probably not. At this point, we should have cleaned the input ourselves.&lt;/p&gt;
&lt;p&gt;You may think it's a silly example, but it's not 🫠. It happens a lot to see mixed fields because of human errors. &lt;/p&gt;
&lt;h4 id="example-3-typos"&gt;Example 3: typos&lt;/h4&gt;
&lt;p&gt;In this example, we try to geocode the address &lt;code&gt;ru Saint cathrine West, Montreal QC H3B 1B5 Canda&lt;/code&gt; in HERE and Mapbox. It's a mix of French and English with many typos. A correct address could be &lt;code&gt;Rue Sainte-Catherine Ouest, Montreal QC H3B 1B5 Canada&lt;/code&gt; or &lt;code&gt;St-Catherine West, Montreal QC H3B 1B5 Canada&lt;/code&gt;.&lt;/p&gt;
&lt;figure&gt;
  &lt;img src="https://coordable.co/images/geocoding-guide/typo-issue-1.png" alt="Typo issue example 1"&gt;
  &lt;figcaption&gt;Example of typos and mixed languages that can cause geocoding failures.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;HERE returns the correct address, but Mapbox can't find it and returns &lt;code&gt;Montreal, QC, Canada&lt;/code&gt;.
It's interesting to play around with the suggestions in the HERE dropdown. It shows that both English and French versions are available, and it's not affected by the typo &lt;code&gt;ru&lt;/code&gt; instead of &lt;code&gt;Rue&lt;/code&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;!--
### Problem #3: False positives when the system finds the wrong match

Sometimes the geocoder returns a result with high confidence, but it's the *wrong* result. This happens when the input is ambiguous or when multiple legitimate matches exist.

**Ambiguous place names:**

Many cities, streets, and landmarks share the same name. Without enough context, the system has to guess and it might guess wrong.

- **Example: Springfield**   There are dozens of cities named Springfield in the United States alone (Illinois, Massachusetts, Missouri, Oregon, and more). If you search "Springfield" without specifying the state, the geocoder might return the largest or most famous one (Springfield, Illinois), even if you meant a different one.
- **Example: Main Street**   Almost every town has a Main Street. Without a city or postal code, "123 Main Street" could match thousands of addresses.

**Real example:** A retail chain geocodes "Store #47, Springfield" for a sales report. The system returns Springfield, Illinois, but the store is actually in Springfield, Oregon. The error goes unnoticed until the regional manager flies to the wrong state for a site visit.

**Language and transliteration differences:**

Many cities and streets have multiple names or spellings depending on the language.

- **Roma vs Rome:** The Italian name for the capital is "Roma," but many English speakers call it "Rome." Geocoders need to recognize both.
- **Köln vs Cologne:** The German city is "Köln" in German but "Cologne" in English and French.
- **Transliteration:** Cities in non-Latin alphabets (Russian, Arabic, Chinese) can be spelled many ways in Latin characters. "Beijing" vs "Peking," "Mumbai" vs "Bombay," "Kiev" vs "Kyiv."

**Real example:** A travel app geocodes "Roma" and places the user in Rome, Italy. But the user actually meant Roma, Texas a small town in the southern United States. The app confidently shows Italian restaurants nearby, leaving the user very confused.

![Ambiguous results list](assets/article/ambiguous-results.png)
&gt; Illustration: A search results list showing five different cities named "Springfield" in different U.S. states, each with a confidence score.

---

--&gt;

&lt;h3 id="best-practices-how-to-get-reliable-geocoding-results"&gt;Best practices: how to get reliable geocoding results&lt;/h3&gt;
&lt;p&gt;Now that you understand how geocoding works and what can go wrong, let's talk about how to improve your results 😎.  Whether you're a consumer troubleshooting a single address or a business processing thousands, these practices will help.&lt;/p&gt;
&lt;h4 id="1-pick-the-right-geocoding-provider"&gt;1. Pick the right geocoding provider&lt;/h4&gt;
&lt;p&gt;You can get better results by picking the right geocoding provider.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why:&lt;/strong&gt; All providers rely on different data, different parsing rules, different scoring systems, etc. This makes many ways to differentiate them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How:&lt;/strong&gt; You should try different geocoding providers and see which one works best for you. You can also try to use the geocoding provider's API to get the best results. &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Good to know:&lt;/strong&gt; on Coordable, you can select the geocoding provider from a dropdown in the address input field. &lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id="2-always-add-context-country-region-postal-code"&gt;2. Always add &lt;em&gt;context&lt;/em&gt; (country, region, postal code)&lt;/h4&gt;
&lt;p&gt;Geocoding accuracy improves dramatically when you provide strong context: country, state/region, and especially postal code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why:&lt;/strong&gt; Cities, streets, and even building names can be duplicated across the world (or even within a single country). "Paris" could mean Paris, France or Paris, Texas. "There are thousands of streets named Main Street in the United States alone." &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How:&lt;/strong&gt; At least, always concatenate the country to the address. It's a quick win. And if possible, a postal code is a strong hint of the correct location.&lt;/p&gt;
&lt;!-- &gt; **Example:** On Coordable, you can select country/region from a dropdown and enter postal code to maximize geocoding accuracy. --&gt;

&lt;h4 id="3-clean-your-addresses-before-you-geocode"&gt;3. Clean your addresses before you geocode&lt;/h4&gt;
&lt;p&gt;Messy, incomplete, or inconsistent addresses are the #1 cause of poor geocoding results. Cleaning (a.k.a. "address normalization") means fixing typos, filling in missing parts, converting to a canonical format, and removing extraneous noise.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why:&lt;/strong&gt; Geocoding engines often struggle with extra info ("Attn: John", "call before delivery", phone numbers), bad capitalization, spelling/formatting variations, or misplaced address parts. Clean inputs = far fewer errors.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How:&lt;/strong&gt; You can implement some of the rules we presented earlier in this article: normalization, replacement of abbreviations, encoding issues, etc.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tools:&lt;/strong&gt; Basic cleaning can be handled with spreadsheet formulas, or specialized software/APIs like &lt;a href="https://coordable.co/"&gt;Coordable&lt;/a&gt;, &lt;a href="https://github.com/openvenues/libpostal"&gt;libpostal&lt;/a&gt;, or your geocoding provider's normalization endpoint.&lt;/p&gt;
&lt;h4 id="4-help-the-parser-if-possible"&gt;4. Help the parser if possible&lt;/h4&gt;
&lt;p&gt;If possible, provide the information of your address components to the geocoding provider. This can help the parser to understand the address better.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why:&lt;/strong&gt; Parsing is one of the most important steps in geocoding. If it's failing, you will get poor results.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How:&lt;/strong&gt; Some geocoding providers can accept a structured address input like a JSON object with the address components: &lt;code&gt;{house_number: "57", street: "Rue de Varenne", city: "Paris", state: "Île-de-France", country: "France", postal_code: "75015"}&lt;/code&gt;.&lt;/p&gt;
&lt;h4 id="5-understand-what-you-are-geocoding"&gt;5. Understand what you are geocoding&lt;/h4&gt;
&lt;p&gt;Are you sending residential addresses or POIs? Do you have mostly street names alone or do you have house numbers?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why:&lt;/strong&gt; Understanding what you are sending can help you to understand the quality of your results. It's obvious, but if only 50% of your addresses are residential addresses, you should expect less than 50% of results with housenumbers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How:&lt;/strong&gt; You can implement your own rules to classify addresses. For instance, you could write a &lt;a href="https://en.wikipedia.org/wiki/Regular_expression"&gt;regex rule&lt;/a&gt; to parse postal codes and housenumbers. &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Good to know:&lt;/strong&gt; when uploading a dataset or starting a geocoding job on Coordable, we automatically classify the addresses for you.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id="6-dont-trust-results-blindly"&gt;6. Don't trust results blindly&lt;/h4&gt;
&lt;p&gt;Geocoding systems return results even when they're not confident. If you blindly accept the first result, you might get the wrong location. Even the confidence score is not a guarantee of the correctness of the result.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why:&lt;/strong&gt; The confidence score is not a guarantee of the correctness of the result. It's a score given by the geocoding provider to indicate the confidence in the result. It's not a guarantee of the correctness of the result.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How to avoid it:&lt;/strong&gt; Implement your own rules to measure accuracy and correctness of the result, based on the information the provider gives you, as well as your own manual verification. &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Good to know:&lt;/strong&gt; the Coordable platform embeds a powerful verification engine that can help you quickly identify false positives and incorrect results.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id="conclusion"&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;I hope you enjoyed this guide. I tried to explain how geocoding works in a simple way, with examples and practical tips to improve your results.&lt;/p&gt;
&lt;p&gt;A lot of technical details are omitted, such as &lt;em&gt;tokenization&lt;/em&gt;, &lt;em&gt;distance functions&lt;/em&gt;, or &lt;em&gt;scoring rules&lt;/em&gt;. I will probably write a follow-up article to cover these topics. But at least it presents the &lt;strong&gt;big picture of a geocoding process&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;If you are a business and want to improve your geocoding results, please contact us at &lt;a href="mailto:contact@coordable.co"&gt;contact@coordable.co&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;After that, if you want to learn more, here are some resources that I found interesting:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=qKvO5yeXsFE&amp;amp;t=773s"&gt;Why Geocoding is Hard and How You and OSM Can Help&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://opencagedata.com/guides/how-to-think-about-geocoding-accuracy"&gt;How to think about geocoding accuracy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.justinobeirne.com/google-maps-moat"&gt;Google Maps Moat - How far ahead of Apple Maps is Google Maps?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Happy geocoding! ⭐&lt;/p&gt;</description><category>business</category><category>geocoding</category><category>guides</category><guid>https://coordable.co/blog/how-geocoding-works-a-simple-guide/</guid><pubDate>Wed, 22 Oct 2025 10:00:00 GMT</pubDate></item><item><title>How to Geocode Addresses with BAN (Base Adresse Nationale) API</title><link>https://coordable.co/blog/how-to-geocode-with-ban/</link><dc:creator>François Andrieux</dc:creator><description>&lt;p&gt;If you're working with French addresses, the &lt;strong&gt;Base Adresse Nationale (BAN)&lt;/strong&gt; is your best friend. It's France's official address database, maintained by local authorities and IGN (Institut Géographique National), and it's completely free to use. Whether you need to geocode a single address or process thousands, BAN provides authoritative, accurate results without the licensing restrictions or costs of commercial providers.&lt;/p&gt;
&lt;p&gt;Unlike commercial geocoding services that charge per request and restrict how you can use the data, BAN offers unlimited free geocoding with a permissive open license. This makes it ideal for French organizations, government agencies, and anyone building applications focused on France.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Important update:&lt;/strong&gt; As of 2025, the BAN API has been migrated to the Géoplateforme service managed by IGN. The old endpoint &lt;code&gt;api-adresse.data.gouv.fr&lt;/code&gt; is deprecated and will be decommissioned in January 2026. This tutorial covers the new Géoplateforme service endpoints. (&lt;a href="https://adresse.data.gouv.fr/blog/lapi-adresse-de-la-base-adresse-nationale-est-transferee-a-lign"&gt;Source&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; BAN only handles addresses - it doesn't geocode business names, landmarks, or POIs (Points of Interest). For those, you'll need a commercial provider like Google Maps or HERE. But for pure address geocoding in France, BAN is unmatched.&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-with-ban/#introduction-why-use-ban"&gt;Introduction: Why use BAN?&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-geocode-with-ban/#what-is-ban"&gt;What is BAN?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-geocode-with-ban/#when-to-use-ban"&gt;When to use BAN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-geocode-with-ban/#when-ban-isnt-the-right-choice"&gt;When BAN isn't the right choice&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-with-ban/#single-address-geocoding"&gt;Single address geocoding&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-geocode-with-ban/#the-new-endpoint-parameters-2026"&gt;The new endpoint &amp;amp; parameters (2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-geocode-with-ban/#example-request"&gt;Example request&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-geocode-with-ban/#the-response"&gt;The response&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-geocode-with-ban/#the-match-score"&gt;The match score&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-with-ban/#batch-geocoding-processing-multiple-addresses"&gt;Batch geocoding: processing multiple addresses&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-geocode-with-ban/#method-1-using-the-ban-web-interface"&gt;Method 1: Using the BAN web interface&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-geocode-with-ban/#method-2-using-the-ban-api"&gt;Method 2: Using the BAN API&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-geocode-with-ban/#understanding-batch-geocoding-with-the-api"&gt;Understanding batch geocoding with the API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-geocode-with-ban/#example-request_1"&gt;Example request&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-with-ban/#usage-and-cost"&gt;Usage and cost&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-geocode-with-ban/#cost-structure"&gt;Cost structure&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-with-ban/#rate-limits"&gt;Rate limits&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coordable.co/blog/how-to-geocode-with-ban/#wrapping-up"&gt;Wrapping up&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h3 id="introduction-why-use-ban"&gt;Introduction: Why use BAN?&lt;/h3&gt;
&lt;p&gt;Before we dive into the how-to, let's understand why BAN is special and when it makes sense to use it.&lt;/p&gt;
&lt;h4 id="what-is-ban"&gt;What is BAN?&lt;/h4&gt;
&lt;p&gt;The &lt;strong&gt;Base Adresse Nationale (BAN)&lt;/strong&gt; is France's official national address database. It contains over 25 million addresses compiled from local authority data across all French communes, including overseas territories. What makes BAN unique is that it's:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Authoritative&lt;/strong&gt; - maintained by official French authorities (IGN and local governments)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Comprehensive&lt;/strong&gt; - covers every commune in France, including rural areas and small localities&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Accurate&lt;/strong&gt; - provides exact rooftop coordinates rather than interpolated guesses&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Free&lt;/strong&gt; - completely free to use with no quotas or charges&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Open&lt;/strong&gt; - fully open license allowing storage, reuse, and redistribution&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here is an example of a BAN address, shown in the official visualization tool:&lt;/p&gt;
&lt;figure&gt;
  &lt;img src="https://coordable.co/images/ban-guide/ban-address-example.png" alt="BAN address example"&gt;
  &lt;figcaption&gt;Example for "118 rue st charles", Paris (screenshot from the BAN interface).&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h4 id="when-to-use-ban"&gt;When to use BAN&lt;/h4&gt;
&lt;p&gt;BAN is perfect when you:
- Need to geocode French addresses (metropolitan France and overseas territories)
- Want authoritative, government-maintained data
- Need to avoid commercial licensing restrictions
- Are building applications that require address validation
- Want to geocode large volumes without cost concerns
- Need to store and reuse geocoded coordinates permanently&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why BAN works so well:&lt;/strong&gt; Since BAN is updated by local authorities who know their addresses intimately, it provides exact coordinates rather than estimates. This is especially valuable for rural addresses and small localities that commercial providers might struggle with.&lt;/p&gt;
&lt;h4 id="when-ban-isnt-the-right-choice"&gt;When BAN isn't the right choice&lt;/h4&gt;
&lt;p&gt;BAN won't work if you need to:
- Geocode addresses outside of France
- Find businesses, landmarks, or POIs by name
- Handle natural language queries or typos (BAN requires well-formatted addresses)
- Need real-time business information (hours, ratings, etc.)&lt;/p&gt;
&lt;p&gt;For these use cases, you'll want to consider commercial providers like Google Maps, HERE, or Mapbox.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="single-address-geocoding"&gt;Single address geocoding&lt;/h3&gt;
&lt;p&gt;Let's start with the simplest use case: geocoding a single address. This is perfect when you need to convert one address into coordinates, perhaps for a form validation or a single lookup.&lt;/p&gt;
&lt;h4 id="the-new-endpoint-parameters-2026"&gt;The new endpoint &amp;amp; parameters (2026)&lt;/h4&gt;
&lt;p&gt;The BAN geocoding service is now provided through the &lt;strong&gt;Géoplateforme&lt;/strong&gt; service managed by IGN. The endpoint for forward geocoding is:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;https://data.geopf.fr/geocodage/search
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; The old endpoint &lt;code&gt;api-adresse.data.gouv.fr&lt;/code&gt; is deprecated and will be decommissioned in January 2026. You should migrate to the new Géoplateforme endpoint. (&lt;a href="https://adresse.data.gouv.fr/blog/lapi-adresse-de-la-base-adresse-nationale-est-transferee-a-lign"&gt;Source&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;This &lt;code&gt;/search&lt;/code&gt; endpoint accepts the following parameters:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;q&lt;/code&gt;&lt;/strong&gt; (required): The address to geocode&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;limit&lt;/code&gt;&lt;/strong&gt; (optional): Number of results to return (default is 10)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;autocomplete&lt;/code&gt;&lt;/strong&gt; (optional): Enables autocomplete mode (default is true)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Other parameters are available to precise the geocoding context (e.g. city, postal code, etc.), but I won't cover them here. For the full list of parameters, consult the &lt;a href="https://data.geopf.fr/geocodage/openapi"&gt;OpenAPI documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id="example-request"&gt;Example request&lt;/h4&gt;
&lt;p&gt;Here's an example with the address "118 Rue St Charles, Paris":&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;GET https://data.geopf.fr/geocodage/search?q=118+Rue+St+Charles,+Paris&amp;amp;limit=1
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And it returns:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"FeatureCollection"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;"features"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Feature"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;"geometry"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Point"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &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="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;2.283496&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;48.844484&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;"properties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"118 Rue Saint-Charles 75015 Paris"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;"score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.7424048484848483&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;"housenumber"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"118"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"75115_8513_00118"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"118 Rue Saint-Charles"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &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="s2"&gt;"75015"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;"citycode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"75115"&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="mf"&gt;647415.92&lt;/span&gt;&lt;span class="p"&gt;,&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="mf"&gt;6860731.63&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;"city"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Paris"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;"district"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Paris 15e Arrondissement"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;"context"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"75, Paris, Île-de-France"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"housenumber"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;"importance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.83312&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;"street"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Rue Saint-Charles"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;"_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"address"&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"118 rue st charles, Paris"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;In this example, we added a limit of 1 to get only one result. The API returns its best guess for the address, ordered by the match score.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What happens?&lt;/strong&gt; The API searches its database for addresses matching your query and returns a list of possible matches. The response includes the exact coordinates, formatted address, and additional metadata like postal code and city.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id="the-response"&gt;The response&lt;/h4&gt;
&lt;p&gt;The API returns a GeoJSON FeatureCollection. Each feature contains:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ID&lt;/strong&gt; - the unique identifier of the address in the BAN database (&lt;code&gt;properties.id&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Coordinates&lt;/strong&gt; - latitude and longitude in the &lt;code&gt;geometry.coordinates&lt;/code&gt; field (format: &lt;code&gt;[longitude, latitude]&lt;/code&gt;). They are also available as &lt;code&gt;x&lt;/code&gt; and &lt;code&gt;y&lt;/code&gt; in the &lt;code&gt;properties&lt;/code&gt; object.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Formatted address&lt;/strong&gt; - the standardized address label in &lt;code&gt;properties.label&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Address components&lt;/strong&gt; - &lt;code&gt;housenumber&lt;/code&gt;, &lt;code&gt;street&lt;/code&gt;, &lt;code&gt;city&lt;/code&gt;, &lt;code&gt;postcode&lt;/code&gt;, &lt;code&gt;citycode&lt;/code&gt;, etc. The housenumber and street name will be mising if not found.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Importance&lt;/strong&gt; - estimated importance of the address in the database (0-1 scale)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Score&lt;/strong&gt; - relevance score indicating match quality between your query and the result (0-1 scale)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Results are returned ordered by score (highest first), so the first result is typically the best match. However, always verify the address components (especially city and postal code) to ensure the result is correct, as we'll explain in the next section.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id="the-match-score"&gt;The match score&lt;/h4&gt;
&lt;p&gt;The API returns a confidence score between 0 and 1. However, a high score doesn't mean the address is correct, and it definitely doesn't mean the address exists.&lt;/p&gt;
&lt;p&gt;Take our "118 Rue St Charles, Paris" example. The top result scores 0.74, which sounds reasonable. But peek at the second result at 0.62 - it points to "Rue Charles Paris 33130 Bègles". That's 500km away in Bordeaux's suburbs!&lt;/p&gt;
&lt;p&gt;Even trickier: search for "17 Rue St Charles, Paris" and you'll get a respectable 0.74 score... except this address doesn't exist. The API found something that &lt;em&gt;looks&lt;/em&gt; similar, but it's matching strings, not verifying reality.&lt;/p&gt;
&lt;p&gt;The takeaway? &lt;strong&gt;Always sanity-check geocoding results&lt;/strong&gt;. The score tells you how well your query matched &lt;em&gt;something&lt;/em&gt; in the database, not whether that something is what you actually wanted.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="batch-geocoding-processing-multiple-addresses"&gt;Batch geocoding: processing multiple addresses&lt;/h3&gt;
&lt;p&gt;When you have many addresses to geocode - whether it's a spreadsheet with customer addresses or a database export - you'll want to use batch geocoding. BAN offers two approaches: a web interface for one-time tasks and an API for automation.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="method-1-using-the-ban-web-interface"&gt;Method 1: Using the BAN web interface&lt;/h3&gt;
&lt;p&gt;The easiest way to geocode a CSV file is through BAN's web interface. This is perfect if you're not a developer or if you're doing a one-time batch job.&lt;/p&gt;
&lt;p&gt;Here is how to do it:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Prepare your CSV file&lt;/strong&gt; - Include columns with address data (street number, street name, postal code, city). Export from Excel if needed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Upload to &lt;a href="https://adresse.data.gouv.fr/outils/csv"&gt;BAN CSV tool&lt;/a&gt;&lt;/strong&gt; - Select which columns contain your address components (e.g., &lt;em&gt;Numéro, Rue, Ville&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Download results&lt;/strong&gt; - Get your original data plus coordinates, formatted addresses, and &lt;code&gt;result_status&lt;/code&gt; column.&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;
  &lt;img src="https://coordable.co/images/ban-guide/ban-csv-upload.png" alt="BAN CSV tool"&gt;
  &lt;figcaption&gt;The BAN CSV tool allows you to upload a CSV file and select the columns containing the address data.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;And you're done: once you specified&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="method-2-using-the-ban-api"&gt;Method 2: Using the BAN API&lt;/h3&gt;
&lt;p&gt;For automation, integration into applications, or regular batch processing, you'll want to use the BAN API directly. This gives you full control over the process and lets you build custom workflows.&lt;/p&gt;
&lt;h4 id="understanding-batch-geocoding-with-the-api"&gt;Understanding batch geocoding with the API&lt;/h4&gt;
&lt;p&gt;The Géoplateforme service provides a dedicated batch geocoding endpoint that accepts CSV files. This is the recommended approach for processing multiple addresses programmatically.&lt;/p&gt;
&lt;p&gt;The batch endpoint is available at &lt;code&gt;https://data.geopf.fr/geocodage/batch/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The request should be a POST request with the CSV file in the request body. It accept several important parameters:
- &lt;code&gt;columns&lt;/code&gt;: the columns to concatenate the address. It can be left empty to use all columns.
- &lt;code&gt;indexes&lt;/code&gt;: the column to use as index. It's useful to be able to identify the address in the original CSV file.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; You still can make multiple requests to the &lt;code&gt;/search&lt;/code&gt; endpoint, one for each address, but this will be less efficient than using the batch endpoint.&lt;/p&gt;
&lt;h4 id="example-request_1"&gt;Example request&lt;/h4&gt;
&lt;p&gt;Here is an example of a CSV file with the addresses to geocode:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;rue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;street&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;postal_code&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;12.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;Avenue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;des&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Champs&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="err"&gt;É&lt;/span&gt;&lt;span class="n"&gt;lysées&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;Paris&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;75008&lt;/span&gt;
&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;45.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;Rue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;de&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;la&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;République&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;Lyon&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;69002&lt;/span&gt;
&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;78.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;Boulevard&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;de&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;la&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Croisette&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;Cannes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6400&lt;/span&gt;
&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,,,&lt;/span&gt;&lt;span class="err"&gt;???????&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;156.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;Rue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Saint&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Honoré&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;Paris&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;75001&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;In this case, the columns to concatenate the address are: &lt;em&gt;rue, street, city, postal_code&lt;/em&gt;, so we can specify &lt;code&gt;columns=rue,street,city,postal_code&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The request should be:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nx"&gt;POST&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//data.geopf.fr/geocodage/search/csv&lt;/span&gt;
&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;addresses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;csv&lt;/span&gt;
&lt;span class="nx"&gt;columns&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;rue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;street&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;city&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;postal_code&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The response will be a CSV file too, returning both the original data and the geocoded data with new columns all prefixed with &lt;code&gt;result_&lt;/code&gt; (&lt;code&gt;result_score&lt;/code&gt;, &lt;code&gt;result_score_next&lt;/code&gt;, &lt;code&gt;result_label&lt;/code&gt;, &lt;code&gt;result_type&lt;/code&gt;, &lt;code&gt;result_id&lt;/code&gt;, &lt;code&gt;result_housenumber&lt;/code&gt;, &lt;code&gt;result_name&lt;/code&gt;, &lt;code&gt;result_street&lt;/code&gt;, &lt;code&gt;result_postcode&lt;/code&gt;, &lt;code&gt;result_city&lt;/code&gt;, &lt;code&gt;result_context&lt;/code&gt;, &lt;code&gt;result_citycode&lt;/code&gt;, &lt;code&gt;result_oldcitycode&lt;/code&gt;, &lt;code&gt;result_oldcity&lt;/code&gt;, &lt;code&gt;result_district&lt;/code&gt;, &lt;code&gt;result_status&lt;/code&gt;).&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;rue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;street&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;postal_code&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;longitude&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;latitude&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;result_score&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;result_score_next&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;result_label&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;result_type&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;result_id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;result_housenumber&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;result_name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;result_street&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;result_postcode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;result_city&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;result_context&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;result_citycode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;result_oldcitycode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;result_oldcity&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;result_district&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;result_status&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;Avenue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;des&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Champs&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="err"&gt;É&lt;/span&gt;&lt;span class="n"&gt;lysées&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;Paris&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mi"&gt;75008&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mf"&gt;2.302859&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mf"&gt;48.871285&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mf"&gt;0.8596027272727272&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mf"&gt;0.6467871900826445&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;Avenue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;des&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Champs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Elysées&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;75008&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Paris&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;street&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mi"&gt;75108&lt;/span&gt;&lt;span class="n"&gt;_1733&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;&lt;span class="n"&gt;Avenue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;des&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Champs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Elysées&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;Avenue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;des&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Champs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Elysées&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mi"&gt;75008&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;Paris&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mi"&gt;75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Paris&lt;/span&gt;&lt;span class="p"&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;le&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;de&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;France&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mi"&gt;75108&lt;/span&gt;&lt;span class="p"&gt;;;;&lt;/span&gt;&lt;span class="n"&gt;Paris&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Arrondissement&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;
&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;Rue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;de&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;la&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;République&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;Lyon&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mi"&gt;69002&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mf"&gt;4.835859&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mf"&gt;45.761928&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mf"&gt;0.9157595187165776&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mf"&gt;0.6972321052631578&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Rue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;de&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;la&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;République&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;69002&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Lyon&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;housenumber&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mi"&gt;69382&lt;/span&gt;&lt;span class="n"&gt;_6005_00045&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Rue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;de&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;la&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;République&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;Rue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;de&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;la&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;République&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mi"&gt;69002&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;Lyon&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mi"&gt;69&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Rhône&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Auvergne&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Rhône&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Alpes&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mi"&gt;69382&lt;/span&gt;&lt;span class="p"&gt;;;;&lt;/span&gt;&lt;span class="n"&gt;Lyon&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Arrondissement&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;
&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mi"&gt;78&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;Boulevard&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;de&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;la&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Croisette&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;Cannes&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mi"&gt;06400&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mf"&gt;7.032336&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mf"&gt;43.54684&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mf"&gt;0.9329795565410199&lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;&lt;span class="mi"&gt;78&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Boulevard&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;de&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;la&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Croisette&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;06400&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Cannes&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;housenumber&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mi"&gt;06029&lt;/span&gt;&lt;span class="n"&gt;_0880_00078&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mi"&gt;78&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mi"&gt;78&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Boulevard&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;de&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;la&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Croisette&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;Boulevard&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;de&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;la&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Croisette&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mi"&gt;06400&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;Cannes&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mi"&gt;06&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Alpes&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Maritimes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Provence&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Alpes&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Côte&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="s1"&gt;'Azur;06029;;;;ok&lt;/span&gt;
&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;;;;&lt;/span&gt;&lt;span class="err"&gt;???????&lt;/span&gt;&lt;span class="p"&gt;;;;;;;;;;;;;;;;;;;;&lt;/span&gt;&lt;span class="n"&gt;skipped&lt;/span&gt;
&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mi"&gt;156&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;Rue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Saint&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Honoré&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;Paris&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mi"&gt;75001&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mf"&gt;2.339989&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mf"&gt;48.862052&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mf"&gt;0.9164409090909089&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mf"&gt;0.6147660173160173&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mi"&gt;156&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Rue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Saint&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Honoré&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;75001&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Paris&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;housenumber&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mi"&gt;75101&lt;/span&gt;&lt;span class="n"&gt;_8635_00156&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mi"&gt;156&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mi"&gt;156&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Rue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Saint&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Honoré&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;Rue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Saint&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Honoré&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mi"&gt;75001&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;Paris&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mi"&gt;75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Paris&lt;/span&gt;&lt;span class="p"&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;le&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;de&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;France&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="mi"&gt;75101&lt;/span&gt;&lt;span class="p"&gt;;;;&lt;/span&gt;&lt;span class="n"&gt;Paris&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;er&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Arrondissement&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;result_status&lt;/code&gt; column contains "ok" if the address was geocoded successfully, "skipped" if the address was not geocoded successfully.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Interesting!&lt;/strong&gt; In batch CSV mode, the API only returns one result per row. However, you can still now the score of the second best match in the &lt;code&gt;result_score_next&lt;/code&gt; column.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="usage-and-cost"&gt;Usage and cost&lt;/h3&gt;
&lt;p&gt;BAN is completely free to use, with no hidden costs or quotas. This makes it an excellent choice for organizations of any size.&lt;/p&gt;
&lt;h4 id="cost-structure"&gt;Cost structure&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;API usage: FREE&lt;/strong&gt; - No charges for API requests&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No quotas&lt;/strong&gt; - Process as many addresses as you need&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No subscription fees&lt;/strong&gt; - No monthly or annual costs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Database download: FREE&lt;/strong&gt; - You can download the entire BAN database for free&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Why BAN is free:&lt;/strong&gt; BAN is a public service maintained by French government agencies. It's funded by taxpayers and provided as open data to benefit French society and economy.&lt;/p&gt;
&lt;p&gt;If you're processing millions of addresses or need offline access, you can &lt;a href="https://adresse.data.gouv.fr/donnees-nationales"&gt;download the complete BAN database&lt;/a&gt; and run your own geocoding locally.&lt;/p&gt;
&lt;p&gt;For a detailed comparison with commercial providers (Google Maps, HERE, Mapbox...), check out my &lt;a href="https://coordable.co/country-analysis/best-geocoding-providers-france/"&gt;Best Geocoding Providers for France&lt;/a&gt; guide.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="rate-limits"&gt;Rate limits&lt;/h3&gt;
&lt;p&gt;BAN allows &lt;strong&gt;50 requests per second per IP&lt;/strong&gt;. If you exceed this, you'll get HTTP 429 errors. Throttle to ~40/second and you'll be fine.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="wrapping-up"&gt;Wrapping up&lt;/h3&gt;
&lt;p&gt;BAN is free, accurate, and open. For French addresses, it's hard to beat. Just remember: migrate to the new Géoplateforme endpoint (&lt;code&gt;data.geopf.fr&lt;/code&gt;) before January 2026 if you're still using the old one.&lt;/p&gt;
&lt;p&gt;Full API reference: &lt;a href="https://data.geopf.fr/geocodage/openapi"&gt;Géoplateforme OpenAPI documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To get a full overview of the geocoding providers for France and a comparison between them, check out our guide: &lt;a href="https://coordable.co/country-analysis/best-geocoding-providers-france/"&gt;Best Geocoding Providers for France&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;small&gt;&lt;strong&gt;Last updated:&lt;/strong&gt; 2025-01-15 |
&lt;strong&gt;Updated by:&lt;/strong&gt; François Andrieux |
&lt;strong&gt;Sources:&lt;/strong&gt; &lt;a href="https://adresse.data.gouv.fr/outils/api-doc/adresse"&gt;BAN API Documentation&lt;/a&gt;, &lt;a href="https://adresse.data.gouv.fr/outils/csv"&gt;CSV Geocoding Tool&lt;/a&gt;, &lt;a href="https://adresse.data.gouv.fr/blog/lapi-adresse-de-la-base-adresse-nationale-est-transferee-a-lign"&gt;API Migration Announcement&lt;/a&gt;, &lt;a href="https://data.geopf.fr/geocodage/getCapabilities"&gt;Géoplateforme Capabilities&lt;/a&gt;, &lt;a href="https://data.geopf.fr/geocodage/openapi"&gt;Géoplateforme OpenAPI Documentation&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;&lt;small&gt;&lt;em&gt;Disclaimer: This guide is for informational purposes. Always refer to official BAN and Géoplateforme documentation for current endpoints and terms.&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;</description><category>api</category><category>ban</category><category>france</category><category>geocoding</category><category>guides</category><category>how-to</category><guid>https://coordable.co/blog/how-to-geocode-with-ban/</guid><pubDate>Wed, 15 Jan 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>