Free Geocoding APIs Without an API Key in 2026
· geocoding
Nominatim, plus the surprising fallback options when OSM rate-limits you. Real numbers.
Nominatim (OpenStreetMap) is the strongest free geocoding API without a key in 2026: forward and reverse geocoding, global coverage, no signup required, 1 req/sec rate limit. For most single-developer projects and low-traffic applications, it's all you need.
Google Maps went paid in 2018 (no longer free beyond a $200/month credit). Here's what actually works without spending money.
Nominatim: What You Need to Know
Nominatim powers the search bar on openstreetmap.org and processes millions of queries per day. The public API endpoint is `https://nominatim.openstreetmap.org`. The two endpoints you'll use most:
`/search?q=Berlin&format=json` — forward geocoding: address/place name to coordinates
`/reverse?lat=52.5&lon=13.4&format=json` — reverse geocoding: coordinates to address
The single most important thing about using Nominatim: you MUST set a User-Agent header. Without it, your requests will be blocked. The OSM usage policy requires this so they can identify abusive clients. A User-Agent like `MyApp/1.0 (contact@example.com)` is sufficient.
The rate limit is approximately 1 request per second. This isn't a hard cap in the HTTP sense — there's no token bucket. It's enforced by IP throttling: exceed 1 req/sec consistently and your IP gets rate-limited or banned. In practice, for a user-facing app where geocoding happens on user action (address input), you'll never come close.
Where Nominatim Falls Short
The quality gap between Nominatim and paid geocoders is most visible for partial addresses, non-English queries, and business name searches. 'Empire State Building' returns good results; 'the pizza place on 5th' does not.
Batch geocoding (converting a CSV of 10,000 addresses) is explicitly prohibited on the public instance — you'd need to run your own Nominatim installation or use a paid API. The public instance is intended for interactive use, not bulk processing.
Autocomplete (address suggestions as you type) isn't directly supported by the standard Nominatim search endpoint — it's designed for complete queries, not partial ones. There are workarounds (using the `/search` endpoint with a trailing space and `limit=5`), but it's not the same as a dedicated autocomplete API.
Other No-Key Geocoding APIs
BigDataCloud Reverse Geocoding (unlimited, no key for client-side endpoints) is worth knowing for the reverse-only case. It's designed for client-side use (browser) but works server-side too. The response includes locality, city, country code, and postcode.
ip-api.com (45 req/min, HTTP only, no key) handles IP-to-location lookups — not address geocoding, but useful if you need to infer a visitor's country/city from their IP address. Note: the free tier is HTTP-only; HTTPS requires a paid plan.
IPinfo (50,000 req/month, no key for basic) is the better IP geolocation option if you need HTTPS and a higher monthly limit.
For anything beyond Nominatim's 1 req/sec: OpenCage (2,500 calls/day, key required, no credit card) is the most natural step up. See /opencage and /nominatim for live status, and /category/geocoding for the full ranked list.
Practical Integration: Bash and Python
The minimum viable Nominatim request in curl:
curl -H "User-Agent: MyApp/1.0 (you@example.com)" \
"https://nominatim.openstreetmap.org/search?q=Eiffel+Tower+Paris&format=json&limit=1" In Python, using the `requests` library:
import requests
import time
HEADERS = {"User-Agent": "MyApp/1.0 (you@example.com)"}
def geocode(query: str) -> dict | None:
resp = requests.get(
"https://nominatim.openstreetmap.org/search",
params={"q": query, "format": "json", "limit": 1},
headers=HEADERS,
timeout=10
)
resp.raise_for_status()
results = resp.json()
return results[0] if results else None
# Rate limit: wait 1 second between calls
result = geocode("Eiffel Tower, Paris")
time.sleep(1)
next_result = geocode("Big Ben, London")