A geocoding API turns an address into map coordinates, and coordinates back into an address. Most business software needs this sooner or later: checkout forms that should catch a wrong address before the parcel leaves, store locators, delivery planning, CRM maps, and fraud checks that compare a customer's IP location with the billing country. My Geocode does all of it through one plain HTTPS API. That covers forward and reverse geocoding, address autocomplete, IPv4 and IPv6 lookups, time zones, elevation and postal codes, with 2,500 free requests a day. It is a partner of RS Computers and many of our customers use it, so we tested every endpoint for this guide.
Key facts, checked on 9 October 2026:
- My Geocode answers simple GET requests with JSON and needs nothing installed. Anonymous use works without a key, up to 2,500 requests a day (My Geocode docs).
- Above the free allowance, a request costs €0.0001, which is €0.10 per 1,000. An Unlimited key costs €50 a month. Prepaid credit doesn't expire (My Geocode pricing).
- For comparison, Google's Geocoding API gives 10,000 free requests a month, then charges $5.00 per 1,000 in its first tier (Google Maps Platform pricing, updated 7 October 2026).
- 17 drop-in hosts copy the request and response formats of Google Maps, Bing Maps, HERE, Mapbox, Nominatim, OpenCage, ip-api, ipinfo and others. Switching often means changing only the hostname (compatibility list).
- Every result carries a
precisionfield, from house down to country, so your code knows how much to trust it. Coverage is listed for 252 countries and territories.
Eight reasons companies end up needing geocoding
Nobody wakes up wanting a geocoding API. They want fewer returned parcels, a working store finder or a fraud rule, and discover that each one needs location data. These are the jobs we see most often among our customers:
- Clean addresses at checkout. Address autocomplete suggests real streets while the customer types. That means fewer typos, fewer failed deliveries and less time on the phone with couriers.
- Store and branch locators. Geocode every shop once, then geocode the visitor's postcode or address and sort branches by distance.
- Delivery zones and pricing. Coordinates let you decide in code whether an address is inside your delivery area, or how far it is from the warehouse.
- CRM and sales maps. A list of 10,000 customer addresses becomes points on a map, so sales territories and route days can be planned.
- Fraud and risk checks. An IP lookup gives the country, network owner and flags such as data centre or VPN. An order whose IP is far from its billing country can be held for review.
- Local content. The visitor's IP country can preselect language, currency or the nearest office without asking.
- Scheduling across time zones. A time zone lookup gives the IANA zone name, the UTC offset and daylight saving status for any point. Booking systems, call centres and reminder emails get the local time right.
- Terrain and site planning. Elevation answers questions for solar installers, telecom planners and outdoor apps, up to 100 points per call.
What we got back: a tour of the API with real answers
Every request below was run on 9 October 2026 without a key, from an ordinary terminal. You can paste them into a terminal on any Linux server, Mac or Windows PC with curl. pretty=1 makes the JSON readable.
Address to coordinates (forward geocoding)
# on any computer with curl
curl "https://api.mygeocode.com/v1/forward?q=Nieuwe+Hemweg+26,+Amsterdam&limit=1&pretty=1"
The answer named Nieuwe Hemweg 26, 1013 CX Amsterdam, The Netherlands at latitude 52.395256, longitude 4.863544, with "precision": "house" and a confidence of 0.89. It added the postcode we didn't send, and extra codes such as a Plus Code and a geohash. The data centre at that address is where our Amsterdam network sits.
Coordinates to address (reverse geocoding)
# on any computer with curl
curl "https://api.mygeocode.com/v1/reverse?lat=42.6629&lon=21.1655&pretty=1"
For a point in the centre of Prishtina it returned Pristina, Kosovo, with "precision": "city" and the distance to the matched place, 1,098 metres. City precision is honest here: for that point, the API didn't claim to know the street.
Address suggestions while typing (autocomplete)
# on any computer with curl
curl "https://api.mygeocode.com/v1/autocomplete?q=Nieuwe+Hemw&pretty=1"
After eleven typed characters the suggestion was Nieuwe Hemweg, The Netherlands, with coordinates. This is the request a checkout form sends on each keystroke. Wait about 300 milliseconds after the last key before sending, so a fast typist doesn't spend twenty requests on one street name.
Where is this IP address? (IPv4 and IPv6 lookup)
# on any computer with curl
curl "https://api.mygeocode.com/v1/ipv4?ip=193.0.6.139&pretty=1"
For an address of the RIPE NCC, the registry for European IP space, it returned Amsterdam, the Netherlands, the network AS3333 and its name, the announced prefix 193.0.0.0/21 and "is_datacenter": true. It also gave a threat section with blocklist status. The /v1/ipv6 endpoint does the same for IPv6, and for one of our own Amsterdam IPv6 addresses it returned the right country and the announced /40 prefix. Leave out the ip parameter and the API looks up the address the request came from.
What time is it there? (time zone lookup)
# on any computer with curl
curl "https://api.mygeocode.com/v1/timezone?lat=53.3498&lon=-6.2603&pretty=1"
For Dublin it returned Europe/Dublin, UTC+01:00 with daylight saving on, the current local time, the Windows time zone name GMT Standard Time, and the date of the next clock change. That last field is what reminder systems get wrong twice a year.
How high is it? (elevation)
# on any computer with curl
curl -X POST -H "Content-Type: application/json" \
-d '{"locations":[{"lat":52.3953,"lon":4.8635},{"lat":53.3498,"lon":-6.2603},{"lat":42.6629,"lon":21.1655}]}' \
"https://api.mygeocode.com/v1/elevation"
One call answered for all three of our cities: Amsterdam 1 metre, Dublin 11 metres and Prishtina 599 metres above sea level, each with the grid resolution of the terrain model (about 464 metres).
Postal codes
# on any computer with curl
curl "https://api.mygeocode.com/v1/postcode?code=10000&pretty=1"
The code 10000 exists in several countries, and the API returned all of them: Troyes in France, a district of Mexico City, a town in South Korea and more. Add country=FR when you know the country. Coverage differs between countries; for a Kosovo postcode we got an empty list, so check the coverage page for the countries you serve.
Switching from Google Maps or another provider
The feature that saves the most work is the drop-in hosts. My Geocode runs copies of other providers' APIs on its own hostnames, with the same paths, parameters and response format. For Google, maps.googleapis.com becomes gapi.mygeocode.com:
# on any computer with curl
curl "https://gapi.mygeocode.com/maps/api/geocode/json?address=Dam+Square,+Amsterdam"
The answer came back in Google's own format, with address_components, formatted_address and geometry.location (52.3729318, 4.8933621, "location_type": "ROOFTOP"). Code written for Google's Geocoding API reads it without changes. The same works for IP lookups: ipapi.mygeocode.com/json/193.0.6.139 answered in ip-api.com's format. The full list of 17 hosts, plus loaders for the Google Maps JavaScript API, Bing Maps V8, Leaflet and MapLibre, is on the compatibility page.
What it costs at real volumes
| Requests per month | My Geocode | Google Geocoding API |
|---|---|---|
| 30,000 (1,000 a day) | €0, inside the 2,500 free requests a day | $100 (10,000 free, 20,000 at $5 per 1,000) |
| 100,000 | About €2.50 (75,000 free in a 30-day month, 25,000 at €0.0001) | $450 (10,000 free, 90,000 at $5 per 1,000) |
| Any volume, flat | €50 a month with an Unlimited key | No flat plan; $4.00 per 1,000 from 100,001, falling to $0.38 above 5 million |
The My Geocode figures assume requests spread evenly over the days, because the free allowance is daily. Google's figures use its first pricing tier, which runs to 100,000 requests a month; both price lists are linked above. My Geocode's terms allow caching and storing results, as long as you don't resell the raw data as a geocoding service of your own, so every address you have looked up once is free from then on.
Geocode a whole customer list, with a cache
A common first job is adding coordinates to an existing spreadsheet of customers or branches. This script reads a CSV file, asks the API once per address, and keeps every answer in a small SQLite database. Run it again after adding rows, and it only asks about the new addresses. It needs Python 3 and nothing else. Save your list as addresses.csv with a header line customer,address, then save this as geocode_csv.py:
#!/usr/bin/env python3
"""Add coordinates to a CSV of addresses with the My Geocode API, caching every answer in SQLite."""
import csv
import json
import os
import sqlite3
import sys
import time
import urllib.parse
import urllib.request
API = "https://api.mygeocode.com/v1/forward"
KEY = os.environ.get("MYGEOCODE_KEY", "") # optional: without a key you get the anonymous daily allowance
db = sqlite3.connect("geocache.sqlite")
db.execute("CREATE TABLE IF NOT EXISTS cache (address TEXT PRIMARY KEY, answer TEXT)")
def geocode(address):
row = db.execute("SELECT answer FROM cache WHERE address = ?", (address,)).fetchone()
if row:
return json.loads(row[0])
url = API + "?" + urllib.parse.urlencode({"q": address, "limit": 1})
headers = {"User-Agent": "geocode-csv/1.0 (you@example.com)"}
if KEY:
headers["X-API-Key"] = KEY
req = urllib.request.Request(url, headers=headers)
answer = json.load(urllib.request.urlopen(req, timeout=20))
db.execute("INSERT INTO cache VALUES (?, ?)", (address, json.dumps(answer)))
db.commit()
time.sleep(0.2) # be gentle with the API
return answer
with open(sys.argv[1], newline="", encoding="utf-8") as src, open(sys.argv[2], "w", newline="", encoding="utf-8") as dst:
reader = csv.DictReader(src)
writer = csv.DictWriter(dst, fieldnames=reader.fieldnames + ["lat", "lon", "precision", "formatted"])
writer.writeheader()
for row in reader:
results = geocode(row["address"]).get("results") or [{}]
best = results[0]
row.update(lat=best.get("lat"), lon=best.get("lon"), precision=best.get("precision"), formatted=best.get("formatted"))
writer.writerow(row)
print(f'{row["customer"]:15} {best.get("precision") or "not found":8} {best.get("formatted") or ""}')
# in the folder with both files
python3 geocode_csv.py addresses.csv geocoded.csv
Our test list had four rows, and the output taught two lessons:
| Address we sent | Precision | What came back |
|---|---|---|
| Nieuwe Hemweg 26, Amsterdam | house | Nieuwe Hemweg 26, 1013 CX Amsterdam, The Netherlands |
| Grafton Street 1, Dublin | house | Provost's House, 1 Grafton Street, Dublin 2 |
| Sheshi Nëna Terezë, Prishtina | city | Pristina, Kosovo |
| Nowhere Street 99, Atlantis | city | Atlantis, Western Cape, South Africa |
The first run took 3.6 seconds; the second took 0.15 seconds, all from the cache. The first lesson is in the last row: our made-up address matched a real town called Atlantis in South Africa. Always read precision before you trust a result. A delivery app should accept house and ask the customer again for anything coarser. The second lesson is the User-Agent line. Without it, Python's default user agent got 403 Forbidden from the API's network protection, so give your scripts a name.
Why run this on a VPS
The API runs on My Geocode's servers, but the code that calls it has to live somewhere, and a small server is the natural place:
- A fixed IP for your key. A pay-as-you-go key serves two IP addresses per rolling 24 hours and an Unlimited key three (rate limit docs). A server's address never changes; office and home connections do.
- Batch jobs on a timer. Geocoding new CRM records every night, refreshing IP data or checking orders runs from cron without anyone's laptop being on.
- Your cache, your database. Cached results in SQLite, PostgreSQL or Redis on the same server answer in microseconds and save requests. Our guide to databases on a VPS covers the setup.
- Close to your users. Our servers in Amsterdam, Dublin and Prishtina keep the app, its cache and its customer data in Europe.
A store locator or checkout backend with a cache fits easily on a VPS Micro (2 vCPU, 2 GB). Nightly batch jobs over hundreds of thousands of records, or an app that also renders map tiles, are more comfortable on VPS Mini or VDS Small. If you build with automation tools, the same API calls work from an HTTP Request node in n8n on your own server.
Good habits with any geocoding API
- Send the API key in the
X-API-Keyheader, not in the URL, because query strings end up in logs. My Geocode's docs recommend the same. - Cache every answer; addresses rarely move.
- Watch the quota headers. Each response carries
X-Quota-LimitandX-Quota-Used; ours showed 2,500 and counted up with each request. Without credit, requests above the limit get HTTP 402 until midnight UTC. - Validate input before you send it: an empty address costs a request and returns nothing useful.
- Retry with a pause on 429 and 503 answers rather than hammering the API.
Frequently asked questions
What is a geocoding API?
A geocoding API converts an address or place name into latitude and longitude (forward geocoding), and coordinates back into an address (reverse geocoding). Businesses use it for address checks, store locators, delivery zones and maps.
Is My Geocode free?
Each account, and each anonymous address, gets 2,500 free requests a day. Beyond that, requests cost €0.0001 each from prepaid credit that doesn't expire, or you can buy an Unlimited key for €50 a month.
Can I replace the Google Maps Geocoding API without rewriting my code?
Often, yes. My Geocode's host gapi.mygeocode.com answers Google Geocoding requests in Google's response format, so you change the hostname and keep your parsing code. In our test, a Google-style request for Dam Square in Amsterdam returned a standard Google answer with ROOFTOP precision.
Can I store geocoding results in my own database?
My Geocode's terms allow caching and storing results. The one restriction is reselling the raw data as a geocoding service of your own. Storing results is also the easiest way to save requests and money.
How accurate is IP geolocation?
IP lookups are reliable for the country and the network owner, and less precise for the city, because many networks register addresses at a central office. Use them for risk scores and defaults, not as proof of where a person is.
Why did my script get a 403 error?
In our test, requests with Python's default user agent were refused with 403 Forbidden by the API's network protection. Setting a descriptive User-Agent header fixed it at once.
Start with the free tier, then size the server
Try the requests in this guide, or the live demo, before you write any code. Then create a free My Geocode key for your app. When you need a home for the app, its cache and its nightly jobs, pick a plan on our VPS page or message us on Telegram. Many of our customers already run exactly this pairing.