<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Alfiya Tarasenko</title>
    <description>The latest articles on DEV Community by Alfiya Tarasenko (@geoapify).</description>
    <link>https://dev.to/geoapify</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F672541%2Fb8f414ef-ff17-4230-ae03-49c5f7c04e1c.png</url>
      <title>DEV Community: Alfiya Tarasenko</title>
      <link>https://dev.to/geoapify</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/geoapify"/>
    <language>en</language>
    <item>
      <title>How to Build a “What Is My Current Elevation?” Tool with an Elevation API</title>
      <dc:creator>Alfiya Tarasenko</dc:creator>
      <pubDate>Thu, 18 Jun 2026 11:26:20 +0000</pubDate>
      <link>https://dev.to/geoapify-maps-api/how-to-build-a-what-is-my-current-elevation-tool-with-an-elevation-api-2ojb</link>
      <guid>https://dev.to/geoapify-maps-api/how-to-build-a-what-is-my-current-elevation-tool-with-an-elevation-api-2ojb</guid>
      <description>&lt;p&gt;Have you ever wondered how high above sea level you are right now?&lt;br&gt;
Browsers can tell us a user’s latitude and longitude, but not their elevation. To answer “What is my current elevation?”, we need to get the user’s coordinates first, then send them to an elevation data source.&lt;/p&gt;

&lt;p&gt;In this tutorial, we’ll build a small &lt;strong&gt;“What Is My Current Elevation?”&lt;/strong&gt; tool with the &lt;a href="https://www.geoapify.com/elevation-api/" rel="noopener noreferrer"&gt;Geoapify Elevation API&lt;/a&gt;. It will get the current location, request elevation for that point, and display the result in meters.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codepen.io/geoapify/pen/EaZgMeJ" rel="noopener noreferrer"&gt;Try demo in Codepen &amp;gt;&amp;gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;The tool follows a simple workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The browser requests the user's current location through the Geolocation API.&lt;/li&gt;
&lt;li&gt;The Geolocation API returns the latitude and longitude coordinates.&lt;/li&gt;
&lt;li&gt;Those coordinates are sent to the Geoapify Elevation API.&lt;/li&gt;
&lt;li&gt;The API looks up the terrain elevation for that location.&lt;/li&gt;
&lt;li&gt;The application displays the elevation value on the page.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In other words, the browser tells us where the user is, and the Elevation API tells us how high above sea level that location is.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; Browser Geolocation API
          ↓
 Latitude / Longitude
          ↓
 Geoapify Elevation API
          ↓
 Elevation Above Sea Level
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  From Location to Elevation
&lt;/h2&gt;

&lt;p&gt;So, to build a “What Is My Current Elevation?” tool, we need to solve two main tasks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Get the user’s current location.&lt;/li&gt;
&lt;li&gt;Request elevation for that location.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Before we start, it's worth clarifying what elevation actually means.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Elevation&lt;/strong&gt; is the height of a location above mean sea level. While latitude and longitude describe a position on Earth's surface, elevation adds a third dimension: height. Applications such as hiking apps, route planners, weather tools, and drone software often use elevation data to better understand terrain.&lt;/p&gt;

&lt;h3&gt;
  
  
  Getting User Location
&lt;/h3&gt;

&lt;p&gt;The first step is getting the user’s coordinates. The browser can do this with the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Geolocation_API" rel="noopener noreferrer"&gt;Geolocation API&lt;/a&gt;, which returns latitude and longitude for the current device or browser session.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnfcxpsl4mv8vqt69ch45.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnfcxpsl4mv8vqt69ch45.png" alt=" " width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are two important limitations to keep in mind:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the user must grant location permission;&lt;/li&gt;
&lt;li&gt;geolocation may be unavailable or fail in some environments.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because of that, a production-ready tool should also have a fallback.&lt;br&gt;
A practical fallback is &lt;a href="https://www.geoapify.com/ip-geolocation-api/" rel="noopener noreferrer"&gt;IP geolocation&lt;/a&gt;, which estimates a user’s location from their IP address. This fallback is useful, but it is usually less precise than browser geolocation.&lt;/p&gt;
&lt;h3&gt;
  
  
  Requesting Elevation
&lt;/h3&gt;

&lt;p&gt;Latitude and longitude tell us where the user is, but they don’t tell us how high that location is above sea level. To get that information, we query an elevation dataset through the &lt;a href="https://www.geoapify.com/elevation-api/" rel="noopener noreferrer"&gt;Geoapify Elevation API&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The API accepts one or more locations and returns elevation values for them. For a “my current elevation” tool, we only need to send one location:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;locations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;lat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;latitude&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;lon&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;longitude&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response contains the elevation value and units, which we can display in the UI.&lt;/p&gt;

&lt;p&gt;So the second part of the app is simple: take the coordinates from the location step, send them to the Elevation API, and render the returned elevation.&lt;/p&gt;

&lt;p&gt;At this point, we understand the workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Get the user's coordinates.&lt;/li&gt;
&lt;li&gt;Request elevation for those coordinates.&lt;/li&gt;
&lt;li&gt;Display the result.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now let's build a working "What Is My Current Elevation?" tool from scratch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building the Tool
&lt;/h2&gt;

&lt;p&gt;Now let’s implement the basic version of the tool with plain HTML, CSS, and JavaScript.&lt;/p&gt;

&lt;p&gt;The app will do three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ask the browser for the user’s latitude and longitude.&lt;/li&gt;
&lt;li&gt;Send those coordinates to the Geoapify Elevation API.&lt;/li&gt;
&lt;li&gt;Show the returned elevation on the page.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We’ll start with the page structure, then add the JavaScript logic step by step.&lt;/p&gt;

&lt;h3&gt;
  
  
  Add Minimal HTML and CSS
&lt;/h3&gt;

&lt;p&gt;For the basic version, the page only needs a button to start the elevation lookup and a result area to show the response.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!doctype html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;What Is My Current Elevation?&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Arial&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.75rem&lt;/span&gt; &lt;span class="m"&gt;1rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;pointer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nt"&gt;pre&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;margin-top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#102a43&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#f0f4f8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;white-space&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pre-wrap&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"my-elevation-button"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;My Elevation&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;pre&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"elevation-info"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Click the button to get your elevation.&lt;span class="nt"&gt;&amp;lt;/pre&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;elevationButton&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#my-elevation-button&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;elevationInfo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#elevation-info&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;elevationButton&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;elevationInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Requesting your location...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="c1"&gt;// Location and elevation logic will go here&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The button will trigger the location request. The &lt;code&gt;&amp;lt;pre&amp;gt;&lt;/code&gt; element is useful here because it lets us display multiple lines: elevation, latitude, and longitude.&lt;/p&gt;

&lt;h3&gt;
  
  
  Get Latitude and Longitude
&lt;/h3&gt;

&lt;p&gt;Now we can add the first JavaScript step: asking the browser for the user’s current coordinates.&lt;/p&gt;

&lt;p&gt;The browser Geolocation API uses callbacks, so we’ll wrap it in a Promise to make it easier to use with &lt;code&gt;async&lt;/code&gt; / &lt;code&gt;await&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getCurrentLocation&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;geolocation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getCurrentPosition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;position&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
          &lt;span class="na"&gt;latitude&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;position&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;coords&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;latitude&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;longitude&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;position&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;coords&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;longitude&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="nx"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;enableHighAccuracy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;maximumAge&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This function resolves with an object like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;latitude:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;48.8584&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;longitude:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;2.2945&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These coordinates are the input for the elevation request.&lt;/p&gt;

&lt;h3&gt;
  
  
  Request Elevation
&lt;/h3&gt;

&lt;p&gt;After we have latitude and longitude, we can send them to the &lt;a href="https://www.geoapify.com/elevation-api/" rel="noopener noreferrer"&gt;Geoapify Elevation API&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Create a Geoapify API key in the &lt;a href="https://myprojects.geoapify.com/" rel="noopener noreferrer"&gt;Geoapify My Projects dashboard&lt;/a&gt; and replace &lt;code&gt;YOUR_API_KEY&lt;/code&gt; with your key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;apiKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getElevation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;latitude&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;longitude&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://api.geoapify.com/v1/geodata/elevation?apiKey=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;apiKey&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="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;units&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;metric&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;locations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;lat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;latitude&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;lon&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;longitude&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;return&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;results&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;locations&lt;/code&gt; field is an array, so the same endpoint can also request elevation for multiple points. For the current elevation tool, we only send one location.&lt;/p&gt;

&lt;p&gt;A successful response looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"results"&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="nl"&gt;"location"&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="nl"&gt;"lat"&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.8584&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"lon"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;2.2945&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="nl"&gt;"elevation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"units"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"m"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the code above, &lt;code&gt;data.results[0]&lt;/code&gt; gives us the elevation result for the first requested location.&lt;/p&gt;

&lt;h3&gt;
  
  
  Optional: Add an IP Geolocation Fallback
&lt;/h3&gt;

&lt;p&gt;Browser geolocation gives better results, but it depends on user permission. If the user denies the request, or if geolocation is unavailable, we can fall back to &lt;a href="https://www.geoapify.com/ip-geolocation-api/" rel="noopener noreferrer"&gt;IP geolocation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;IP geolocation is usually less precise than browser geolocation because it estimates location from the user’s network connection, not from the device itself. Still, it is useful as a backup when exact location is not available.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getLocationFromIp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://api.geoapify.com/v1/ipinfo?apiKey=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;apiKey&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;latitude&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;latitude&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;longitude&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;longitude&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then update the location function to use browser geolocation first and IP geolocation as a fallback:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getCurrentLocation&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;geolocation&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;getLocationFromIp&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;geolocation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getCurrentPosition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;position&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
          &lt;span class="na"&gt;latitude&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;position&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;coords&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;latitude&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;longitude&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;position&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;coords&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;longitude&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;getLocationFromIp&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;enableHighAccuracy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;maximumAge&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Wire Everything Together
&lt;/h3&gt;

&lt;p&gt;Now we can connect everything to the button. On click, the app gets the current location, sends it to the Elevation API, and writes the result to the page.&lt;/p&gt;

&lt;p&gt;The click handler looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;elevationButton&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;elevationInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Requesting your location...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;location&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getCurrentLocation&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="nx"&gt;elevationInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Requesting elevation...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;elevation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getElevation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;latitude&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;longitude&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;elevationInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s2"&gt;`Elevation: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;elevation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;elevation&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="nx"&gt;elevation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;units&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="s2"&gt;`Latitude: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;latitude&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="s2"&gt;`Longitude: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;longitude&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="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Going Further
&lt;/h2&gt;

&lt;p&gt;The minimal version shows the core idea: get coordinates, request elevation, and display the result.&lt;/p&gt;

&lt;p&gt;From here, you can extend the tool in several useful ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;show the selected location on an interactive map with &lt;a href="https://www.geoapify.com/map-tiles/" rel="noopener noreferrer"&gt;Geoapify Map Tiles&lt;/a&gt; and MapLibre GL JS;&lt;/li&gt;
&lt;li&gt;let users click the map to request elevation for any point;&lt;/li&gt;
&lt;li&gt;use &lt;a href="https://www.geoapify.com/ip-geolocation-api/" rel="noopener noreferrer"&gt;IP geolocation&lt;/a&gt; as a fallback when browser geolocation is unavailable;&lt;/li&gt;
&lt;li&gt;request elevation for multiple locations in one API call;&lt;/li&gt;
&lt;li&gt;visualize elevation across a city or the current map view.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can see these ideas in the full demo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codepen.io/geoapify/pen/EaZgMeJ" rel="noopener noreferrer"&gt;Open the “What Is My Current Elevation?” demo &amp;gt;&amp;gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;A current elevation tool is mostly a coordinate lookup followed by an elevation lookup. The browser Geolocation API gives us latitude and longitude, and the &lt;a href="https://www.geoapify.com/elevation-api/" rel="noopener noreferrer"&gt;Geoapify Elevation API&lt;/a&gt; turns those coordinates into elevation above sea level.&lt;/p&gt;

&lt;p&gt;From there, you can keep the tool simple or expand it with maps, click-based lookup, IP geolocation fallback, and multi-point elevation requests.&lt;/p&gt;

&lt;p&gt;Try the complete demo on CodePen, or create a free Geoapify API key and build your own version:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://codepen.io/geoapify/pen/EaZgMeJ" rel="noopener noreferrer"&gt;Open the “What Is My Current Elevation?” demo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://myprojects.geoapify.com/" rel="noopener noreferrer"&gt;Get a Geoapify API key&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>geoapify</category>
      <category>api</category>
      <category>gis</category>
      <category>elevation</category>
    </item>
    <item>
      <title>Route optimization is more than finding the shortest route. Learn how VRPs, constraints, optimization algorithms, APIs, and tools like OR-Tools and VROOM work together to solve real-world delivery and logistics challenges.</title>
      <dc:creator>Alfiya Tarasenko</dc:creator>
      <pubDate>Fri, 05 Jun 2026 12:43:19 +0000</pubDate>
      <link>https://dev.to/geoapify/route-optimization-is-more-than-finding-the-shortest-route-learn-how-vrps-constraints-23lj</link>
      <guid>https://dev.to/geoapify/route-optimization-is-more-than-finding-the-shortest-route-learn-how-vrps-constraints-23lj</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/geoapify-maps-api/what-is-route-optimization-algorithms-apis-and-open-source-tools-51d7" class="crayons-story__hidden-navigation-link"&gt;What Is Route Optimization? Algorithms, APIs, and Open-Source Tools&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/geoapify-maps-api"&gt;
            &lt;img alt="Geoapify Maps API logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F11485%2F7ba45fe8-d6bb-450f-971e-d78a7bb3cec3.png" class="crayons-logo__image" width="200" height="200"&gt;
          &lt;/a&gt;

          &lt;a href="/geoapify" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F672541%2Fb8f414ef-ff17-4230-ae03-49c5f7c04e1c.png" alt="geoapify profile" class="crayons-avatar__image" width="800" height="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/geoapify" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Alfiya Tarasenko
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Alfiya Tarasenko
                
              
              &lt;div id="story-author-preview-content-3826879" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/geoapify" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F672541%2Fb8f414ef-ff17-4230-ae03-49c5f7c04e1c.png" class="crayons-avatar__image" alt="" width="800" height="800"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Alfiya Tarasenko&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/geoapify-maps-api" class="crayons-story__secondary fw-medium"&gt;Geoapify Maps API&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/geoapify-maps-api/what-is-route-optimization-algorithms-apis-and-open-source-tools-51d7" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jun 5&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/geoapify-maps-api/what-is-route-optimization-algorithms-apis-and-open-source-tools-51d7" id="article-link-3826879"&gt;
          What Is Route Optimization? Algorithms, APIs, and Open-Source Tools
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/algorithms"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;algorithms&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/logistics"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;logistics&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/api"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;api&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/geoapify-maps-api/what-is-route-optimization-algorithms-apis-and-open-source-tools-51d7#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            8 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>What Is Route Optimization? Algorithms, APIs, and Open-Source Tools</title>
      <dc:creator>Alfiya Tarasenko</dc:creator>
      <pubDate>Fri, 05 Jun 2026 12:42:37 +0000</pubDate>
      <link>https://dev.to/geoapify-maps-api/what-is-route-optimization-algorithms-apis-and-open-source-tools-51d7</link>
      <guid>https://dev.to/geoapify-maps-api/what-is-route-optimization-algorithms-apis-and-open-source-tools-51d7</guid>
      <description>&lt;p&gt;Whether you’re building a delivery platform, a field service application, or a logistics solution, you’ll eventually face the same challenge: &lt;strong&gt;finding the best route for multiple stops&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;At first glance, the problem seems straightforward. Just visit all stops while minimizing travel time or distance.&lt;/p&gt;

&lt;p&gt;In reality, route optimization quickly becomes complex. Even a route with 10 stops can have millions of possible combinations, and real-world constraints such as delivery time windows, vehicle capacities, driver schedules, and pickup-and-delivery requirements make the problem even harder.&lt;/p&gt;

&lt;p&gt;In this article, we'll cover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What route optimization is&lt;/li&gt;
&lt;li&gt;How route optimization problems are modeled with VRP&lt;/li&gt;
&lt;li&gt;Algorithms used to solve route optimization problems&lt;/li&gt;
&lt;li&gt;Ready-to-use route optimization applications&lt;/li&gt;
&lt;li&gt;Route Optimization APIs&lt;/li&gt;
&lt;li&gt;Open-source route optimization tools&lt;/li&gt;
&lt;li&gt;How to choose the right solution&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Is Route Optimization?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Route optimization is the process of finding the most efficient routes for one or more vehicles while satisfying a set of constraints.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The goal is typically to minimize travel time, distance, or operational costs while ensuring that all required stops are visited.&lt;/p&gt;

&lt;p&gt;Unlike simple routing, route optimization is not just about finding the shortest path between two points. It must also determine the order in which stops should be visited, assign stops to vehicles, and satisfy various operational constraints.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqbnr874yut592u8xw37j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqbnr874yut592u8xw37j.png" alt="Routing vs Route Optimization" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Routing focuses on finding a path between locations. Route optimization focuses on finding the best set of routes while satisfying real-world constraints.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Common constraints include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vehicle capacities&lt;/li&gt;
&lt;li&gt;Delivery time windows&lt;/li&gt;
&lt;li&gt;Driver schedules&lt;/li&gt;
&lt;li&gt;Pickup and delivery requirements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As the number of stops and constraints grows, route optimization becomes increasingly difficult to solve.&lt;/p&gt;

&lt;h2&gt;
  
  
  Modeling Route Optimization with VRP
&lt;/h2&gt;

&lt;p&gt;As route optimization problems become larger and more complex, they require a formal way to represent vehicles, stops, objectives, and constraints.&lt;/p&gt;

&lt;p&gt;In operations research and computer science, these challenges are commonly modeled as the &lt;strong&gt;Vehicle Routing Problem (VRP)&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Over the years, numerous VRP variants have been developed to represent different real-world requirements:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Common Constraints&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;&lt;a href="https://en.wikipedia.org/wiki/Vehicle_routing_problem" rel="noopener noreferrer"&gt;Vehicle Routing Problem (VRP)&lt;/a&gt;&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;The basic problem of assigning locations to vehicles and determining the best visit order.&lt;/td&gt;
&lt;td&gt;Travel time, distance, cost&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Capacitated Vehicle Routing Problem (CVRP)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Vehicles have limited capacity, such as weight, volume, or number of packages.&lt;/td&gt;
&lt;td&gt;Vehicle capacity, load balancing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Vehicle Routing Problem with Time Windows (VRPTW)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Deliveries or visits must occur within specified time windows.&lt;/td&gt;
&lt;td&gt;Delivery windows, service duration, driver schedules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Pickup and Delivery Problem (PDP)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Items must be picked up at one location and delivered to another.&lt;/td&gt;
&lt;td&gt;Pickup-before-delivery, vehicle capacity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Multi-Depot Vehicle Routing Problem (MDVRP)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Vehicles can start and end at different depots.&lt;/td&gt;
&lt;td&gt;Depot assignment, vehicle availability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Open Vehicle Routing Problem (OVRP)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Vehicles do not need to return to their starting depot.&lt;/td&gt;
&lt;td&gt;End location flexibility&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Periodic Vehicle Routing Problem (PVRP)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Customers require visits on specific days according to a schedule.&lt;/td&gt;
&lt;td&gt;Visit frequency, planning horizon&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Dynamic Vehicle Routing Problem (DVRP)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;New jobs or changes can occur while routes are already in progress.&lt;/td&gt;
&lt;td&gt;Real-time updates, traffic, new orders&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Most real-world route optimization systems combine several of these variants. For example, a delivery application may need to handle vehicle capacities, customer time windows, multiple depots, pickup-and-delivery operations, driver shifts, breaks, and priority deliveries simultaneously.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Route Optimization Is Solved
&lt;/h2&gt;

&lt;p&gt;Route optimization belongs to a class of computationally difficult problems. As the number of stops increases, &lt;strong&gt;the number of possible route combinations grows exponentially&lt;/strong&gt;, making it impractical to evaluate every possible solution.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;5 stops → 120 possible routes&lt;/li&gt;
&lt;li&gt;10 stops → 3.6 million possible routes&lt;/li&gt;
&lt;li&gt;20 stops → over 2 quintillion possible routes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And that's before considering multiple vehicles, time windows, capacities, or other constraints.&lt;/p&gt;

&lt;p&gt;Because of this, route optimization systems rely on specialized algorithms that search for high-quality solutions without evaluating every possible route.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exact Algorithms
&lt;/h3&gt;

&lt;p&gt;Exact algorithms guarantee the optimal solution. Common approaches include:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Algorithm&lt;/th&gt;
&lt;th&gt;Description&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;&lt;a href="https://en.wikipedia.org/wiki/Branch_and_bound" rel="noopener noreferrer"&gt;Branch and Bound&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Systematically explores possible solutions while pruning suboptimal branches.&lt;/td&gt;
&lt;td&gt;Small to medium-sized optimization problems&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://en.wikipedia.org/wiki/Integer_programming" rel="noopener noreferrer"&gt;Mixed Integer Programming (MIP)&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Models route optimization using variables, objectives, and constraints solved mathematically.&lt;/td&gt;
&lt;td&gt;Complex optimization problems with many business constraints&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These methods systematically explore the solution space while using mathematical techniques to eliminate suboptimal solutions.&lt;/p&gt;

&lt;p&gt;While highly accurate, exact algorithms become computationally expensive as the number of stops, vehicles, and constraints grows. As a result, they are typically used for smaller optimization problems or as benchmarks for evaluating other approaches.&lt;/p&gt;

&lt;h3&gt;
  
  
  Heuristics and Metaheuristics
&lt;/h3&gt;

&lt;p&gt;Most modern route optimization systems rely on heuristics and metaheuristics that can find high-quality solutions much faster than exact algorithms.&lt;/p&gt;

&lt;p&gt;Common approaches include:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Algorithm&lt;/th&gt;
&lt;th&gt;Description&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;&lt;a href="https://en.wikipedia.org/wiki/Clarke_and_Wright_savings_algorithm" rel="noopener noreferrer"&gt;Clarke-Wright Savings Algorithm&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;A classic heuristic that builds routes by merging stops in a way that maximizes travel savings.&lt;/td&gt;
&lt;td&gt;Quickly generating initial solutions for routing problems&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://en.wikipedia.org/wiki/Local_search_(optimization)" rel="noopener noreferrer"&gt;Local Search&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Starts with an existing solution and iteratively improves it by making small changes.&lt;/td&gt;
&lt;td&gt;Refining and improving existing routes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://en.wikipedia.org/wiki/Tabu_search" rel="noopener noreferrer"&gt;Tabu Search&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;An advanced local search technique that avoids revisiting recently explored solutions.&lt;/td&gt;
&lt;td&gt;Large optimization problems with many local optima&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://en.wikipedia.org/wiki/Simulated_annealing" rel="noopener noreferrer"&gt;Simulated Annealing&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Occasionally accepts worse solutions to escape local optima and explore more of the search space.&lt;/td&gt;
&lt;td&gt;Complex optimization problems where local search may get stuck&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://en.wikipedia.org/wiki/Genetic_algorithm" rel="noopener noreferrer"&gt;Genetic Algorithms&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Inspired by biological evolution, combining and mutating solutions over multiple generations.&lt;/td&gt;
&lt;td&gt;Large-scale optimization problems with many constraints&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Rather than evaluating every possible route, these methods intelligently explore the search space and iteratively improve solutions.&lt;/p&gt;

&lt;p&gt;While they do not guarantee the mathematically optimal result, they can often find near-optimal solutions in seconds, making them well suited for large-scale route optimization problems involving hundreds or thousands of stops.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In practice, many route optimization systems combine multiple techniques. For example, a solver may generate an initial route using a heuristic and then improve it using local search or other metaheuristic methods.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Route Optimization Solutions
&lt;/h2&gt;

&lt;p&gt;Fortunately, you don't need to implement route optimization algorithms from scratch. A wide range of solutions already exists, from business applications designed for non-technical users to open-source solvers and Route Optimization APIs that can be integrated directly into your applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ready-to-Use Applications
&lt;/h3&gt;

&lt;p&gt;Ready-to-use route optimization applications provide a complete solution for planning and managing routes. They typically include route optimization, driver management, dispatching, tracking, and reporting features through a web interface, allowing businesses to start optimizing routes without writing any code.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Product&lt;/th&gt;
&lt;th&gt;Description&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;&lt;a href="https://optimoroute.com/" rel="noopener noreferrer"&gt;OptimoRoute&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Route planning and field service management platform with route optimization, scheduling, and tracking capabilities.&lt;/td&gt;
&lt;td&gt;Delivery businesses and field service teams&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://onfleet.com/" rel="noopener noreferrer"&gt;Onfleet&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Last-mile delivery management platform focused on dispatching, driver tracking, and route optimization.&lt;/td&gt;
&lt;td&gt;Delivery and logistics companies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.routific.com/" rel="noopener noreferrer"&gt;Routific&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Cloud-based route optimization software designed for delivery operations.&lt;/td&gt;
&lt;td&gt;Small and medium-sized delivery fleets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://getcircuit.com/" rel="noopener noreferrer"&gt;Circuit for Teams&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Route planning platform with driver apps, dispatch tools, and route optimization.&lt;/td&gt;
&lt;td&gt;Local delivery businesses&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.routexl.com/" rel="noopener noreferrer"&gt;RouteXL&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Online route optimization tool that helps plan multi-stop routes through a simple web interface.&lt;/td&gt;
&lt;td&gt;Small businesses and occasional route planning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.myrouteonline.com/" rel="noopener noreferrer"&gt;MyRouteOnline&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Route planning software that optimizes routes from spreadsheets and address lists.&lt;/td&gt;
&lt;td&gt;Businesses managing routes from Excel or CSV files&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These platforms are ideal when you need route optimization as a business tool. However, if you're building your own application or need complete control over the optimization process, open-source route optimization engines may be a better fit.&lt;/p&gt;

&lt;h3&gt;
  
  
  Route Optimization APIs
&lt;/h3&gt;

&lt;p&gt;Route Optimization APIs provide route optimization capabilities through a web service, allowing developers to integrate optimization directly into their applications without managing optimization engines or infrastructure.&lt;/p&gt;

&lt;p&gt;Most APIs accept a list of locations, vehicles, and constraints, then return optimized routes, stop assignments, and scheduling information.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;API&lt;/th&gt;
&lt;th&gt;Description&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;&lt;a href="https://www.geoapify.com/route-planner-api/" rel="noopener noreferrer"&gt;Geoapify Route Optimization API&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Route optimization API supporting multiple vehicles, capacities, time windows, pickup and delivery operations, and route balancing.&lt;/td&gt;
&lt;td&gt;Applications that need route optimization without managing infrastructure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://developers.google.com/maps/documentation/route-optimization" rel="noopener noreferrer"&gt;Google Route Optimization API&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Enterprise-grade route optimization service built on Google's mapping and routing infrastructure.&lt;/td&gt;
&lt;td&gt;Large-scale logistics and enterprise applications&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://nextbillion.ai/route-optimization-api" rel="noopener noreferrer"&gt;NextBillion.ai Route Optimization API&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Optimization API focused on logistics, dispatching, and delivery operations.&lt;/td&gt;
&lt;td&gt;Logistics and delivery applications&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  Advantages
&lt;/h4&gt;

&lt;p&gt;Route Optimization APIs are often the fastest way to add optimization capabilities to an application. They eliminate the need to implement complex algorithms, manage optimization infrastructure, or maintain routing engines.&lt;/p&gt;

&lt;p&gt;Key benefits include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fast integration&lt;/li&gt;
&lt;li&gt;No infrastructure to manage&lt;/li&gt;
&lt;li&gt;No solver expertise required&lt;/li&gt;
&lt;li&gt;Automatically updated and maintained&lt;/li&gt;
&lt;li&gt;Scales with application usage&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Challenges
&lt;/h4&gt;

&lt;p&gt;Like any managed service, Route Optimization APIs come with trade-offs. While they significantly reduce development and operational effort, they may not provide the same level of control as self-hosted solutions.&lt;/p&gt;

&lt;p&gt;Common considerations include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Usage-based pricing&lt;/li&gt;
&lt;li&gt;Less flexibility than self-hosted solutions&lt;/li&gt;
&lt;li&gt;Limited access to underlying optimization logic&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Open-Source Route Optimization Tools
&lt;/h3&gt;

&lt;p&gt;For developers who need complete control over the optimization process, open-source route optimization tools provide a flexible alternative to commercial applications and managed APIs.&lt;/p&gt;

&lt;p&gt;These tools implement many of the algorithms discussed earlier and can be integrated into custom applications, self-hosted platforms, or research projects.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Language&lt;/th&gt;
&lt;th&gt;Description&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;&lt;a href="https://developers.google.com/optimization" rel="noopener noreferrer"&gt;Google OR-Tools&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;C++, Python, Java, C#&lt;/td&gt;
&lt;td&gt;Comprehensive optimization toolkit that includes powerful Vehicle Routing Problem (VRP) solvers and support for many routing constraints.&lt;/td&gt;
&lt;td&gt;Custom optimization applications and research&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/VROOM-Project/vroom" rel="noopener noreferrer"&gt;VROOM&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;C++&lt;/td&gt;
&lt;td&gt;High-performance route optimization engine designed specifically for vehicle routing problems. Integrates with routing engines such as OSRM, Valhalla, and Openrouteservice.&lt;/td&gt;
&lt;td&gt;Logistics and delivery platforms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/graphhopper/jsprit" rel="noopener noreferrer"&gt;jsprit&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Java&lt;/td&gt;
&lt;td&gt;Java toolkit for solving vehicle routing problems with support for capacities, time windows, and custom constraints.&lt;/td&gt;
&lt;td&gt;Java-based route optimization applications&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Google's OR-Tools is one of the most widely used open-source optimization frameworks and is frequently used for solving Vehicle Routing Problems.&lt;/p&gt;

&lt;h4&gt;
  
  
  Advantages
&lt;/h4&gt;

&lt;p&gt;Open-source tools provide maximum flexibility and allow organizations to fully control how route optimization is implemented and deployed.&lt;/p&gt;

&lt;p&gt;Key benefits include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No per-request usage fees&lt;/li&gt;
&lt;li&gt;Full control over optimization logic&lt;/li&gt;
&lt;li&gt;Ability to customize constraints and objectives&lt;/li&gt;
&lt;li&gt;Self-hosted deployment&lt;/li&gt;
&lt;li&gt;Access to source code&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Challenges
&lt;/h4&gt;

&lt;p&gt;Using open-source solvers typically requires more engineering effort than ready-to-use applications or APIs.&lt;/p&gt;

&lt;p&gt;Common considerations include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Infrastructure and deployment management&lt;/li&gt;
&lt;li&gt;Integration with routing engines&lt;/li&gt;
&lt;li&gt;Building a &lt;a href="https://en.wikipedia.org/wiki/Distance_matrix" rel="noopener noreferrer"&gt;distance matrix&lt;/a&gt; or travel time matrix for all locations&lt;/li&gt;
&lt;li&gt;Solver configuration and tuning&lt;/li&gt;
&lt;li&gt;Maintenance and upgrades&lt;/li&gt;
&lt;li&gt;Additional development effort&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Many route optimization engines, including VROOM and OR-Tools, rely on a travel time or distance matrix that describes the cost of traveling between every pair of locations. Generating this matrix can be computationally expensive and typically requires integration with a routing service.&lt;/p&gt;

&lt;p&gt;For example, the &lt;a href="https://www.geoapify.com/route-matrix-api/" rel="noopener noreferrer"&gt;Geoapify Route Matrix API&lt;/a&gt; can generate travel time and distance matrices that can then be used as input for route optimization engines.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Choose the Right Solution
&lt;/h2&gt;

&lt;p&gt;The best route optimization solution depends on how much control and customization you need.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;If you want to...&lt;/th&gt;
&lt;th&gt;Recommended Solution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Start optimizing routes immediately without development&lt;/td&gt;
&lt;td&gt;Ready-to-use application&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Give dispatchers and drivers a complete route planning solution&lt;/td&gt;
&lt;td&gt;Ready-to-use application&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add route optimization to an existing application&lt;/td&gt;
&lt;td&gt;Route Optimization API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build a custom route optimization workflow&lt;/td&gt;
&lt;td&gt;Route Optimization API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-host the optimization engine&lt;/td&gt;
&lt;td&gt;Open-source tool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Customize optimization logic and constraints&lt;/td&gt;
&lt;td&gt;Open-source tool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Experiment with optimization algorithms&lt;/td&gt;
&lt;td&gt;Open-source tool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Avoid managing infrastructure and optimization engines&lt;/td&gt;
&lt;td&gt;Route Optimization API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Have full control over the optimization process&lt;/td&gt;
&lt;td&gt;Open-source tool&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  In Summary
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Choose a &lt;strong&gt;ready-to-use application&lt;/strong&gt; if you want to optimize routes without writing code or managing technical infrastructure.&lt;/li&gt;
&lt;li&gt;Choose a &lt;strong&gt;Route Optimization API&lt;/strong&gt; if you're building an application and need route optimization capabilities without implementing optimization algorithms yourself.&lt;/li&gt;
&lt;li&gt;Choose an &lt;strong&gt;open-source tool&lt;/strong&gt; if you need maximum flexibility, self-hosting, or complete control over the optimization process.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is no universally best route optimization solution. The right choice depends on whether your priority is ease of use, rapid integration, or maximum flexibility. Understanding the trade-offs between applications, APIs, and open-source tools will help you choose a solution that matches both your technical requirements and business goals.&lt;/p&gt;

</description>
      <category>algorithms</category>
      <category>programming</category>
      <category>logistics</category>
      <category>api</category>
    </item>
    <item>
      <title>Need to geocode thousands of addresses but don’t want to pay? This guide compares 4 practical approaches: online tools, geocoding APIs, batch geocoding, and self-hosted solutions—with free limits, examples, and trade-offs.</title>
      <dc:creator>Alfiya Tarasenko</dc:creator>
      <pubDate>Thu, 04 Jun 2026 09:28:32 +0000</pubDate>
      <link>https://dev.to/geoapify/need-to-geocode-thousands-of-addresses-but-dont-want-to-pay-this-guide-compares-4-practical-4io0</link>
      <guid>https://dev.to/geoapify/need-to-geocode-thousands-of-addresses-but-dont-want-to-pay-this-guide-compares-4-practical-4io0</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/geoapify-maps-api/how-to-geocode-thousands-of-addresses-for-free-35ka" class="crayons-story__hidden-navigation-link"&gt;How to Geocode Thousands of Addresses for Free&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/geoapify-maps-api"&gt;
            &lt;img alt="Geoapify Maps API logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F11485%2F7ba45fe8-d6bb-450f-971e-d78a7bb3cec3.png" class="crayons-logo__image" width="200" height="200"&gt;
          &lt;/a&gt;

          &lt;a href="/geoapify" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F672541%2Fb8f414ef-ff17-4230-ae03-49c5f7c04e1c.png" alt="geoapify profile" class="crayons-avatar__image" width="800" height="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/geoapify" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Alfiya Tarasenko
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Alfiya Tarasenko
                
              
              &lt;div id="story-author-preview-content-3817542" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/geoapify" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F672541%2Fb8f414ef-ff17-4230-ae03-49c5f7c04e1c.png" class="crayons-avatar__image" alt="" width="800" height="800"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Alfiya Tarasenko&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/geoapify-maps-api" class="crayons-story__secondary fw-medium"&gt;Geoapify Maps API&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/geoapify-maps-api/how-to-geocode-thousands-of-addresses-for-free-35ka" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jun 4&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/geoapify-maps-api/how-to-geocode-thousands-of-addresses-for-free-35ka" id="article-link-3817542"&gt;
          How to Geocode Thousands of Addresses for Free
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/geocoding"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;geocoding&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/gis"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;gis&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/data"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;data&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/javascript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;javascript&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/geoapify-maps-api/how-to-geocode-thousands-of-addresses-for-free-35ka#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            9 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>api</category>
      <category>data</category>
      <category>tooling</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to Geocode Thousands of Addresses for Free</title>
      <dc:creator>Alfiya Tarasenko</dc:creator>
      <pubDate>Thu, 04 Jun 2026 09:27:46 +0000</pubDate>
      <link>https://dev.to/geoapify-maps-api/how-to-geocode-thousands-of-addresses-for-free-35ka</link>
      <guid>https://dev.to/geoapify-maps-api/how-to-geocode-thousands-of-addresses-for-free-35ka</guid>
      <description>&lt;p&gt;Geocoding large address datasets (finding latitude and longitude coordinates for addresses) can quickly become expensive, especially when you need to process hundreds or thousands of records. This can be a challenge for businesses, researchers, and individuals working with limited budgets.&lt;/p&gt;

&lt;p&gt;Fortunately, there are several &lt;strong&gt;ways to geocode thousands of addresses completely free of charge&lt;/strong&gt;, and in this article we’ll explore the most practical options.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Geocode Thousands of Addresses for Free
&lt;/h2&gt;

&lt;p&gt;Yes. While most geocoding services charge based on usage, many providers offer free quotas that are large enough for one-time projects, research, testing, and small business needs.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: "Free" does not necessarily mean unlimited. Most services apply daily quotas, rate limits, or file-size restrictions. In some cases, free usage may require more effort, such as splitting large datasets into smaller batches, waiting for daily quotas to reset, or processing data over multiple days. &lt;/p&gt;

&lt;p&gt;However, with the right approach, these limits are often sufficient to geocode thousands—or even tens of thousands—of addresses without spending money.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The exact limits depend on the approach you choose. Here are three practical ways to geocode thousands of addresses for free:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Free Limit&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;Online Tool&lt;/td&gt;
&lt;td&gt;2,500 addresses per run&lt;/td&gt;
&lt;td&gt;CSV files, no coding&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Geocoding API&lt;/td&gt;
&lt;td&gt;3,000 addresses/day&lt;/td&gt;
&lt;td&gt;Applications and automation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Batch Geocoding API&lt;/td&gt;
&lt;td&gt;Up to 6,000 addresses/day (priority 0.5)&lt;/td&gt;
&lt;td&gt;Large datasets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-Hosted Geocoder&lt;/td&gt;
&lt;td&gt;Depends on your infrastructure&lt;/td&gt;
&lt;td&gt;Very large datasets&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Let's take a closer look at each option and see when it makes the most sense to use it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method #1: Use an Online Geocoding Tool
&lt;/h2&gt;

&lt;p&gt;The simplest way to geocode a large address dataset is to use an online geocoding tool. This approach requires no coding, no API integration, and no software installation. &lt;strong&gt;You simply upload a CSV or Excel file containing addresses and download the results.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For example, &lt;a href="https://www.geosearch.online/" rel="noopener noreferrer"&gt;GeoSearch Online&lt;/a&gt; allows you to upload CSV and Excel files and geocode up to 2,500 addresses per run for free. The service returns latitude and longitude coordinates along with standardized address information and other useful location data.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3bp1q66dmc1eo2u1b0fs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3bp1q66dmc1eo2u1b0fs.png" alt="GeoSearch Online upload page" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Upload a CSV or Excel file containing addresses and &lt;strong&gt;geocode up to 2,500 records for free&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  How it works
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Export your address list to a CSV or Excel file.&lt;/li&gt;
&lt;li&gt;Upload the file to GeoSearch Online.&lt;/li&gt;
&lt;li&gt;Select the address column to geocode.&lt;/li&gt;
&lt;li&gt;Start the geocoding process.&lt;/li&gt;
&lt;li&gt;Download the resulting file with coordinates.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;

&lt;p&gt;The following example shows how a list of addresses can be enriched with coordinates and standardized address data.&lt;/p&gt;

&lt;p&gt;Before geocoding:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;original_address&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1 Apple Park Way, Cupertino, CA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;350 5th Ave, New York, NY&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;After geocoding:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;original_address&lt;/th&gt;
&lt;th&gt;lat&lt;/th&gt;
&lt;th&gt;lon&lt;/th&gt;
&lt;th&gt;formatted&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1 Apple Park Way, Cupertino, CA&lt;/td&gt;
&lt;td&gt;37.3302112&lt;/td&gt;
&lt;td&gt;-122.010771&lt;/td&gt;
&lt;td&gt;1 Apple Park Way, Cupertino, CA 94087, United States of America&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;350 5th Ave, New York, NY&lt;/td&gt;
&lt;td&gt;40.7484421&lt;/td&gt;
&lt;td&gt;-73.9856589&lt;/td&gt;
&lt;td&gt;Empire State Building, 350 5th Avenue, New York, NY 10118, United States of America&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In addition to latitude and longitude coordinates, geocoding services often return standardized address components such as house numbers, street names, postcodes, cities, states, countries, and confidence scores. This enriched data can help with address validation, data cleaning, analytics, and mapping applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  Summary
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&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;• No coding required&lt;br&gt;• Works directly with CSV and Excel files&lt;br&gt;• Fast and easy to use&lt;br&gt;• Suitable for one-time projects&lt;/td&gt;
&lt;td&gt;• Requires manual file upload&lt;br&gt;• Large datasets may need to be split into multiple files&lt;br&gt;• Not suitable for automated workflows&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Free Limit&lt;/strong&gt;: Up to 2,500 addresses per run.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for&lt;/strong&gt;: Businesses, researchers, students, and anyone who needs to geocode a spreadsheet without writing code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method #2: Use a Geocoding API
&lt;/h2&gt;

&lt;p&gt;If you need to geocode addresses regularly or integrate geocoding into an application, a geocoding API is often a better choice than an online tool. Instead of uploading files manually, your application sends addresses directly to the API and receives the results programmatically.&lt;/p&gt;

&lt;p&gt;Unlike online tools that process an entire file at once, geocoding APIs typically work synchronously. Your application sends an address, waits for the response, and immediately receives latitude, longitude, and standardized address information. This makes APIs a great choice for websites, mobile apps, internal tools, and automated workflows that require real-time geocoding.&lt;/p&gt;

&lt;p&gt;For example, the &lt;a href="https://www.geoapify.com/geocoding-api/" rel="noopener noreferrer"&gt;Geoapify Geocoding API&lt;/a&gt; provides up to 3,000 free requests per day.&lt;/p&gt;

&lt;h3&gt;
  
  
  How it works
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Create a free account at &lt;a href="https://www.geoapify.com/" rel="noopener noreferrer"&gt;Geoapify&lt;/a&gt; and obtain an API key.&lt;/li&gt;
&lt;li&gt;Send an address and your API key to the geocoding API.&lt;/li&gt;
&lt;li&gt;The API searches for the best matching location.&lt;/li&gt;
&lt;li&gt;Receive latitude, longitude, and additional address details in the response.&lt;/li&gt;
&lt;li&gt;Store or use the results in your application.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Example: Geocode a Single Address
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;apiKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;address&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1 Apple Park Way, Cupertino, CA&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="s2"&gt;`https://api.geoapify.com/v1/geocode/search?text=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;encodeURIComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;apiKey=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;apiKey&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="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;features&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response contains coordinates, a formatted address, and additional location details that can be used for mapping, analytics, and address validation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Respecting Rate Limits
&lt;/h3&gt;

&lt;p&gt;Since each address requires a separate API request, it’s important to respect the API’s rate limits. &lt;/p&gt;

&lt;p&gt;For example, the &lt;strong&gt;Geoapify free plan allows up to 5 requests per second and 3,000 requests per day&lt;/strong&gt;. A rate-limiting library can help automatically distribute requests over time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example: Using a Rate Limiter
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://www.npmjs.com/package/@geoapify/request-rate-limiter" rel="noopener noreferrer"&gt;@geoapify/request-rate-limiter&lt;/a&gt; package helps distribute requests according to your plan limits.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;RequestRateLimiter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@geoapify/request-rate-limiter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;apiKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Function that geocodes a single address&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;geocodeAddress&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s2"&gt;`https://api.geoapify.com/v1/geocode/search?text=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;encodeURIComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;apiKey=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;apiKey&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="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// List of addresses to geocode&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;addresses&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1 Apple Park Way, Cupertino, CA&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;350 5th Ave, New York, NY&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1600 Amphitheatre Parkway, Mountain View, CA&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="c1"&gt;// Convert each address into a request function&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;requests&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;addresses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;geocodeAddress&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Process requests while respecting rate limits&lt;/span&gt;
&lt;span class="nx"&gt;RequestRateLimiter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rateLimitedRequests&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;requests&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="c1"&gt;// Maximum requests per interval&lt;/span&gt;
    &lt;span class="mi"&gt;1000&lt;/span&gt;    &lt;span class="c1"&gt;// Interval duration in milliseconds&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;All addresses processed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Error processing requests:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Summary
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&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;• Easy to automate&lt;br&gt;• Integrates directly into applications and scripts&lt;br&gt;• Returns results immediately&lt;br&gt;• No manual file uploads&lt;/td&gt;
&lt;td&gt;• Requires programming knowledge&lt;br&gt;• Daily usage limits apply&lt;br&gt;• Requests must respect rate limits&lt;br&gt;• Large datasets may take time to process&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Free limit&lt;/strong&gt;: Up to 3,000 requests per day.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for&lt;/strong&gt;: Applications, websites, scripts, and automated workflows that need real-time geocoding.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method #3: Use a Batch Geocoding API
&lt;/h2&gt;

&lt;p&gt;If you need to geocode thousands of addresses at once, a batch geocoding API can be more efficient than sending individual requests through a standard geocoding API.&lt;/p&gt;

&lt;p&gt;Unlike synchronous APIs that process one address per request and return results immediately, batch geocoding APIs work asynchronously. You submit a large set of addresses as a job, wait for the processing to complete, and then download the results. This approach is designed specifically for large datasets and avoids the need to manage thousands of individual requests.&lt;/p&gt;

&lt;p&gt;For example, the &lt;a href="https://www.geoapify.com/solutions/batch-geocoding-requests/" rel="noopener noreferrer"&gt;Geoapify Batch Geocoding API&lt;/a&gt; allows you to submit up to 1,000 addresses per job. If your dataset is larger, you can &lt;strong&gt;simply submit multiple batch jobs&lt;/strong&gt; and process them independently.&lt;/p&gt;

&lt;p&gt;An additional advantage of batch geocoding is the priority parameter. Lower-priority jobs cost fewer credits because they are processed when system resources are available. For example, using a &lt;code&gt;priority=0.5&lt;/code&gt; reduces the processing cost by 50%. As a result, the free plan’s daily quota can &lt;strong&gt;process up to 6,000 addresses per day&lt;/strong&gt; instead of 3,000.&lt;/p&gt;

&lt;h3&gt;
  
  
  How it works
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Create a free account at &lt;a href="https://www.geoapify.com/" rel="noopener noreferrer"&gt;Geoapify&lt;/a&gt; and obtain an API key.&lt;/li&gt;
&lt;li&gt;Prepare a list of addresses to geocode.&lt;/li&gt;
&lt;li&gt;Submit the addresses as a batch job.&lt;/li&gt;
&lt;li&gt;Wait for the job to complete.&lt;/li&gt;
&lt;li&gt;Download the results containing coordinates and standardized address information.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Example: Batch Geocoding with a Library
&lt;/h3&gt;

&lt;p&gt;While you can work directly with the Batch Geocoding API, using the &lt;a href="https://www.npmjs.com/package/@geoapify/batch-geocoding" rel="noopener noreferrer"&gt;@geoapify/batch-geocoding&lt;/a&gt; library simplifies the asynchronous workflow by handling job creation, polling, and result retrieval.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Batcher&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@geoapify/batch-geocoding&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Create SDK client with your API key&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;batcher&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Batcher&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Submit a batch geocoding job&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;job&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;batcher&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;geocode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1000 5th Ave, New York, NY 10028, United States&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;11 W 53rd St, New York, NY 10019, United States&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="cm"&gt;/* Up to 1,000 addresses can be submitted in a single batch job*/&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt; &lt;span class="c1"&gt;// Lower-priority processing&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Wait for processing to complete and retrieve results&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;jsonResult&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;job&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getResults&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;jsonResult&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The library submits the batch job, waits for processing to complete, and returns the geocoding results, making it much easier to work with large datasets.&lt;/p&gt;

&lt;h3&gt;
  
  
  Summary
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&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;• Designed for large datasets&lt;br&gt;• Processes many addresses in a single job&lt;br&gt;• Higher free throughput than synchronous APIs&lt;br&gt;• Supports discounted low-priority processing&lt;/td&gt;
&lt;td&gt;• Results are not immediate&lt;br&gt;• Requires programming knowledge&lt;br&gt;• Jobs may take time to complete&lt;br&gt;• Not suitable for real-time geocoding&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Free limit&lt;/strong&gt;: Up to 3,000 addresses per day, or up to 6,000 addresses per day when using &lt;code&gt;priority=0.5&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for&lt;/strong&gt;: Large address datasets, data enrichment projects, migrations, and bulk geocoding workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method #4: Use a Self-Hosted Geocoding Engine
&lt;/h2&gt;

&lt;p&gt;If you need complete control over your geocoding infrastructure or want to process very large datasets without API quotas, you can run an open-source geocoding engine on your own server.&lt;/p&gt;

&lt;p&gt;Unlike hosted geocoding services, self-hosted solutions require you to install, configure, and maintain the software, as well as regularly update the underlying geographic data. In return, you are not limited by API quotas and can process as many addresses as your hardware can handle.&lt;/p&gt;

&lt;p&gt;Several mature open-source geocoding engines are available:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Engine&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Documentation&lt;/th&gt;
&lt;th&gt;Installation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Nominatim&lt;/td&gt;
&lt;td&gt;The most widely used OpenStreetMap geocoder&lt;/td&gt;
&lt;td&gt;&lt;a href="https://nominatim.org/release-docs/latest/" rel="noopener noreferrer"&gt;Docs&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://nominatim.org/release-docs/latest/admin/Installation/" rel="noopener noreferrer"&gt;Install&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pelias&lt;/td&gt;
&lt;td&gt;A highly scalable geocoder built for large deployments&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/pelias/documentation" rel="noopener noreferrer"&gt;Docs&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/pelias/docker" rel="noopener noreferrer"&gt;Install&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Photon&lt;/td&gt;
&lt;td&gt;A lightweight geocoder based on OpenStreetMap data and Elasticsearch&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/komoot/photon" rel="noopener noreferrer"&gt;Docs&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/komoot/photon?tab=readme-ov-file#installation" rel="noopener noreferrer"&gt;Install&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;While self-hosting removes usage limits, it introduces infrastructure costs and operational complexity. Importing and indexing OpenStreetMap data can require significant disk space, memory, and processing time, depending on the geographic area covered.&lt;/p&gt;

&lt;h3&gt;
  
  
  Summary
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&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;• No API quotas&lt;br&gt;• Full control over data and infrastructure&lt;br&gt;• Suitable for very large datasets&lt;br&gt;• Can be integrated into internal systems&lt;/td&gt;
&lt;td&gt;• Requires server infrastructure&lt;br&gt;• Installation and maintenance effort&lt;br&gt;• Data updates must be managed manually&lt;br&gt;• Results may vary depending on data quality and configuration&lt;br&gt;• Higher technical complexity&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Free limit&lt;/strong&gt;: No API quotas. Limited only by your infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for&lt;/strong&gt;: Organizations processing large volumes of addresses, companies with strict data requirements, and teams that need full control over their geocoding infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which Method Should You Choose?
&lt;/h2&gt;

&lt;p&gt;The best option depends on your dataset size, technical skills, and automation requirements.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Free Limit&lt;/th&gt;
&lt;th&gt;Coding Required&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;Online Tool&lt;/td&gt;
&lt;td&gt;2,500 addresses per run&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;One-time CSV or Excel processing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Geocoding API&lt;/td&gt;
&lt;td&gt;3,000 addresses per day&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Applications and automation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Batch Geocoding API&lt;/td&gt;
&lt;td&gt;Up to 6,000 addresses per day (priority 0.5)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Large datasets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-Hosted Geocoder&lt;/td&gt;
&lt;td&gt;Depends on infrastructure&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Very large datasets and full control&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Choose an &lt;strong&gt;online geocoding tool&lt;/strong&gt; if you have a spreadsheet and need a quick, no-code solution.&lt;/li&gt;
&lt;li&gt;Choose a &lt;strong&gt;geocoding API&lt;/strong&gt; if you need real-time geocoding in an application, website, or automated workflow.&lt;/li&gt;
&lt;li&gt;Choose a &lt;strong&gt;batch geocoding API&lt;/strong&gt; if you need to process thousands of addresses efficiently and don't need immediate results.&lt;/li&gt;
&lt;li&gt;Choose a &lt;strong&gt;self-hosted geocoding&lt;/strong&gt; engine if you need full control over your infrastructure and are prepared to manage the software and data yourself.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For most users, an online tool is the easiest place to start. If you need automation, APIs provide more flexibility, while batch processing and self-hosted solutions are better suited for large-scale geocoding projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Geocoding thousands of addresses for free is entirely possible. Whether you prefer a simple online tool, a geocoding API, a batch processing service, or a self-hosted solution, the best choice depends on your dataset size, automation requirements, and technical expertise.&lt;/p&gt;

&lt;p&gt;For most users, an online tool is the easiest option, while APIs and batch processing provide more flexibility for larger and recurring geocoding tasks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.geosearch.online/" rel="noopener noreferrer"&gt;GeoSearch Online&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.geoapify.com/geocoding-api/" rel="noopener noreferrer"&gt;Geoapify Geocoding API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.geoapify.com/solutions/batch-geocoding-requests/" rel="noopener noreferrer"&gt;Geoapify Batch Geocoding API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apidocs.geoapify.com/docs/geocoding/" rel="noopener noreferrer"&gt;Geoapify Geocoding API Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/@geoapify/batch-geocoding" rel="noopener noreferrer"&gt;@geoapify/batch-geocoding SDK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/@geoapify/request-rate-limiter" rel="noopener noreferrer"&gt;@geoapify/request-rate-limiter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>geocoding</category>
      <category>gis</category>
      <category>data</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Confused between Routing APIs and Route Optimization APIs? This guide breaks down the difference with clear examples, a side-by-side comparison, and when to use each in real applications.</title>
      <dc:creator>Alfiya Tarasenko</dc:creator>
      <pubDate>Mon, 20 Apr 2026 12:12:12 +0000</pubDate>
      <link>https://dev.to/geoapify/confused-between-routing-apis-and-route-optimization-apis-this-guide-breaks-down-the-difference-1gp5</link>
      <guid>https://dev.to/geoapify/confused-between-routing-apis-and-route-optimization-apis-this-guide-breaks-down-the-difference-1gp5</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/geoapify-maps-api/what-is-the-difference-between-a-routing-api-and-a-route-optimization-api-17ol" class="crayons-story__hidden-navigation-link"&gt;What Is the Difference Between a Routing API and a Route Optimization API?&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/geoapify-maps-api"&gt;
            &lt;img alt="Geoapify Maps API logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F11485%2F7ba45fe8-d6bb-450f-971e-d78a7bb3cec3.png" class="crayons-logo__image" width="200" height="200"&gt;
          &lt;/a&gt;

          &lt;a href="/geoapify" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F672541%2Fb8f414ef-ff17-4230-ae03-49c5f7c04e1c.png" alt="geoapify profile" class="crayons-avatar__image" width="800" height="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/geoapify" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Alfiya Tarasenko
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Alfiya Tarasenko
                
              
              &lt;div id="story-author-preview-content-3526850" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/geoapify" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F672541%2Fb8f414ef-ff17-4230-ae03-49c5f7c04e1c.png" class="crayons-avatar__image" alt="" width="800" height="800"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Alfiya Tarasenko&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/geoapify-maps-api" class="crayons-story__secondary fw-medium"&gt;Geoapify Maps API&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/geoapify-maps-api/what-is-the-difference-between-a-routing-api-and-a-route-optimization-api-17ol" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Apr 20&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/geoapify-maps-api/what-is-the-difference-between-a-routing-api-and-a-route-optimization-api-17ol" id="article-link-3526850"&gt;
          What Is the Difference Between a Routing API and a Route Optimization API?
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/api"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;api&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/maps"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;maps&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/routing"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;routing&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/appdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;appdev&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/geoapify-maps-api/what-is-the-difference-between-a-routing-api-and-a-route-optimization-api-17ol#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>algorithms</category>
      <category>api</category>
      <category>systemdesign</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>What Is the Difference Between a Routing API and a Route Optimization API?</title>
      <dc:creator>Alfiya Tarasenko</dc:creator>
      <pubDate>Mon, 20 Apr 2026 12:11:30 +0000</pubDate>
      <link>https://dev.to/geoapify-maps-api/what-is-the-difference-between-a-routing-api-and-a-route-optimization-api-17ol</link>
      <guid>https://dev.to/geoapify-maps-api/what-is-the-difference-between-a-routing-api-and-a-route-optimization-api-17ol</guid>
      <description>&lt;p&gt;If you're building a map-based or logistics application, you’ll likely come across two terms that sound very similar: &lt;strong&gt;Routing API&lt;/strong&gt; and &lt;strong&gt;Route Optimization API&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;At first glance, they may seem interchangeable. Both deal with routes, distances, and travel time. But in practice, they solve very different problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  In simple terms
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A routing API calculates the path between given points and returns the actual route (geometry, distance, time)
&lt;/li&gt;
&lt;li&gt;A route optimization API determines the most efficient order of stops, without necessarily returning full route geometry
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, a routing service like the &lt;a href="https://www.geoapify.com/routing-api/" rel="noopener noreferrer"&gt;Geoapify Routing API&lt;/a&gt; helps you build directions &lt;strong&gt;from point A to point B, from B to C, and so on&lt;/strong&gt; — following a predefined order. &lt;/p&gt;

&lt;p&gt;In contrast, the &lt;a href="https://www.geoapify.com/route-planner-api/" rel="noopener noreferrer"&gt;Geoapify Route Optimization API&lt;/a&gt; is designed to organize multiple stops — &lt;strong&gt;even across multiple vehicles&lt;/strong&gt; — into the most efficient routes.&lt;/p&gt;

&lt;p&gt;In this article, we’ll break down the difference step by step, compare how each API works, and show when to use one over the other.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a Routing API?
&lt;/h2&gt;

&lt;p&gt;A routing API is used to calculate the path between locations in a predefined order.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffa0505tbtp7zhfuit8xz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffa0505tbtp7zhfuit8xz.png" alt="Example of a route between multiple points" width="800" height="617"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You provide a list of waypoints, and the API returns the route that connects them — including distance, estimated travel time, and often turn-by-turn instructions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key characteristics
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Works with a fixed sequence of points (A → B → C)
&lt;/li&gt;
&lt;li&gt;Returns full route geometry (coordinates for map display)
&lt;/li&gt;
&lt;li&gt;Provides distance and travel time
&lt;/li&gt;
&lt;li&gt;Can include turn-by-turn navigation instructions
&lt;/li&gt;
&lt;li&gt;Supports different travel modes (driving, walking, cycling, etc.)
&lt;/li&gt;
&lt;li&gt;Allows avoiding specific route parts (tolls, highways, ferries, etc.)
&lt;/li&gt;
&lt;li&gt;Can provide additional details like road type, surface, and other route attributes &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example use cases
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Showing directions from a user’s location to a destination
&lt;/li&gt;
&lt;li&gt;Displaying a route on a map
&lt;/li&gt;
&lt;li&gt;Building navigation features in apps
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Try it yourself
&lt;/h3&gt;

&lt;p&gt;You can test routing requests in the. &lt;a href="https://apidocs.geoapify.com/playground/routing/" rel="noopener noreferrer"&gt;Geoapify API Playground&lt;/a&gt;: enter a few waypoints and see how the API builds a route step by step.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a Route Optimization API?
&lt;/h2&gt;

&lt;p&gt;A route optimization API is designed to find the most efficient way to visit multiple locations.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fixyp2cozr0ul7cb9z4h1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fixyp2cozr0ul7cb9z4h1.png" alt="Example of optimized routes for multiple stops and multiple vehicles" width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Instead of following a predefined order, you provide a list of stops, and the API determines the best sequence to minimize travel time, distance, or overall cost.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key characteristics
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Works with an unordered set of locations
&lt;/li&gt;
&lt;li&gt;Optimizes the sequence of stops
&lt;/li&gt;
&lt;li&gt;Supports multiple vehicles and route assignments
&lt;/li&gt;
&lt;li&gt;Focuses on efficiency (time, distance, cost)
&lt;/li&gt;
&lt;li&gt;Can handle constraints like time windows, capacities, or working hours
&lt;/li&gt;
&lt;li&gt;Does not necessarily return full route geometry (focus is on planning)
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example use cases
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Delivery route planning
&lt;/li&gt;
&lt;li&gt;Field service scheduling
&lt;/li&gt;
&lt;li&gt;Logistics and fleet management
&lt;/li&gt;
&lt;li&gt;Last-mile delivery optimization
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Try it yourself
&lt;/h3&gt;

&lt;p&gt;You can experiment with route optimization in the &lt;a href="https://apidocs.geoapify.com/playground/route-planner/" rel="noopener noreferrer"&gt;Geoapify API Playground&lt;/a&gt;: generate a task, visualize it on the map, solve it, and check the optimized result.&lt;/p&gt;

&lt;h2&gt;
  
  
  Routing API vs Route Optimization API
&lt;/h2&gt;

&lt;p&gt;The difference between these two APIs is easiest to understand when viewed side by side:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Routing API&lt;/th&gt;
&lt;th&gt;Route Optimization API&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Main goal&lt;/td&gt;
&lt;td&gt;Calculate a route between points&lt;/td&gt;
&lt;td&gt;Find the most efficient order of stops&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Input&lt;/td&gt;
&lt;td&gt;Ordered waypoints (A → B → C)&lt;/td&gt;
&lt;td&gt;Unordered locations (optionally with multiple vehicles)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output&lt;/td&gt;
&lt;td&gt;Route geometry, distance, time&lt;/td&gt;
&lt;td&gt;Optimized sequence + route assignments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Focus&lt;/td&gt;
&lt;td&gt;Navigation&lt;/td&gt;
&lt;td&gt;Planning &amp;amp; efficiency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Usage&lt;/td&gt;
&lt;td&gt;Route planning and live navigation&lt;/td&gt;
&lt;td&gt;Route planning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-vehicle support&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Constraints (time windows, capacity, shifts)&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Key takeaway
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Routing API → connects points in a given order
&lt;/li&gt;
&lt;li&gt;Route Optimization API → determines the best order of points
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In short: &lt;strong&gt;routing builds routes, optimization plans them.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  When to Use Each API
&lt;/h2&gt;

&lt;p&gt;Choosing between a Routing API and a Route Optimization API depends on the problem you’re solving.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use a Routing API if:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You need directions between points
&lt;/li&gt;
&lt;li&gt;The order of stops is already known
&lt;/li&gt;
&lt;li&gt;You want to display routes on a map
&lt;/li&gt;
&lt;li&gt;You are building navigation features (including live navigation)
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Show directions from a user’s location to a destination, or follow a predefined route A → B → C.&lt;/p&gt;




&lt;h3&gt;
  
  
  Use a Route Optimization API if:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You have multiple stops and the order is not fixed
&lt;/li&gt;
&lt;li&gt;You want to minimize travel time, distance, or cost
&lt;/li&gt;
&lt;li&gt;You need to plan routes for multiple vehicles
&lt;/li&gt;
&lt;li&gt;You have constraints like time windows or capacity
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Plan delivery routes for 20 addresses across several drivers.&lt;/p&gt;




&lt;h3&gt;
  
  
  Use both together (common in real apps)
&lt;/h3&gt;

&lt;p&gt;In many applications, these APIs are combined:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Route Optimization API → determines the best order of stops
&lt;/li&gt;
&lt;li&gt;Routing API → builds the actual routes between those stops
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In practice, you often need to use a Routing API after optimization to generate routes between the optimized waypoints, visualize them on a map, or provide navigation instructions.&lt;/p&gt;

&lt;p&gt;This approach gives you both efficiency and detailed route information.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Routing APIs and Route Optimization APIs may sound similar, but they solve fundamentally different problems.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Routing API&lt;/strong&gt; → calculates how to get from one point to another
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Route Optimization API&lt;/strong&gt; → decides the best order to visit multiple points
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your app needs directions or navigation, a Routing API is the right choice.&lt;br&gt;&lt;br&gt;
If you’re planning deliveries, field service routes, or logistics workflows, you’ll need a Route Optimization API.&lt;/p&gt;

&lt;p&gt;In many real-world applications, the best solution is to use both:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Optimization to plan the route
&lt;/li&gt;
&lt;li&gt;Routing to build and display it
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Understanding this difference helps you choose the right tool, avoid unnecessary complexity, and build more efficient applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;

&lt;p&gt;Want to see the difference in action?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Routing API → &lt;a href="https://apidocs.geoapify.com/playground/routing/" rel="noopener noreferrer"&gt;https://apidocs.geoapify.com/playground/routing/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Route Optimization API → &lt;a href="https://apidocs.geoapify.com/playground/route-planner/" rel="noopener noreferrer"&gt;https://apidocs.geoapify.com/playground/route-planner/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Create a simple route and then try optimizing multiple stops — the difference becomes immediately clear.&lt;/p&gt;

</description>
      <category>api</category>
      <category>maps</category>
      <category>routing</category>
      <category>appdev</category>
    </item>
    <item>
      <title>Why does reverse geocoding return a slightly different address than where you click? This article explains why it happens, how distance is calculated, and how to handle it in your app — with a live demo.</title>
      <dc:creator>Alfiya Tarasenko</dc:creator>
      <pubDate>Wed, 15 Apr 2026 12:26:19 +0000</pubDate>
      <link>https://dev.to/geoapify/why-does-reverse-geocoding-return-a-slightly-different-address-than-where-you-click-this-article-43k9</link>
      <guid>https://dev.to/geoapify/why-does-reverse-geocoding-return-a-slightly-different-address-than-where-you-click-this-article-43k9</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/geoapify-maps-api/why-reverse-geocoding-doesnt-return-the-exact-clicked-location-33ha" class="crayons-story__hidden-navigation-link"&gt;Why Reverse Geocoding Doesn’t Return the Exact Clicked Location&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/geoapify-maps-api"&gt;
            &lt;img alt="Geoapify Maps API logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F11485%2F7ba45fe8-d6bb-450f-971e-d78a7bb3cec3.png" class="crayons-logo__image" width="200" height="200"&gt;
          &lt;/a&gt;

          &lt;a href="/geoapify" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F672541%2Fb8f414ef-ff17-4230-ae03-49c5f7c04e1c.png" alt="geoapify profile" class="crayons-avatar__image" width="800" height="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/geoapify" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Alfiya Tarasenko
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Alfiya Tarasenko
                
              
              &lt;div id="story-author-preview-content-3502174" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/geoapify" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F672541%2Fb8f414ef-ff17-4230-ae03-49c5f7c04e1c.png" class="crayons-avatar__image" alt="" width="800" height="800"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Alfiya Tarasenko&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/geoapify-maps-api" class="crayons-story__secondary fw-medium"&gt;Geoapify Maps API&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/geoapify-maps-api/why-reverse-geocoding-doesnt-return-the-exact-clicked-location-33ha" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Apr 15&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/geoapify-maps-api/why-reverse-geocoding-doesnt-return-the-exact-clicked-location-33ha" id="article-link-3502174"&gt;
          Why Reverse Geocoding Doesn’t Return the Exact Clicked Location
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/reverse"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;reverse&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/geocoding"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;geocoding&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/gis"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;gis&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/api"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;api&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/geoapify-maps-api/why-reverse-geocoding-doesnt-return-the-exact-clicked-location-33ha#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Why Reverse Geocoding Doesn’t Return the Exact Clicked Location</title>
      <dc:creator>Alfiya Tarasenko</dc:creator>
      <pubDate>Wed, 15 Apr 2026 00:42:58 +0000</pubDate>
      <link>https://dev.to/geoapify-maps-api/why-reverse-geocoding-doesnt-return-the-exact-clicked-location-33ha</link>
      <guid>https://dev.to/geoapify-maps-api/why-reverse-geocoding-doesnt-return-the-exact-clicked-location-33ha</guid>
      <description>&lt;p&gt;When you click on a map and request an address for that exact point, you might expect a perfect match.&lt;/p&gt;

&lt;p&gt;But in practice, &lt;strong&gt;the returned address can differ slightly from the location you clicked&lt;/strong&gt; — sometimes by just a few meters, sometimes more.&lt;/p&gt;

&lt;p&gt;If you’ve noticed this behavior in your app, you’re not dealing with a bug. It’s a natural result of how reverse geocoding works.&lt;/p&gt;

&lt;p&gt;In this article, we’ll explore why the address you get doesn’t always exactly match the clicked map point, and what this means when building map-based applications.&lt;/p&gt;

&lt;p&gt;This example uses a simple map demo powered by the  &lt;a href="https://www.geoapify.com/reverse-geocoding-api/" rel="noopener noreferrer"&gt;Geoapify Reverse Geocoding API&lt;/a&gt; , so you can see this behavior in action.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://codepen.io/editor/team/geoapify/pen/019d8e47-9b0b-70c9-921a-07c5565e0694" rel="noopener noreferrer"&gt;CodePen demo / code sample&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Reverse Geocoding Actually Returns
&lt;/h2&gt;

&lt;p&gt;Reverse geocoding doesn’t return the exact point you clicked.&lt;/p&gt;

&lt;p&gt;Instead, it returns the &lt;strong&gt;closest known addressable location&lt;/strong&gt; in the dataset. That’s a key difference.&lt;/p&gt;

&lt;p&gt;Coordinates represent a continuous space — every point on the map has a latitude and longitude.&lt;br&gt;&lt;br&gt;
Addresses, on the other hand, are discrete. They only exist where real-world objects are defined:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;buildings
&lt;/li&gt;
&lt;li&gt;entrances
&lt;/li&gt;
&lt;li&gt;parcels
&lt;/li&gt;
&lt;li&gt;points of interest
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9529i50y3m877h81my5t.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9529i50y3m877h81my5t.jpg" alt="Reverse geocoding schematic: clicked point vs nearest address" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So when you click somewhere on the map, the system has to answer a different question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“What is the nearest meaningful address to this point?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“What exists exactly at this coordinate?”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  What this means in practice
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Clicking on a road → returns a nearby building or street address
&lt;/li&gt;
&lt;li&gt;Clicking inside a park → returns the nearest street or POI
&lt;/li&gt;
&lt;li&gt;Clicking near a building → returns the building’s registered address point
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even if the difference is just a few meters, it’s expected behavior.&lt;/p&gt;
&lt;h2&gt;
  
  
  How Far Is the Returned Location from the Clicked Point?
&lt;/h2&gt;

&lt;p&gt;Once you understand that reverse geocoding returns the &lt;em&gt;nearest address&lt;/em&gt;, the next logical question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How far is the returned result from the original point?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There isn’t just one answer — because there are &lt;strong&gt;two different ways to measure distance&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Distance to the Returned Object (Geometry Distance)
&lt;/h3&gt;

&lt;p&gt;When the returned result represents a &lt;strong&gt;building or boundary&lt;/strong&gt;, the distance is calculated between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;your clicked point
&lt;/li&gt;
&lt;li&gt;and the &lt;strong&gt;geometry (polygon)&lt;/strong&gt; of that object
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This leads to an important detail:&lt;/p&gt;

&lt;p&gt;👉 If your point is &lt;strong&gt;inside the building polygon&lt;/strong&gt;, the distance can be &lt;strong&gt;0&lt;/strong&gt;,&lt;br&gt;&lt;br&gt;
even if the returned coordinate (for example, the entrance) is several meters away:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"results"&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="nl"&gt;"country"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Germany"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&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;"Nuremberg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&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;"90425"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&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;"Pretzfelder Straße"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&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;"15"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"lon"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;11.064715&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"lat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;49.4718661&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"result_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;"building"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"formatted"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Pretzfelder Straße 15, 90425 Nuremberg, Germany"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"distance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&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="nl"&gt;"query"&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="nl"&gt;"lat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;49.47177742331178&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"lon"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;11.064803253993091&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You click inside a large building
&lt;/li&gt;
&lt;li&gt;The address is tied to the entrance
&lt;/li&gt;
&lt;li&gt;The API may report distance = 0 (because you are inside the building)
&lt;/li&gt;
&lt;li&gt;But visually, the returned point is offset
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Real Distance Between Coordinates
&lt;/h3&gt;

&lt;p&gt;This is the &lt;strong&gt;actual distance&lt;/strong&gt; between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the clicked point
&lt;/li&gt;
&lt;li&gt;and the returned coordinate
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is what you usually need if you want to measure the visible offset.&lt;/p&gt;

&lt;h4&gt;
  
  
  Option 1: Haversine Formula
&lt;/h4&gt;

&lt;p&gt;You can calculate the distance between two coordinates using the &lt;a href="https://en.wikipedia.org/wiki/Haversine_formula" rel="noopener noreferrer"&gt;Haversine formula&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;d = 2r * arcsin(√(sin²((lat2 - lat1) / 2) + cos(lat1) * cos(lat2) * sin²((lon2 - lon1) / 2)))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;lat1, lon1&lt;/code&gt; = clicked point
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lat2, lon2&lt;/code&gt; = returned location
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;r&lt;/code&gt; = Earth radius (≈ 6371 km)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Option 2: Using Turf.js
&lt;/h4&gt;

&lt;p&gt;If you're working in JavaScript, you can use a geospatial library like Turf.js to calculate distances easily.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://turfjs.org/docs/api/distance" rel="noopener noreferrer"&gt;&lt;code&gt;@turf/distance&lt;/code&gt;&lt;/a&gt; handles geographic calculations for you and returns accurate results in different units, so you don’t need to implement the formula manually.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;distance&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@turf/distance&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;lon1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;lat1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;lon2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;lat2&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;distance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;units&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;meters&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Option 3: Using Geoapify Geometry API
&lt;/h4&gt;

&lt;p&gt;You can also calculate distances using the &lt;a href="https://apidocs.geoapify.com/docs/geometry-operations/#distance" rel="noopener noreferrer"&gt;Geoapify Geometry Operations API&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This API lets you calculate distances between geometries — including points, lines, and polygons — without implementing the logic yourself.&lt;/p&gt;

&lt;p&gt;Example request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST https://api.geoapify.com/v1/geometry/operation?apiKey=YOUR_API_KEY

{
  "operation": "distance",
  "point1": {"type": "Point", "coordinates": [lon1, lat1]},
  "point2": {"type": "Point", "coordinates": [lon2, lat2]},
  "params": {
    "units": "kilometers"
  }
}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This approach is useful when you want:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;server-side calculations&lt;/li&gt;
&lt;li&gt;consistent results across services&lt;/li&gt;
&lt;li&gt;support for complex geometries (not just points)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It can also be integrated into AI agents or automated workflows, where distance calculations are part of a larger decision-making process (for example, validating locations or triggering actions based on proximity).&lt;/p&gt;

&lt;h2&gt;
  
  
  Code Sample: Try It on a Map
&lt;/h2&gt;

&lt;p&gt;Seeing this in action makes the behavior much easier to understand.&lt;/p&gt;

&lt;p&gt;Try clicking on different locations in this interactive demo:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://codepen.io/editor/team/geoapify/pen/019d8e47-9b0b-70c9-921a-07c5565e0694" rel="noopener noreferrer"&gt;CodePen demo / code sample&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What to test:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click directly on a building
&lt;/li&gt;
&lt;li&gt;Click on a road
&lt;/li&gt;
&lt;li&gt;Click inside a park or open area
&lt;/li&gt;
&lt;li&gt;Click near building edges or entrances
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You’ll notice that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the returned address doesn’t always match the exact clicked point
&lt;/li&gt;
&lt;li&gt;the marker may appear slightly shifted
&lt;/li&gt;
&lt;li&gt;results depend on nearby addressable objects
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes it easier to see how reverse geocoding behaves in real-world scenarios.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Handle This in Your App
&lt;/h2&gt;

&lt;p&gt;To avoid confusion when working with reverse geocoding:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Don’t expect exact matches — results are approximate
&lt;/li&gt;
&lt;li&gt;Show both clicked and returned locations if needed
&lt;/li&gt;
&lt;li&gt;Use distance thresholds for validation
&lt;/li&gt;
&lt;li&gt;Prefer geometry checks (e.g., inside building) for higher accuracy
&lt;/li&gt;
&lt;li&gt;Communicate clearly that the address is the nearest one
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These small adjustments can significantly improve user experience.&lt;/p&gt;

</description>
      <category>reverse</category>
      <category>geocoding</category>
      <category>gis</category>
      <category>api</category>
    </item>
    <item>
      <title>Is There a Free UK Postcode Lookup API?</title>
      <dc:creator>Alfiya Tarasenko</dc:creator>
      <pubDate>Sat, 11 Apr 2026 21:42:33 +0000</pubDate>
      <link>https://dev.to/geoapify-maps-api/is-there-a-free-uk-postcode-lookup-api-516p</link>
      <guid>https://dev.to/geoapify-maps-api/is-there-a-free-uk-postcode-lookup-api-516p</guid>
      <description>&lt;p&gt;At first glance, the answer seems like &lt;strong&gt;yes&lt;/strong&gt;. There are several APIs that let you search postcodes and return location or address data — for example, the &lt;a href="https://www.geoapify.com/postcode-api/" rel="noopener noreferrer"&gt;Geoapify Postcode API&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;But if you try a few of them, you’ll notice something: results can differ. Some APIs return more complete data, others return partial results — or nothing at all for the same postcode.&lt;/p&gt;

&lt;p&gt;Even well-known providers can be inconsistent. The reason isn’t the API. It’s the data.&lt;/p&gt;

&lt;p&gt;In the UK, the most complete postcode &lt;strong&gt;and address&lt;/strong&gt; dataset is owned by &lt;a href="https://www.royalmail.com/" rel="noopener noreferrer"&gt;Royal Mail&lt;/a&gt; and distributed under license. Free alternatives exist, but they are never fully complete or fully up to date.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a postcode in the UK?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom" rel="noopener noreferrer"&gt;UK postcodes&lt;/a&gt; are part of the addressing system used by &lt;a href="https://www.royalmail.com/" rel="noopener noreferrer"&gt;Royal Mail&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In practice, postcodes are linked to specific geographic points where real addresses are grouped. Each postcode represents a set of properties assigned to that location.&lt;/p&gt;

&lt;p&gt;Unlike unique identifiers, a single postcode usually corresponds to multiple addresses — sometimes just a few buildings, sometimes dozens.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb7vwxuil3chdxazz5wi9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb7vwxuil3chdxazz5wi9.png" alt="UK Postcodes on a map" width="800" height="296"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Example of postcode locations in London. Each point represents a postcode linked to a group of addresses. Source: &lt;a href="https://geoportal.statistics.gov.uk/datasets/ons::online-ons-postcode-directory-live/explore" rel="noopener noreferrer"&gt;ONS Postcode Directory (Live)&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Postcodes were designed for mail delivery, not precise mapping. That’s why they are often represented as points (centroids) rather than exact building locations.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Even when postcode locations are available, it’s not always clear which postcode a specific building belongs to. A postcode represents a group of addresses, not a single precise location.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Who owns UK postcode data?
&lt;/h2&gt;

&lt;p&gt;The most complete postcode and address dataset in the UK is maintained by &lt;a href="https://www.royalmail.com/" rel="noopener noreferrer"&gt;Royal Mail&lt;/a&gt; as part of the &lt;a href="https://en.wikipedia.org/wiki/Postcode_Address_File" rel="noopener noreferrer"&gt;Postcode Address File (PAF)&lt;/a&gt;. It contains the full mapping between postcodes and individual addresses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;However, it is not open data.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Access to Royal Mail data is licensed, which means it cannot be freely used, shared, or redistributed. Most developers don’t access it directly, but through official distributors and resellers such as &lt;a href="https://ideal-postcodes.co.uk/" rel="noopener noreferrer"&gt;Ideal Postcodes&lt;/a&gt;, &lt;a href="https://postcoder.com/" rel="noopener noreferrer"&gt;Postcoder&lt;/a&gt;, or &lt;a href="https://www.loqate.com/" rel="noopener noreferrer"&gt;Loqate&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This creates several practical challenges:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Higher cost compared to open alternatives
&lt;/li&gt;
&lt;li&gt;Licensing restrictions (storage, caching, redistribution)
&lt;/li&gt;
&lt;li&gt;Limited flexibility for building public or large-scale services
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;As a result, this data is often unavailable to developers who need free, open, or permissively licensed solutions — forcing them to rely on alternative datasets.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Are there free UK postcode lookup solutions?
&lt;/h2&gt;

&lt;p&gt;Yes — there are several free and open solutions available. However, they differ in coverage, structure, and use cases.&lt;/p&gt;
&lt;h3&gt;
  
  
  Open data sources
&lt;/h3&gt;

&lt;p&gt;Here are the main open datasets used for UK postcode lookup:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Link&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ONS Postcode Directory (ONSPD)&lt;/td&gt;
&lt;td&gt;&lt;a href="https://geoportal.statistics.gov.uk/datasets/ons::online-ons-postcode-directory-live/about" rel="noopener noreferrer"&gt;Dataset link&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;The most complete open dataset. Provides postcode coordinates and administrative areas, but no full addresses.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GeoNames&lt;/td&gt;
&lt;td&gt;&lt;a href="https://download.geonames.org/export/zip/GB_full.csv.zip" rel="noopener noreferrer"&gt;Dataset link&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Global dataset with partial UK postcode coverage. Simpler and less detailed.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenStreetMap&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.openstreetmap.org/" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Crowdsourced dataset where postcodes are often assigned directly to buildings or areas. Coverage and accuracy vary.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These datasets are free and open, but they do not provide full postcode → address mapping.&lt;/p&gt;
&lt;h3&gt;
  
  
  Postcode lookup APIs based on open data
&lt;/h3&gt;

&lt;p&gt;To make these datasets easier to use, you can rely on APIs built on top of open data.&lt;/p&gt;

&lt;p&gt;One example is the &lt;a href="https://www.geoapify.com/postcode-api/" rel="noopener noreferrer"&gt;Geoapify Postcode API&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It allows you to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Search by postcode
&lt;/li&gt;
&lt;li&gt;Get coordinates and address information
&lt;/li&gt;
&lt;li&gt;Use a simple HTTP API
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Geoapify combines multiple open data sources (such as OpenStreetMap and GeoNames) to provide practical postcode lookup functionality.&lt;/p&gt;

&lt;p&gt;Here’s a request example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s2"&gt;"https://api.geoapify.com/v1/postcode/search?postcode=TW2%207LS&amp;amp;countrycode=gb&amp;amp;geometry=original&amp;amp;apiKey=YOUR_API_KEY"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And response example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&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="nl"&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="nl"&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="nl"&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="nl"&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;"TW2 7LS"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"lon"&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.3583&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"lat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;51.4513&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"datasource"&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="nl"&gt;"sourcename"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"geonames"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"attribution"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GeoNames"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"license"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"CC BY 4.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://www.geonames.org/datasources/"&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="nl"&gt;"country"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"United Kingdom"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"country_code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gb"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"England"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&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;"Greater London"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&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;"London Borough of Richmond upon Thames"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"formatted"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"London, TW2 7LS, United Kingdom"&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="nl"&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="nl"&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="nl"&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;-0.3583&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;51.4513&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="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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ Results are based on open data sources and may differ from official Royal Mail data.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Free vs Official UK Postcode Data: Which One to Use?
&lt;/h2&gt;

&lt;p&gt;The right choice depends on your use case and requirements.&lt;/p&gt;

&lt;h3&gt;
  
  
  Comparison
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Proprietary data (Royal Mail PAF)&lt;/th&gt;
&lt;th&gt;Open data solutions&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Coverage&lt;/td&gt;
&lt;td&gt;Most complete&lt;/td&gt;
&lt;td&gt;High but incomplete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Addresses&lt;/td&gt;
&lt;td&gt;Full address list&lt;/td&gt;
&lt;td&gt;Limited or none&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Accuracy&lt;/td&gt;
&lt;td&gt;Highest&lt;/td&gt;
&lt;td&gt;Good, but varies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost&lt;/td&gt;
&lt;td&gt;Paid&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Licensing&lt;/td&gt;
&lt;td&gt;Restricted&lt;/td&gt;
&lt;td&gt;Open / permissive&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best for&lt;/td&gt;
&lt;td&gt;Validation, delivery, checkout&lt;/td&gt;
&lt;td&gt;Maps, search, analytics&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  When to use proprietary data
&lt;/h3&gt;

&lt;p&gt;Use Royal Mail-based solutions (via licensed providers) if you need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Accurate address validation
&lt;/li&gt;
&lt;li&gt;Checkout or form autofill
&lt;/li&gt;
&lt;li&gt;Delivery and logistics systems
&lt;/li&gt;
&lt;li&gt;Guaranteed coverage
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  When to use open solutions
&lt;/h3&gt;

&lt;p&gt;Use open data and APIs (like &lt;a href="https://www.geoapify.com/" rel="noopener noreferrer"&gt;Geoapify&lt;/a&gt;) if you need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Postcode → location lookup
&lt;/li&gt;
&lt;li&gt;Mapping and visualization
&lt;/li&gt;
&lt;li&gt;General search functionality
&lt;/li&gt;
&lt;li&gt;Free or open-source-friendly solutions &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;So, is there a free UK postcode lookup API?&lt;/p&gt;

&lt;p&gt;Yes — but with limitations.&lt;/p&gt;

&lt;p&gt;Free and open solutions can work well for many use cases, especially for mapping, search, and general applications. But they rely on datasets that are not fully complete.&lt;/p&gt;

&lt;p&gt;If you need accurate, address-level data, you’ll need access to Royal Mail’s licensed dataset.&lt;/p&gt;

&lt;p&gt;In the end, UK postcode accuracy is not a technical problem — it’s a data ownership problem.&lt;/p&gt;




&lt;p&gt;If you want to try a free solution yourself, explore the &lt;a href="https://apidocs.geoapify.com/playground/postcodes/" rel="noopener noreferrer"&gt;Geoapify Postcode API Playground&lt;/a&gt; and test postcode lookup in practice.&lt;/p&gt;

</description>
      <category>opendata</category>
      <category>webdev</category>
      <category>analytics</category>
      <category>gis</category>
    </item>
    <item>
      <title>Google Maps isn’t your only option for place search 👀
I compared 5 Places APIs (Google, Geoapify, Foursquare, HERE, TomTom) with real examples, pricing, and trade-offs</title>
      <dc:creator>Alfiya Tarasenko</dc:creator>
      <pubDate>Wed, 08 Apr 2026 12:38:40 +0000</pubDate>
      <link>https://dev.to/geoapify/google-maps-isnt-your-only-option-for-place-search-i-compared-5-places-apis-google-geoapify-29e2</link>
      <guid>https://dev.to/geoapify/google-maps-isnt-your-only-option-for-place-search-i-compared-5-places-apis-google-geoapify-29e2</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/geoapify-maps-api/google-places-api-alternatives-which-poi-api-should-you-use-in-2026-hd4" class="crayons-story__hidden-navigation-link"&gt;Google Places API Alternatives: Which POI API Should You Use in 2026?&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/geoapify-maps-api"&gt;
            &lt;img alt="Geoapify Maps API logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F11485%2F7ba45fe8-d6bb-450f-971e-d78a7bb3cec3.png" class="crayons-logo__image" width="200" height="200"&gt;
          &lt;/a&gt;

          &lt;a href="/geoapify" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F672541%2Fb8f414ef-ff17-4230-ae03-49c5f7c04e1c.png" alt="geoapify profile" class="crayons-avatar__image" width="800" height="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/geoapify" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Alfiya Tarasenko
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Alfiya Tarasenko
                
              
              &lt;div id="story-author-preview-content-3465931" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/geoapify" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F672541%2Fb8f414ef-ff17-4230-ae03-49c5f7c04e1c.png" class="crayons-avatar__image" alt="" width="800" height="800"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Alfiya Tarasenko&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/geoapify-maps-api" class="crayons-story__secondary fw-medium"&gt;Geoapify Maps API&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/geoapify-maps-api/google-places-api-alternatives-which-poi-api-should-you-use-in-2026-hd4" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Apr 8&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/geoapify-maps-api/google-places-api-alternatives-which-poi-api-should-you-use-in-2026-hd4" id="article-link-3465931"&gt;
          Google Places API Alternatives: Which POI API Should You Use in 2026?
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/javascript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;javascript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/api"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;api&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/geoapify-maps-api/google-places-api-alternatives-which-poi-api-should-you-use-in-2026-hd4#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            11 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Google Places API Alternatives: Which POI API Should You Use in 2026?</title>
      <dc:creator>Alfiya Tarasenko</dc:creator>
      <pubDate>Wed, 08 Apr 2026 12:37:13 +0000</pubDate>
      <link>https://dev.to/geoapify-maps-api/google-places-api-alternatives-which-poi-api-should-you-use-in-2026-hd4</link>
      <guid>https://dev.to/geoapify-maps-api/google-places-api-alternatives-which-poi-api-should-you-use-in-2026-hd4</guid>
      <description>&lt;p&gt;If your app needs to search for places — cafes, restaurants, shops, or any other points of interest — chances are you’ve looked at the Google Maps Platform first.&lt;/p&gt;

&lt;p&gt;It’s a powerful solution, but it’s not always the best fit. Pricing, usage limits, licensing restrictions, or simply the need for more flexibility often push developers to look for alternatives.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we’ll explore
&lt;/h2&gt;

&lt;p&gt;In this article, we’ll take a practical look at Places APIs — focusing on one common use case:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Finding places by category. For example: cafes or restaurants near a location
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We’ll compare how place search works across several popular providers and when each one makes the most sense to use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google Maps Platform — Places API&lt;/li&gt;
&lt;li&gt;Geoapify — Places API&lt;/li&gt;
&lt;li&gt;Foursquare — Places API&lt;/li&gt;
&lt;li&gt;HERE Technologies — Geocoding &amp;amp; Search API&lt;/li&gt;
&lt;li&gt;TomTom — Search API (POI search)&lt;/li&gt;
&lt;li&gt;What to choose?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Use Case: Find Restaurants in Miami Beach
&lt;/h2&gt;

&lt;p&gt;To keep this comparison practical, let’s use one specific scenario:&lt;/p&gt;

&lt;p&gt;Find restaurants near this point in Miami Beach:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Latitude: &lt;code&gt;25.777415&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Longitude: &lt;code&gt;-80.132432&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbb0vdqdcvdv4q09x820t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbb0vdqdcvdv4q09x820t.png" alt="Miami Beach location" width="800" height="508"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a good test case because every provider in this article supports location-based place search, but they expose it in different ways.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key differences to keep in mind
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Request structure&lt;/strong&gt;: Some APIs use simple query parameters (location, radius, category), while others require more structured requests or additional configuration.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Search capabilities&lt;/strong&gt;: APIs vary in how they support filtering, ranking, and biasing results.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data sources&lt;/strong&gt;: Some providers rely on proprietary datasets, while others are based on open data sources like &lt;a href="https://www.openstreetmap.org" rel="noopener noreferrer"&gt;OpenStreetMap&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Result format&lt;/strong&gt;: The structure and level of detail in responses can differ significantly.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even for a simple task like finding nearby restaurants, the choice of API can lead to very different results and developer experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Google Maps Platform — Places API
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://developers.google.com/maps/documentation/places/web-service/overview" rel="noopener noreferrer"&gt;📘 Docs&lt;/a&gt; · &lt;a href="https://places-search-405409.ue.r.appspot.com/" rel="noopener noreferrer"&gt;🔎 Playground&lt;/a&gt; · &lt;a href="https://developers.google.com/maps/billing-and-pricing/pricing?hl=en" rel="noopener noreferrer"&gt;💰 Pricing&lt;/a&gt; · &lt;a href="https://cloud.google.com/maps-platform/terms" rel="noopener noreferrer"&gt;⚖️ Terms&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Google Maps Platform Places API is one of the most widely used solutions for working with points of interest.&lt;/p&gt;

&lt;p&gt;It provides rich and detailed place data — including ratings, reviews, opening hours, and more — and is often the default choice for developers building location-based features.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example request
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;POST https://places.googleapis.com/v1/places:searchNearby
Content-Type: application/json
X-Goog-Api-Key: YOUR_API_KEY
X-Goog-FieldMask: places.displayName,places.location,places.rating,places.reviews,places.photos

&lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"includedPrimaryTypes"&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"restaurant"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;,
  &lt;span class="s2"&gt;"maxResultCount"&lt;/span&gt;: 10,
  &lt;span class="s2"&gt;"locationRestriction"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"circle"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"center"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"latitude"&lt;/span&gt;: 25.777415,
        &lt;span class="s2"&gt;"longitude"&lt;/span&gt;: &lt;span class="nt"&gt;-80&lt;/span&gt;.132432
      &lt;span class="o"&gt;}&lt;/span&gt;,
      &lt;span class="s2"&gt;"radius"&lt;/span&gt;: 1000
    &lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This request searches for restaurants near the given coordinates in Miami Beach within a 1 km radius and returns a limited set of fields.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example response
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"places"&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="nl"&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;"sample-place-id-001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"displayName"&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="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Sample Restaurant"&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="nl"&gt;"formattedAddress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"100 Example St, Miami Beach, FL 33139, USA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"location"&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="nl"&gt;"latitude"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;25.778102&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"longitude"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;-80.131245&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="nl"&gt;"rating"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;4.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"userRatingCount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1842&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"websiteUri"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://www.example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"nationalPhoneNumber"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"(305) 555-0142"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"regularOpeningHours"&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="nl"&gt;"openNow"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"weekdayDescriptions"&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="s2"&gt;"Monday: 11:00 AM – 10:00 PM"&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="nl"&gt;"primaryType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"restaurant"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"primaryTypeDisplayName"&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="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Restaurant"&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="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response can include much more than basic place information. In addition to name, location, and rating, the API can return reviews, photos, contact details, opening hours, and various attributes describing the place. &lt;/p&gt;

&lt;p&gt;Reviews are returned directly in the response, while photos are provided as references that can be used to request actual images via a separate endpoint. &lt;/p&gt;

&lt;p&gt;The exact data you receive depends on the fields specified in the &lt;code&gt;X-Goog-FieldMask&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rich place data&lt;/strong&gt; — includes ratings, reviews, photos, opening hours, and many additional attributes
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexible field selection&lt;/strong&gt; — control response size and content via &lt;code&gt;X-Goog-FieldMask&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Large dataset&lt;/strong&gt; — backed by a widely used platform with high user contribution and coverage&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cons
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pricing can scale quickly&lt;/strong&gt; — depends on number of requests and fields requested, so cost estimation is important  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Strict licensing terms&lt;/strong&gt; — usage is limited by Google Maps Platform Terms, including requirements on how data is displayed, where it can be used, and integration with Google services&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data usage limitations&lt;/strong&gt; — place data often cannot be stored long-term or used outside Google services  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;More complex requests&lt;/strong&gt; — requires &lt;code&gt;POST&lt;/code&gt; requests and field masks instead of simple query parameters  &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Geoapify — Places API
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apidocs.geoapify.com/docs/places/" rel="noopener noreferrer"&gt;📘 Docs&lt;/a&gt; · &lt;a href="https://apidocs.geoapify.com/playground/places/" rel="noopener noreferrer"&gt;🔎 Playground&lt;/a&gt; · &lt;a href="https://www.geoapify.com/pricing/" rel="noopener noreferrer"&gt;💰 Pricing&lt;/a&gt; · &lt;a href="https://www.geoapify.com/terms/" rel="noopener noreferrer"&gt;⚖️ Terms&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Geoapify &lt;a href="https://www.geoapify.com/places-api/" rel="noopener noreferrer"&gt;Places API&lt;/a&gt; provides access to POI data based on open data sources such as OpenStreetMap.&lt;/p&gt;

&lt;p&gt;It focuses on simplicity and flexibility, offering a straightforward way to search for places by category, location, and additional filters.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example request
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;GET https://api.geoapify.com/v2/places?categories&lt;span class="o"&gt;=&lt;/span&gt;catering.restaurant&amp;amp;filter&lt;span class="o"&gt;=&lt;/span&gt;circle:-80.132432,25.777415,1000&amp;amp;limit&lt;span class="o"&gt;=&lt;/span&gt;10&amp;amp;apiKey&lt;span class="o"&gt;=&lt;/span&gt;YOUR_API_KEY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This request searches for restaurants near the given coordinates in Miami Beach within a 1 km radius.&lt;/p&gt;

&lt;p&gt;The API uses a simple GET request with query parameters, making it easy to test and integrate.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example response
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&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="nl"&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="nl"&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="nl"&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="nl"&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;"Bella Cuba"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"formatted"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bella Cuba, 1659 Washington Avenue, Miami Beach, FL 33139, United States of America"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"lat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;25.7909549&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"lon"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;-80.1316981&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"categories"&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="s2"&gt;"catering"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"catering.restaurant"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="s2"&gt;"catering.restaurant.cuban"&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="nl"&gt;"catering"&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="nl"&gt;"cuisine"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cuban"&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="nl"&gt;"distance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;265&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"datasource"&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="nl"&gt;"sourcename"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"openstreetmap"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"license"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Open Database License"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"attribution"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"© OpenStreetMap contributors"&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="nl"&gt;"raw"&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="nl"&gt;"osm_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3057276069&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"osm_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;"n"&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="nl"&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="nl"&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="nl"&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;-80.1316981&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;25.7909549&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="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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response uses a standard GeoJSON-like structure, which is especially convenient for map applications. Depending on available source data, results may include categories, cuisine, phone number, website, opening hours, and other attributes. &lt;/p&gt;

&lt;p&gt;The datasource field is especially useful because it makes the data origin explicit. In this example, the results come from OpenStreetMap, with attribution and license information included in the response. &lt;/p&gt;

&lt;p&gt;The &lt;code&gt;raw.osm_id&lt;/code&gt; and &lt;code&gt;raw.osm_type&lt;/code&gt; values allow you to link back to the original OpenStreetMap object — for example: &lt;a href="https://www.openstreetmap.org/node/3057276069" rel="noopener noreferrer"&gt;view this place in OpenStreetMap &amp;gt;&amp;gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Pros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Open data (OpenStreetMap-based)&lt;/strong&gt; — transparent data source that allows you to cache, store, and redistribute data, depending on the OpenStreetMap license terms  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Affordable pricing model&lt;/strong&gt; — as a service provider (not a data owner), Geoapify offers more cost-efficient and predictable pricing  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Simple and intuitive API&lt;/strong&gt; — uses &lt;code&gt;GET&lt;/code&gt; requests with clear query parameters, making it easy to test and integrate  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Flexible usage&lt;/strong&gt; — not tightly coupled to a specific platform, allowing more freedom in how data is stored and displayed&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GeoJSON-like response format&lt;/strong&gt; — ready to use directly in mapping libraries without transformation  &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cons
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No built-in reviews or ratings&lt;/strong&gt; — unlike Google, the API does not provide user-generated reviews, ratings, or photos &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data completeness varies&lt;/strong&gt; — coverage and quality depend on OpenStreetMap data in the region  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Less enriched data&lt;/strong&gt; — fewer high-level attributes compared to Google’s dataset  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;May require additional data sources&lt;/strong&gt; — some features (e.g. reviews or popularity) may require integration with other APIs&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Foursquare — Places API
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.foursquare.com/fsq-developers-places/reference/place-search" rel="noopener noreferrer"&gt;📘 Docs&lt;/a&gt; · &lt;a href="https://location.foursquare.com/pricing" rel="noopener noreferrer"&gt;💰 Pricing&lt;/a&gt; · &lt;a href="https://foursquare.com/legal/terms/eula/" rel="noopener noreferrer"&gt;⚖️ Terms&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Foursquare Places API provides access to a global POI dataset enriched with location intelligence and user behavior signals.&lt;/p&gt;

&lt;p&gt;It is known for its structured place data and strong categorization system, making it well-suited for search and discovery use cases.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--request&lt;/span&gt; GET &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="nt"&gt;--url&lt;/span&gt; &lt;span class="s1"&gt;'https://api.foursquare.com/v3/places/search?ll=25.777415%2C-80.132432&amp;amp;radius=1000&amp;amp;categories=restaurants'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'X-Places-Api-Version: 2023-10-01'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'accept: application/json'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This request searches for restaurants near the given coordinates in Miami Beach within a 1 km radius.&lt;/p&gt;

&lt;p&gt;Foursquare uses category IDs instead of text-based categories, which allows precise filtering but requires referencing their category taxonomy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example response
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"results"&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="nl"&gt;"fsq_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;"5f8a9c1b2d_example"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&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;"Ocean Breeze Grill"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"location"&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="nl"&gt;"formatted_address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"200 Ocean Dr, Miami Beach, FL 33139"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"locality"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Miami Beach"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"region"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"FL"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"country"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"US"&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="nl"&gt;"geocodes"&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="nl"&gt;"main"&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="nl"&gt;"latitude"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;25.778245&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"longitude"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;-80.130912&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="nl"&gt;"categories"&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="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;13065&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&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;"Restaurant"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"short_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;"Restaurant"&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="nl"&gt;"distance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;180&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"rating"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;4.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"tel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"+1 305-555-0199"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"website"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://oceanbreeze.example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;

      &lt;/span&gt;&lt;span class="nl"&gt;"hours"&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="nl"&gt;"display"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mon–Sun 11:00 AM – 11:00 PM"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"open_now"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&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="nl"&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="nl"&gt;"services"&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="nl"&gt;"delivery"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"takeout"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"dine_in"&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="nl"&gt;"reservations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&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="nl"&gt;"food_and_drink"&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="nl"&gt;"meals"&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="nl"&gt;"lunch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"dinner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&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="nl"&gt;"alcohol"&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="nl"&gt;"beer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"wine"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&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="nl"&gt;"amenities"&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="nl"&gt;"outdoor_seating"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"wifi"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"free"&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="nl"&gt;"photos"&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="nl"&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;"photo_001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"prefix"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://fastly.4sqi.net/img/general/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"suffix"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/12345_sample.jpg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"width"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;800&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"height"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;600&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="nl"&gt;"tips"&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="nl"&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;"tip_001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Great seafood and ocean views. Try the grilled snapper!"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"agree_count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12&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="nl"&gt;"stats"&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="nl"&gt;"total_ratings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;540&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"total_photos"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"total_tips"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;34&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="nl"&gt;"popularity"&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.82&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"verified"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&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="nl"&gt;"context"&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="nl"&gt;"geo_bounds"&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="nl"&gt;"circle"&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="nl"&gt;"center"&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="nl"&gt;"latitude"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;25.777415&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"longitude"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;-80.132432&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="nl"&gt;"radius"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1000&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="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response includes core place information such as name, location, categories, and distance. Depending on the endpoint and plan, Foursquare can also provide additional enrichment such as ratings, popularity signals, and place attributes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Rich and structured place data&lt;/strong&gt; — includes categories, attributes, popularity signals, and user-generated content&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Includes user-generated content&lt;/strong&gt; — provides photos and tips, adding useful context to places, though the coverage and depth may vary compared to larger platforms like Google Maps Platform&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Strong categorization system&lt;/strong&gt; — enables precise filtering using a well-defined taxonomy (category IDs) &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;High-quality curated dataset&lt;/strong&gt; — especially strong in urban areas and commercial locations&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enriched data signals&lt;/strong&gt; — provides popularity, trends, and behavioral insights beyond basic POI data  &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cons
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Strict licensing restrictions&lt;/strong&gt; — data is provided under a limited, revocable license and must be used only within your application; you cannot store, merge, redistribute, or build your own POI dataset, and must display “Powered by Foursquare” attribution  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Limited external usage&lt;/strong&gt; — reports or demos must be non-monetized, non-competitive, and cannot expose material portions of data &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Category-based filtering complexity&lt;/strong&gt; — requires working with category IDs instead of simple text queries &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pricing scales with usage&lt;/strong&gt; — costs can increase with request volume and data enrichment&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  HERE Technologies — Places API
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.here.com/docs/bundle/geocoding-and-search-api-developer-guide/page/topics-api/code-discover-category.html" rel="noopener noreferrer"&gt;📘 Docs&lt;/a&gt; · &lt;a href="https://www.here.com/docs/bundle/geocoding-and-search-api-v7-api-reference/page/index.html#/paths/~1discover/get" rel="noopener noreferrer"&gt;🔎 Playground&lt;/a&gt; · &lt;a href="https://www.here.com/get-started/pricing" rel="noopener noreferrer"&gt;💰 Pricing&lt;/a&gt; · &lt;a href="https://legal.here.com/en-gb/terms/here-platform-terms" rel="noopener noreferrer"&gt;⚖️ Terms&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;HERE Technologies provides location services and POI data through its Discover endpoint, which allows searching for places by category, location, and filters.&lt;/p&gt;

&lt;p&gt;It is widely used in navigation, mobility, and enterprise applications, especially where accurate geolocation is critical.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example request
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;GET https://discover.search.hereapi.com/v1/discover?at&lt;span class="o"&gt;=&lt;/span&gt;25.777415,-80.132432&amp;amp;q&lt;span class="o"&gt;=&lt;/span&gt;restaurant&amp;amp;limit&lt;span class="o"&gt;=&lt;/span&gt;10&amp;amp;apiKey&lt;span class="o"&gt;=&lt;/span&gt;YOUR_API_KEY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This request searches for restaurants near the given coordinates in Miami Beach.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example response
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"items"&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="nl"&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;"here-poi-001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Ocean Breeze Restaurant"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"resultType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"place"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;

      &lt;/span&gt;&lt;span class="nl"&gt;"address"&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="nl"&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;"150 Ocean Dr, Miami Beach, FL 33139, United States"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"countryCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"countryName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"United States"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"stateCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"FL"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Florida"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&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;"Miami Beach"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&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;"Ocean Dr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"postalCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"33139"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&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;"150"&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="nl"&gt;"position"&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="nl"&gt;"lat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;25.778215&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"lng"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;-80.131102&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="nl"&gt;"distance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;210&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;

      &lt;/span&gt;&lt;span class="nl"&gt;"categories"&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="nl"&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;"100-1000-0000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&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;"Restaurant"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"primary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&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="nl"&gt;"foodTypes"&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="nl"&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;"101-000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&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;"Seafood"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"primary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&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="nl"&gt;"contacts"&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="nl"&gt;"phone"&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="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"+1 305-555-0188"&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="nl"&gt;"www"&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="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://oceanbreeze.example.com"&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="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;

      &lt;/span&gt;&lt;span class="nl"&gt;"openingHours"&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="nl"&gt;"text"&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="s2"&gt;"Mon–Sun: 11:00 AM – 11:00 PM"&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="nl"&gt;"isOpen"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&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="nl"&gt;"timeZone"&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="nl"&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;"America/New_York"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"utcOffset"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"-04:00"&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="nl"&gt;"chains"&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="nl"&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;"chain-001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&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;"Ocean Breeze Group"&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="nl"&gt;"media"&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="nl"&gt;"images"&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="nl"&gt;"items"&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="nl"&gt;"href"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://images.example.com/photo1.jpg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"supplier"&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="nl"&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;"tripadvisor"&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="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"ratings"&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="nl"&gt;"items"&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="nl"&gt;"count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;320&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"average"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;4.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"supplier"&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="nl"&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;"tripadvisor"&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="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="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"limit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"offset"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The HERE API returns structured place data with a strong focus on address details, categories, and consistency across regions.&lt;/p&gt;

&lt;p&gt;Depending on the available data, the response may include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Contact details such as phone numbers and websites
&lt;/li&gt;
&lt;li&gt;Opening hours in both structured and human-readable formats
&lt;/li&gt;
&lt;li&gt;Categories and food types for classification
&lt;/li&gt;
&lt;li&gt;Media and ratings, often sourced from third-party providers (for example, TripAdvisor)
&lt;/li&gt;
&lt;li&gt;Extended attributes such as EV charging stations, fuel information, or logistics-related data
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Compared to consumer-focused APIs, HERE emphasizes reliable, standardized data and global coverage rather than building its own user-generated content ecosystem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reliable global coverage&lt;/strong&gt; — strong presence across multiple regions and industries, including automotive and logistics  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Structured and consistent data&lt;/strong&gt; — predictable response format with detailed address components and classification  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Simple request model&lt;/strong&gt; — supports text-based and location-based search without complex request bodies  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enterprise-focused features&lt;/strong&gt; — includes extended attributes such as EV stations, fuel data, and logistics-related information  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Third-party enrichment&lt;/strong&gt; — may include ratings and media from external providers (for example, TripAdvisor)  &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cons
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Proprietary dataset&lt;/strong&gt; — data is not open and cannot be freely stored, reused, or redistributed  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Limited user-generated content&lt;/strong&gt; — generally does not provide native reviews or rich photo ecosystems like larger consumer platforms  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Licensing restrictions&lt;/strong&gt; — usage is governed by HERE terms, including limitations on storage, redistribution, and usage scope  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pricing scales with usage&lt;/strong&gt; — costs depend on request volume and service usage  &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  TomTom — Places API
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.tomtom.com/products/places-apis/#documentations" rel="noopener noreferrer"&gt;📘 Docs&lt;/a&gt; · &lt;a href="https://developer.tomtom.com/search-api/api-explorer" rel="noopener noreferrer"&gt;🔎 Playground&lt;/a&gt; · &lt;a href="https://developer.tomtom.com/pricing" rel="noopener noreferrer"&gt;💰 Pricing&lt;/a&gt; · &lt;a href="https://www.tomtom.com/legal/en_gb/terms-of-use/" rel="noopener noreferrer"&gt;⚖️ Terms&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;TomTom provides access to place data through its Search and Places APIs, allowing developers to search for POIs by category, name, or geographic location.&lt;/p&gt;

&lt;p&gt;It is widely used in &lt;strong&gt;navigation, mobility, and enterprise applications&lt;/strong&gt;, with a focus on &lt;strong&gt;accurate geolocation and global coverage&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example request
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; GET &lt;span class="s2"&gt;"https://api.tomtom.com/search/2/categorySearch/restaurants.json?lat=25.777415&amp;amp;lon=-80.132432&amp;amp;radius=1000&amp;amp;categorySet=7315&amp;amp;view=Unified&amp;amp;relatedPois=off&amp;amp;key=YOUR_API_KEY"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"accept: */*"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This request searches for restaurants within a 1 km radius around Miami Beach and returns categorized place results using TomTom’s Places API.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example response
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"summary"&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="nl"&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;"restaurants"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"queryType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"NON_NEAR"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"numResults"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"offset"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"totalResults"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;84&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"geoBias"&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="nl"&gt;"lat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;25.777415&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"lon"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;-80.132432&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="nl"&gt;"results"&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="nl"&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;"POI"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&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;"tomtom-poi-001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&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;2.57&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"dist"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;145.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"poi"&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="nl"&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;"Ocean Breeze Cafe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"phone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"+1 305-555-0181"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"www.oceanbreeze.example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"categorySet"&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="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7315&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="nl"&gt;"categories"&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="s2"&gt;"restaurant"&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="nl"&gt;"classifications"&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="nl"&gt;"code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"RESTAURANT"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"names"&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="nl"&gt;"nameLocale"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"en-US"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&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;"restaurant"&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="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="nl"&gt;"address"&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="nl"&gt;"streetNumber"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"120"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"streetName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Ocean Dr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"municipality"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Miami Beach"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"countrySubdivision"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"FL"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"postalCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"33139"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"countryCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"US"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"country"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"United States"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"freeformAddress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"120 Ocean Dr, Miami Beach, FL 33139"&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="nl"&gt;"position"&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="nl"&gt;"lat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;25.778201&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"lon"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;-80.131502&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="nl"&gt;"entryPoints"&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="nl"&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;"main"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"position"&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="nl"&gt;"lat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;25.77812&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"lon"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;-80.13144&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="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="nl"&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;"POI"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&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;"tomtom-poi-002"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&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;2.56&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"dist"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;210.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"poi"&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="nl"&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;"Seaside Grill"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"categorySet"&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="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7315&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="nl"&gt;"categories"&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="s2"&gt;"restaurant"&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="nl"&gt;"address"&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="nl"&gt;"freeformAddress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"200 Collins Ave, Miami Beach, FL 33139"&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="nl"&gt;"position"&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="nl"&gt;"lat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;25.77901&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"lon"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;-80.13088&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="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response includes a summary section plus a list of matching POIs. For each result, TomTom returns core place information such as the place name, categories, address, coordinates, and distance. Some results may also include contact details like a phone number or website.&lt;/p&gt;

&lt;p&gt;A useful detail is the entryPoints field, which can help in routing and navigation scenarios by showing where the place can actually be accessed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reliable global location data&lt;/strong&gt; — strong coverage optimized for navigation and mobility use cases  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Well integrated with routing services&lt;/strong&gt; — works seamlessly with routing, traffic, and navigation APIs  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Simple and developer-friendly API&lt;/strong&gt; — clear parameters and predictable responses  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Accurate positioning data&lt;/strong&gt; — includes fields like &lt;code&gt;entryPoints&lt;/code&gt; for real-world navigation  &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cons
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Limited focus on user-generated content&lt;/strong&gt; — minimal support for reviews or community-driven insights  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Limited media support&lt;/strong&gt; — photos and rich media are not part of standard responses  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Proprietary dataset&lt;/strong&gt; — data cannot be freely stored or redistributed  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Licensing restrictions&lt;/strong&gt; — usage is constrained by TomTom terms and conditions  &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What to choose?
&lt;/h2&gt;

&lt;p&gt;Choosing a Places API depends not only on features, but also on your &lt;strong&gt;use case&lt;/strong&gt;, &lt;strong&gt;constraints&lt;/strong&gt;, and &lt;strong&gt;budget&lt;/strong&gt;. Here’s a practical way to approach it.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Define your goal
&lt;/h3&gt;

&lt;p&gt;Start with what you actually need to build:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Rich place details (reviews, photos, popularity signals)&lt;/strong&gt; → Best fit: Google Maps Platform, Foursquare, HERE&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Category-based search with structured place data (no need for reviews)&lt;/strong&gt; → Best fit: Geoapify, TomTom, HERE  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Navigation, routing, fleet, or logistics applications&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
→ Best fit: TomTom, HERE, Geoapify  &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 If your app relies on &lt;strong&gt;user-generated content&lt;/strong&gt;, your main options are Google or Foursquare.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Consider your budget early
&lt;/h3&gt;

&lt;p&gt;Pricing models differ significantly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Google Maps Platform&lt;/strong&gt; → powerful but can scale in cost quickly
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Foursquare&lt;/strong&gt; → commercial dataset with flexible plans
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HERE / TomTom&lt;/strong&gt; → enterprise-oriented pricing, often bundled with other services
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Geoapify&lt;/strong&gt; → affordable and predictable pricing
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Always estimate usage before building — especially for high-traffic apps.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Check licensing and data restrictions
&lt;/h3&gt;

&lt;p&gt;This is often a deciding factor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Some providers &lt;strong&gt;restrict storing or caching data&lt;/strong&gt; (e.g., Google)
&lt;/li&gt;
&lt;li&gt;Some allow more flexibility with usage and storage
&lt;/li&gt;
&lt;li&gt;Most require &lt;strong&gt;attribution&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 If you need to &lt;strong&gt;store or reuse data&lt;/strong&gt;, this can narrow your options quickly.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Match provider strengths
&lt;/h3&gt;

&lt;p&gt;Each provider is optimized for different scenarios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Google / Foursquare&lt;/strong&gt; → rich place content and discovery
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HERE / TomTom&lt;/strong&gt; → navigation, routing, and enterprise mobility
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Geoapify&lt;/strong&gt; → flexible APIs with open-data foundation, providing access to OpenStreetMap (OSM) data
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Building a &lt;strong&gt;city discovery app&lt;/strong&gt; → Foursquare or Geoapify
&lt;/li&gt;
&lt;li&gt;Building a &lt;strong&gt;delivery platform&lt;/strong&gt; → HERE or TomTom
&lt;/li&gt;
&lt;li&gt;Building an &lt;strong&gt;infrastructure or utility app (electricity, supply, field services)&lt;/strong&gt; → Geoapify, TomTom, or HERE
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  5. Think long-term
&lt;/h3&gt;

&lt;p&gt;Switching providers later can be costly.&lt;/p&gt;

&lt;p&gt;Consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;scaling costs
&lt;/li&gt;
&lt;li&gt;API limits
&lt;/li&gt;
&lt;li&gt;vendor lock-in
&lt;/li&gt;
&lt;li&gt;data portability
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Summary
&lt;/h3&gt;

&lt;p&gt;There is no single “best” API — only the best fit for your case.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Choose &lt;strong&gt;Google or Foursquare&lt;/strong&gt; for rich place content
&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;HERE or TomTom&lt;/strong&gt; for routing and mobility
&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;Geoapify&lt;/strong&gt; for flexibility, open data, and cost efficiency
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 The right choice comes down to balancing &lt;strong&gt;features, budget, and licensing constraints&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>api</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
